У меня есть простой PHP-скрипт, который каждую минуту вызывается заданием cron. Скрипт обновляет базу данных с помощью некоторых внешних источников с помощью file_get_contents и работает на сервере Nginx.Может ли скрипт PHP блокировать весь сервер?
Администратор сервера, на котором работает скрипт, говорит, что иногда скрипт блокирует весь сервер. Поэтому я добавил простой механизм ведения журнала, чтобы узнать, как долго работает скрипт. Результат: Runtime обычно 1 секунда. Иногда, когда сценарий извлекает много данных, время выполнения немного длиннее, но не более 20 секунд.
Вот короткая версия сценария:
//Logging
require "db_hweb_functions/KLogger.php";
$log = KLogger::instance(dirname(__FILE__) . "/db_hweb_log", KLogger::DEBUG);
$log->logInfo("++ Cron gestartet ++");
$lockfile = realpath($_SERVER["DOCUMENT_ROOT"]). "/db_hweb_inc/lockFolder";
//Check if script is already running
if(!is_dir($lockfile)) {
// no lock present, so place one
register_shutdown_function('unlock', &$log);
mkdir($lockfile);
require "NotORM/NotORM.php";
//...// require some other files
//MYSQL connect
$dsn = "mysql:dbname=" . $dbName;
$pdo = new PDO($dsn, $user, $pwd);
$db = new NotORM($pdo);
//...// Do something
}
else {
echo "locked";
$log->logInfo("## Cron: end (locked) ##");
}
function unlock(&$log) {
$log->logInfo("## Cron: end ##");
// remove the lock
rmdir(realpath($_SERVER["DOCUMENT_ROOT"]). "/db_hweb_inc/lockFolder");
}
Файл журнала обычно выглядит следующим образом:
2013-07-09 15:18:01 - INFO --> ++ Cron started ++
2013-07-09 15:18:01 - INFO --> ## Cron end ##
2013-07-09 15:19:01 - INFO --> ++ Cron started ++
2013-07-09 15:19:01 - INFO --> ## Cron end ##
2013-07-09 15:20:01 - INFO --> ++ Cron started ++
2013-07-09 15:20:01 - INFO --> ## Cron end ##
Но когда проблема возникает лог-файл выглядит следующим образом:
2013-07-09 15:28:54 - INFO --> ++ Cron started ++
2013-07-09 15:28:54 - INFO --> ## Cron end ##
2013-07-09 15:30:29 - INFO --> ++ Cron started ++
2013-07-09 15:30:29 - INFO --> ## Cron end ##
2013-07-09 15:30:57 - INFO --> ++ Cron started ++
2013-07-09 15:30:57 - INFO --> ## Cron end ##
Время выполнения в порядке, но cronjob выполняет сценарий в необычное время ...
Итак: возможно ли, что этот скрипт блокирует весь сервер? Блокировка означает, что, например, HTTP-запросы берут навсегда и терпят неудачу. Проблема блокировки происходит случайным образом.
Спасибо. Я поставлю код loggin над этими командами. Но первые строки проверяют только если скрипт уже запущен с использованием простого файла txt со строкой «разблокирован» или «заблокирован». Поэтому я не думаю, что эти строки вызывают проблему. –
если есть жесткий диск io готов, файл может занять некоторое время. может быть какой-то другой процесс, тяжелый на диске. всегда лучше использовать каталог для вашей блокировки. У вашей текущей установки блокировки слишком много накладных расходов. 'is_dir ($ lockfile)' // проверить, существует ли блокировка 'mkdir ($ lockfile)' // создать блокировку 'unlick ($ lockfile)' // удалить блокировку – DevZer0
Спасибо! Я изменил это. Но я не думаю, что это вызвало проблемы. Поскольку основная задача просто использует базу данных MySQL с NOTORM, проблем не должно быть. Есть ли вероятность того, что сценарий вызывает какие-либо проблемы? Даже если время выполнения в порядке? Я думаю, что проблемы не вызваны этим скриптом ... –