Я собираюсь сделать процесс цикла, как:
process.php
который занимает 1000 URL;process.php
работает с этими URL-адресами (до 20 минут);process.php
снова, и я хочу, чтобы он взял следующие (разные) 1000 URL; Как я могу предотвратить получение URL, которые уже находятся в процессе?
Постскриптум
process.php
работает каждые 10 минут
Формат таблицы см. Выше.
+----+------+
| id | url |
+----+------+
| 1 | url1 |
| 2 | url2 |
| 3 | url3 |
| 4 | url4 |
| 5 | url5 |
+----+------+
Существует много подходов к этому требованию «один раз». Выбор часто зависит от:
Вот несколько идей:
Использовать очередь
Вы можете создать очередь, используя Amazon Simple Queuing Service (SQS). Сначала запустите задание, которое извлекает URL-адреса из базы данных и помещает их в сообщение очереди. Затем, process.php
можете прочитать подробности из очереди вместо базы данных.
Во время работы скрипта сообщение SQS невидимый поэтому другие процессы не могут его получить. Когда процесс завершится, он должен удалить сообщение из очереди. Если в середине процесса происходит сбой, невидимое сообщение появляется снова через заданный интервал для повторной обработки.
Очереди являются стандартным способом обработки многих записей. Это позволяет распределять обработку по нескольким приложениям / серверам. Вы даже можете вставлять отдельные URL-адреса в очередь, а не группировать.
Отметить их как обработанные в базе данных
Добавить processed_timestamp
столбец в базу данных. Когда URL обработан, сделайте UPDATE
команда в базе данных, чтобы пометить URL как обработанный. Только при поиске URL SELECT
те, которые имеют не были обработаны.
Запомнить последний обработанный
При получении URL-адресов сохраняйте идентификационный номер «последнего обработанного». Это может быть сохранено в другой таблице базы данных, в кэше, на диске, в файле S3 или в любом другом месте, которое обычно доступно. Затем извлеките это значение, чтобы определить, какие записи необходимо обработать, и обновите его при запуске пакета URL-адресов.
Других решений пока нет …