我有一个简单的 PHP 脚本,每分钟由一个 cron 作业调用。该脚本使用 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请求需要永远并且失败。阻塞问题随机发生。