PHP脚本可以阻止整个服务器吗?

时间:2013-07-13 10:08:14

标签: php nginx

我有一个简单的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请求永远失败。阻塞问题是随机发生的。

1 个答案:

答案 0 :(得分:0)

脚本不是在不常见的时间开始,但是您的登录信息低于此代码

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");

因此,在执行这些指令后,您的日志条目就会发生。如果这些指令需要更长的时间来执行,那么您将看到延迟的条目。当您的服务器管理员说它阻止服务器时,他必须谈论磁盘i / o。因为你的阅读和写作可能是一个大文件。将您的启动登录条目放在这些命令之上。