PHP脚本似乎正在执行两次

时间:2013-08-16 18:31:18

标签: php apache

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

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

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

所以我在设置或读取数据库值时添加了回显代码。只有当它被读取时,它才会在设置时回声,但我可以看到每次都存储数据库值。

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

可能发生什么事?服务器是否可以在每个基于浏览器的请求上执行两次脚本?

服务器运行Hive,因此不同的dirs可以有不同的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)");
}

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

1 个答案:

答案 0 :(得分:0)

您应该使用以下命令为执行限制设置更长的值:

set_time_limit(30*60) // 30 minutes

此外,echo函数可能正常工作,但是响应被发送到浏览器,直到整个脚本结束执行,这是导致您无法看到打印的原因,因为它在执行限制之前被杀死了结束并打印回复。

您可以尝试在

的帮助下部分回应响应
ob_start

ob_flush

您可以阅读有关ob_functions here

的更多信息
相关问题