PHP脚本似乎执行了两次


PHP scripts seem to be executing twice

我有一个通用的PHP维护脚本,它设置了一个数据库值,以防止与另一个实例同时运行。通常通过cronjob运行。

我清除了数据库值,并尝试在关闭cronjob的情况下手动运行此脚本。每次从浏览器运行它时,它都会立即终止,说明它已经在运行。

该脚本将作为后台进程运行约30秒,然后自动终止,就像PHP检测到浏览器关闭一样(大约需要15分钟才能完成)。

因此,我添加了在设置或读取数据库值时进行回显的代码。它在设置时从不回显,只有在读取时才回显,但我可以看到每次都存储数据库值。

如果从cron运行,脚本总是按预期完成。

可能发生了什么?服务器是否会对每个基于浏览器的请求执行两次脚本?

服务器运行Hive,所以不同的目录可以有不同的PHP版本。不知道这是否与此有关。

PHP 5.2.17 (default)
PHP 5.3.27 (dir this script is in)
Apache 2.2.25

决定它是否运行的代码简单如下:

$DB = new DbConnector($db_name, $db_user, $db_pass);
if ($DB->queryOne("SELECT COUNT(*) FROM data_vars WHERE name = 'maintenance_running'")) {
    exit('Already running!');
} else {
    $DB->query("INSERT INTO data_vars (name, value) VALUES ('maintenance_running', 1)");
}

在脚本结束时,该值将被清除。同样,只有从浏览器运行时才会出现此问题。

您应该使用为执行限制设置一个更长的值

set_time_limit(30*60) // 30 minutes

此外,echo函数可能正在工作,但当响应被发送到浏览器,直到整个脚本结束执行时,这就是你看不到打印的原因,因为它在结束并打印响应之前就被执行限制杀死了。

您可以尝试在的帮助下部分响应

ob_start

ob_flush

您可以在此处阅读更多关于ob_functions的信息