我正在使用PHP在脚本上运行exec(),如下所示:
exec("pdftk xx.pdf fill_form xx.fdf output xx.pdf flatten");
最奇怪的是,当我登录ssh并手动输入命令时 - 它运行正常!它输出224k pdf。但是当我使用exec()命令时,只有脚本的前36k出现。 (我检查过 - 好文件的第一个36k与坏文件相同)
没有什么奇怪的东西 - 这与exec()工作正常,直到我向fdf文件添加了一些更多的变量,使其更长。由于新数据,我认为这是fdf的问题 - 但为什么这个过程可以从ssh运行良好?
更新:我也尝试运行php -f test.php(其中只有一个exec行)。正确输出整个文件。但即使我去http://mydomain.com/test.php我也只能得到文件的一部分。
脚本没有超时,因为我在exec()命令之后使其回显,并且工作正常。
它不能是权限问题(ssh以root身份登录),因为它仍然能够写入文件
同样 - 当我尝试从exec或passthru获得返回或退出值时,我什么也得不到。返回值始终为0.
更新:在apache错误日志中,我正在
[Fri Sep 17 20:00:57 2010] [错误]未处理的Java异常: [Fri Sep 17 20:00:57 2010] [错误] java.lang.OutOfMemoryError [Fri Sep 17 20:00:57 2010] [错误]<>
我将php_ini从32M改为64M - 仍然得到它。考虑到这些都是微小的文件,我不认为就是这样。但PHP能够限制像这样的子进程的内存吗?那个地方有另一种设置吗?
帮助!
答案 0 :(得分:1)
事实证明这是一个记忆问题。 Apache在主conf文件中设置了RLimitMEM,我现在刚刚禁用它。现在它就像一个魅力。虽然设置为大约89MB,并且由于这些文件都在meg以下,我无法看到这个应用程序将如何使用这么多内存。
答案 1 :(得分:0)
我假设您正在运行共享的Web主机,在这种情况下您应该注意:许多主机使用自定义的php.ini文件来限制exec()的作用(例如阻止它被使用)或者可能有一些系统就地阻止exec生成的进程运行超过几秒钟,这就是为什么它可以在shell中正常工作,但不能在PHP的上下文中工作。
答案 2 :(得分:0)
更新:在apache错误日志中,我是 获得
[Fri Sep 17 20:00:57 2010] [错误] 未处理的Java异常:[9月17日星期五 2010年20:00:57] [错误] java.lang.OutOfMemoryError [9月17日星期五 2010年20:00:57] [错误]<>
我不明白为什么apache会出现java错误?你能和我们详细说明吗?我觉得很奇怪。
我将php_ini从32M更改为64M - 还是得到它。考虑到这些都是微小的文件,我不认为这是 它。但是PHP能够限制 像这样的儿童过程的记忆? 是否有另一种设置 某处?
我也有一种感觉,这可能需要对你的应用程序使用的内存做些什么,因为它调用了pdftk,这可能会让你超过内存限制? pdftk调用在峰值时使用了多少内存?也许你应该更多地提高记忆力?
你做过这样的事吗? http://www.wallpaperama.com/forums/how-to-change-memory-limit-php-apache-server-t53.html更新:我也试过运行php -f test.php(只有一个exec 在它的线)。输出整个 文件正确。但即使我去 http://mydomain.com/test.php我只 获取文件的一部分。
我有一个解决方案,在高负载下也不会杀死你的网络服务器(VPS)。从站点(Web服务器端),您应该使用redis php客户端库将其推送到阻止列表(predis),因为它支持所有必需的redis命令(BLPOP/LPUSH)。从一直运行的PHP守护进程(php -f),您应该从阻止列表中弹出并执行命令(pdftk)。