2013-07-13 1 views
0

У меня есть простой 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-запросы берут навсегда и терпят неудачу. Проблема блокировки происходит случайным образом.

ответ

0

Сценарий начинается не в unusuall раз, но ваш иметь свой Логгина ниже этого кода

if(file_get_contents("db_hweb_inc/lock.txt") == "unlocked") { 
    // no lock present, so place one 
    register_shutdown_function('unlock'); 
    file_put_contents("db_hweb_inc/lock.txt", "locked"); 

Так что ваша запись журнала происходит после того, как эти команды выполняются. если эти инструкции занимают больше времени для выполнения, тогда вы увидите задержанные записи. Когда ваш администратор сервера говорит, что он блокирует сервер, он должен говорить о дисках ввода/вывода. потому что вы читаете и пишете то, что может быть большим файлом. Поместите начальную запись loggin над этими командами.

+0

Спасибо. Я поставлю код loggin над этими командами. Но первые строки проверяют только если скрипт уже запущен с использованием простого файла txt со строкой «разблокирован» или «заблокирован». Поэтому я не думаю, что эти строки вызывают проблему. –

+0

если есть жесткий диск io готов, файл может занять некоторое время. может быть какой-то другой процесс, тяжелый на диске. всегда лучше использовать каталог для вашей блокировки. У вашей текущей установки блокировки слишком много накладных расходов. 'is_dir ($ lockfile)' // проверить, существует ли блокировка 'mkdir ($ lockfile)' // создать блокировку 'unlick ($ lockfile)' // удалить блокировку – DevZer0

+0

Спасибо! Я изменил это. Но я не думаю, что это вызвало проблемы. Поскольку основная задача просто использует базу данных MySQL с NOTORM, проблем не должно быть. Есть ли вероятность того, что сценарий вызывает какие-либо проблемы? Даже если время выполнения в порядке? Я думаю, что проблемы не вызваны этим скриптом ... –

Смежные вопросы