0

cron ジョブによって毎分呼び出される単純な PHP スクリプトがあります。このスクリプトは、file_get_contents を使用していくつかの外部ソースでデータベースを更新し、Nginx サーバー上で実行されています。

スクリプトが実行されているサーバーの管理者は、スクリプトがサーバー全体をブロックすることがあると言っています。そこで、スクリプトの実行時間を確認するための簡単なログ メカニズムを追加しました。結果: 実行時間は通常 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 リクエストが永遠にかかって失敗することを意味します。ブロッキングの問題はランダムに発生します。

4

1 に答える 1