我正在浏览器上运行一些 php 安装脚本,它已经运行了很长时间。有没有办法检查它是否仍在服务器上运行或已超时?浏览器仍然显示加载旋转器,但我认为这不是一个可靠的进度指示器。
(Linux 下的 Apache 网络服务器)
答案1
mod_status/Server-Status 应该可以解决问题。
<Location /server-status>
SetHandler server-status
</Location>
取消注释 httpd.conf 中的上述几行,
然后点击yoursite-or-ipaddress/server-status。
您应该看到 apache 正在处理的所有请求的列表,以及每个请求的基本状态。
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
113-812 - 0/0/496 . 6.21 3025 2589 0.0 0.00 32.97 127.127.127.127 green.org GET /images/Image/inside_repeat.png HTTP/1.1
答案2
如果我没记错的话,浏览器会一直运行,直到脚本因超时、内存耗尽或任何其他会在服务器上终止脚本的方法而完成。我有一些数据处理脚本,运行时间约为 30 分钟。据我所知,没有什么会导致浏览器状态冻结,认为脚本在服务器上超时后仍在加载。
如果您仍想监视脚本,我知道的唯一方法是在后台执行脚本,并每隔几秒检查一次进程是否仍在运行。由于 php 不像 Java 那样异步,因此需要一些技巧才能使这样的功能正常工作。
您可能想要在后台执行该脚本:
exec('/path/to/php -f /path/to/script.php > /dev/null 2>&1 & echo $!',$op);
$pid = (int)$op[0];
然后,您可以使用这样的函数来检查进程是否仍在运行。
function isRunning($pid) {
exec("ps $pid", $ProcessState);
return(count($ProcessState) >= 2);
}
然后你会使用
while(isRunning($pid)) {
echo 'Still running...';
sleep(10);
//or something like this
}