脚本中断时 Apache Web 服务器的行为

脚本中断时 Apache Web 服务器的行为

我在开发机器 (Windows) 和测试服务器 (Linux) 上设置了 Apache2.0/PHP Web 服务器。我有一个 PHP 脚本,它运行 shell 命令来生成 PDF 文档。例如,

<?php

    //This script is kicked off via the browser,
    //ie. http://localhost/pdf.php

    exec('php generatePDF.php'); 
?>

该文档最多可能需要几分钟才能生成,尽管通常在几秒钟内即可完成。

在我的 Windows 本地主机上,在脚本执行时离开此页面实际上会导致 Apache 挂起。在我的 Linux 测试服务器上,不会发生此问题。

我必须预料到,在脚本完成生成文档之前,用户可能会离开该页面。这对 Apache 来说是个问题吗?

谢谢,布莱恩

答案1

当正在运行的脚本被中断(例如按下 Esc 键)时,它会停止,但前提是set_timeout()条件发生或调用任何输出函数(如print)。PDF 生成将完成,因为它在进行过程中不打印任何内容 :)

这样的脚本应该没有问题,但是你最好将它们移至离线,这样连接就不会占用时间、内存和连接槽(还记得 MaxConnections 吗?:))。

在此过程中 Apache 挂起非常奇怪:听起来像是 Apache 的 Windows 端口中的一个错误。我从未遇到或听说过任何类似“从不在 Apache 环境下生成 PDF”的问题 :))

我唯一的猜测是它pcntl_fork()在某个地方被使用:这个东西确实会导致 Apache 挂起,因为它是多线程的并且 PHP 是一个模块:fork()在这样的环境中不应该制作任何 s。

答案2

如果耗时那么长,您确实应该将脚本移至离线状态。我不知道您具体在做什么,但您可能只想记录需要做的事情,然后运行 ​​cronjob 来实现它。

答案3

我猜测行为上的差异是由于 Win32 httpd 默认使用基于线程的工作程序,而 *nix-es httpd 默认使用基于进程的工作程序。

您说的“导致 Apache 挂起”是指 httpd 不响应任何其他请求吗?您尝试等待了多长时间?

相关内容