我正在使用 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 错误日志中,我得到

[2010 年 9 月 17 日星期五 20:00:57] [错误] 未处理的 Java 异常:星期五9月17日20:00:57 2010] [错误

我将 php_ini 从 32M 更改为 64M - 仍然明白。考虑到这些都是小文件,我不认为就是这样。但是 PHP 能够像这样限制子进程的内存吗?某处还有其他设置吗?

帮助!

有帮助吗?

解决方案

事实证明,这是一个记忆问题。 Apache在主conf文件中设置了RimilitMem,我暂时刚刚禁用。现在它就像魅力一样。尽管设置为约89MB,并且由于这些文件位于MEG下,但我看不出该应用程序将如何使用那么多内存。

其他提示

我假设您正在运行共享网络主机,在这种情况下您应该注意:许多主机使用自定义的 php.ini 文件来限制 exec() 的功能(例如阻止它被使用),或者可能存在某种系统来阻止 exec 生成的进程占用多个进程运行需要几秒钟,这就是为什么它可以在 shell 中正常工作,但不能在 PHP 上下文中工作。

更新:在Apache错误日志中,我得到了

星期五9月17日20:00:57 2010] [错误]未经处理的Java例外:[FRI SEP 17 20:00:57 2010] [错误] ] <>

我不明白为什么Apache给出Java错误?您能与我们一起详细说明吗?我觉得很奇怪。

我将php_ini从32m更改为64m - 仍然得到它。考虑到这些都是微小的文件,我不认为就是这样。但是,PHP能够限制这样的子过程的记忆吗?还有其他设置吗?

我还感觉到这可能必须对您的应用程序使用的内存来做些事情,因为它正在调用PDFTK,这可能会使您超越内存限制? PDFTK呼叫在峰值使用多少内存?也许您应该更多地提高记忆力?

你做这样的事情吗? http://www.wallpaperama.com/forums/how-to-change-memory-limit-php-php-apache-server-server-t53.html

更新:另外,我尝试运行PHP -F test.php(其中只有一个EXEC行)。该正确输出整个文件。但是即使我去 http://mydomain.com/test.php 我只得到文件的一部分。

我为您提供了一个解决方案,该解决方案也不会在高负载上杀死您的Web服务器(VPS)。在网站(WebServer端),您应该将其推入封锁列表(Redis) 使用 predis PHP客户库库,因为它支持所有必要的redis命令(blpop/lpush)。从始终运行的PHP Deamon(PHP -F)中,您应该从封锁列表中弹出并执行命令(PDFTK)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top