2

我有一个通用的 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)");
}

在脚本结束时,该值被清除。同样,此问题仅在从浏览器运行时发生。

4

1 回答 1

0

您应该为执行限制设置更长的值:

set_time_limit(30*60) // 30 minutes

回声功能也可能正在工作,但是由于响应被发送到浏览器直到整个脚本结束执行,这就是您看不到打印的原因,因为它在结束和打印之前被执行限制杀死响应。

您可以尝试在

ob_start

ob_flush

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

于 2013-10-12T08:42:21.933 回答