Поскольку PHP не всегда обеспечивает надежный способ блокировки файлов (это зависит от того, как выполняется сценарий, например CGI, FCGI, серверных модулей и конфигурации), следует использовать некоторую другую среду для блокировки.
PHP-скрипт может, например, вызвать другой интерпретатор PHP в его варианте CLI. Это обеспечило бы уникальный PID, который можно было бы проверить для блокировки. ПИД-код должен быть сохранен в некотором файле блокировки, а затем проверяется на наличие устаревших блокировок, запрашивая, работает ли процесс с использованием ПИД-регулятора.
Возможно, также возможно выполнить все задачи, требующие блокировки внутри сценария оболочки. Сценарии оболочки также предоставляют уникальный PID и освобождают его после выхода.Сценарий оболочки также может использовать уникальное имя файла, которое может использоваться, чтобы проверить, все ли работает.
Также могут использоваться семафоры (http://php.net/manual/de/book.sem.php), которые явно управляются интерпретатором PHP, чтобы отображать время жизни скриптов. Они, кажется, работают достаточно хорошо, однако не так много о том, насколько они надежны в случае преждевременной смерти сценария.
Также имейте в виду, что внешние процессы, запускаемые PHP-скриптом, могут продолжаться, даже если скрипт заканчивается. Например, пользователь прерывает на FCGI релизы passthru
процессы, которые продолжают работать, несмотря на закрытие клиентского соединения. Они могут быть убиты позже, если достаточное количество накоплений или вообще не будет достигнуто. Таким образом, такие внешние процессы также должны блокироваться, что невозможно сделать с помощью семафоров с поддержкой PHP.
Установите флаг какого-либо типа: создайте файл, сохраните флаг в базе данных или используйте ключ Redis или memcached. Просто убедитесь, что вы окончательно закончили его или очистили вручную, если первый скрипт умирает. –
Трудно реализовать надежное «истечение», когда скрипт может работать в течение длительного времени. Если это не удастся, нам нужно подождать неизвестное время, чтобы убедиться, что оно умерло ... – dronus
Это может быть проблемой XY. По какой именно причине вам нужна эта проверка, что PHP-скрипт работает только один раз? Я спрашиваю, потому что есть, вероятно, лучший подход к реальной проблеме, с которой вы сталкиваетесь, что не связано с этим воспринимаемым решением. – Mjh