我有一个通用的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)");
}
在脚本结束时,清除该值。同样,只有从浏览器运行时才会出现此问题。
答案 0 :(得分:0)
您应该使用以下命令为执行限制设置更长的值:
set_time_limit(30*60) // 30 minutes
此外,echo函数可能正常工作,但是响应被发送到浏览器,直到整个脚本结束执行,这是导致您无法看到打印的原因,因为它在执行限制之前被杀死了结束并打印回复。
您可以尝试在
的帮助下部分回应响应ob_start
和
ob_flush
您可以阅读有关ob_functions here
的更多信息