我在开发机器 (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 不响应任何其他请求吗?您尝试等待了多长时间?