Я использую crontab для выполнения сценария php, который извлекает данные и записывает их в базу данных. Моя запись в crontab выглядит так:
* * * * * php /path/to/file/fileName1.php
* * * * * php /path/to/file/fileName2.php
... you get the point
Я бы хотел использовать flock, чтобы предотвратить запуск сценария в случае, если предыдущий вызов не завершился.
Каждый сценарий записывает в разные таблицы в базе данных и Я не могу начать запись в таблицу, пока не завершится выполнение предыдущего вызова. Увеличение продолжительности между вызовами, например: * / 2 * * * * php /path/to/file/fileName1.php
, просто не будет связано с ограничениями бизнеса.
Вы можете заблокировать сам файл с помощью cron, и это должно работать нормально (при условии, что ничто другое не пытается заблокировать файл). Затем проверьте, есть ли такая же блокировка во втором скрипте.
Обратите внимание, что в этой конфигурации параллельное выполнение обычно завершается ошибкой с аномальным кодом выхода. Вы можете использовать аргумент -E0
, чтобы он всегда возвращал успешный код выхода.
* * * * * flock -nx /path/to/file/fileName1.php -c "php /path/to/file/fileName1.php"
* * * * * flock -nx /path/to/file/fileName1.php -c "php /path/to/file/fileName2.php"
Также обратите внимание, что это не защищает от ненормального поведения PHP (скажем, он разворачивает управление ouf и никогда не завершает работу), поэтому вы можете учесть это в самом PHP или использовать команду timeout
, чтобы дать ему максимальный период времени выполнения до уничтожения.
Будьте осторожны, это также предотвращает одновременный запуск fileName1.php
!
Если вам нужна схема, в которой вы разрешаете несколько параллельных fileName1.php
, но только один экземпляр fileName2.php
, вам потребуется более сложный механизм синхронизации, чтобы учесть это.