我在我的开发机器(windows)和我的testing服务器(linux)上安装了Apache2.0 / PHP web服务器。 我有一个运行shell命令来生成PDF文档的PHP脚本。 例如,
<?php //This script is kicked off via the browser, //ie. http://localhost/pdf.php exec('php generatePDF.php'); ?>
该文件可能需要几分钟时间才能生成,但通常在几秒钟内完成。
在我的Windows本地主机上,在执行脚本的时候从这个页面导航,实际上会导致Apache挂起。 在我的Linuxtesting服务器上,这个问题不会发生。
我必须期望用户可以在脚本完成生成文档之前离开页面。 这对Apache有问题吗?
谢谢,Brian
当一个正在运行的脚本被中断(例如Esc被按下)时,它将被停止,但是只有当set_timeout()条件发生或者任何输出函数被调用(如print )的时候。 PDF生成将完成,因为它在进行中时不打印任何东西:)
这样的脚本应该没有问题,但是最好将它们移动到离线状态,这样连接就不需要时间,内存和连接槽(MaxConnections,请记住?:))。
在这个过程中,Apache挂起非常奇怪:听起来像Apache的Windows端口中的一个错误。 我从来没有遇到或听说过任何问题,如“在Apache环境下从不生成PDF”:))
我唯一的猜测是在某处使用了pcntl_fork() :这个东西可能会导致Apache挂起,因为它是multithreading的,而PHP是一个模块:在这样的环境中不应该创buildfork() 。
如果需要很长时间,您应该将脚本移动到离线状态。 我不知道你在做什么的细节,但是你可能只想logging需要做什么,然后运行一个cronjob来实现它。
我猜这种行为的差别是由于默认情况下Win32 httpd使用基于线程的worker,而在* nix-es httpd默认情况下使用基于进程的worker。
当你说“导致Apache挂起”你的意思是httpd不响应任何其他请求? 你等了多久?