exec()在PHP中使用long命令的问题

时间:2011-08-03 14:32:29

标签: php linux centos wkhtmltopdf

我在服务器上使用wkhtmltopdf将HTML文档传输到PDF。当我使用短网址时,它的效果非常好:

exec("/opt/wkhtmltopdf/bin/wkhtmltopdf --page-size 'Letter' --orientation 'Portrait' 'http://myurl.com/myPHPfile.php?id=12' '/tmp/myfile.pdf'")

当我使用长命令时会出现问题,例如:

exec("/opt/wkhtmltopdf/bin/wkhtmltopdf --title 'The name of my file' --page-size 'Letter' --orientation 'Portrait' 'http://myurl.com/myPHPfile.php?phpsid=d8dbfbb91c0748d91426441e67aaf2b6&id=436' '/tmp/The name of my file.pdf'")

请注意,当我直接从Putty运行这个长命令时,它可以很好地工作。

问题在于,当我使用exec(或shell_exec()或system()或passthru())时,页面将永远加载,我的网络服务器不再响应。我必须自己关闭Putty(ps -x然后杀死PID)的过程。

请注意,如果我删除了?phpsid =它运行良好,这就是为什么我说只有长命令才会出现问题。如果我删除?phpsid = d8dbfbb91c0748d91426441e67aaf2b6并将其替换为?anything = ImAmAVeryLongStringThatDoNothing它也不起作用。

我在使用WHM / cPanel的CentOS 5上。 在此先感谢您的帮助!

修改

我试过urlencode(),不行。
我试过escapeshellarg(),命令正确通过但不起作用。
我试图使用短参数,命令正确传递但不起作用。

编辑2:

使用exec(),system()或passthru()时是否存在字符串长度限制?

编辑3:

最后,感谢Wrikken,问题是我在URL中传递了session_id(),然后我在exec()中重新使用它。我不得不添加session_write_close();在我的exec()之前,所以PHP解锁当前会话,使其可以通过exec()中的脚本进行修改。有关更多信息,请参阅下面的评论。

2 个答案:

答案 0 :(得分:5)

让我们将评论更新为答案:传递给命令行的所有变量参数都应使用escapeshellarg进行转义

答案 1 :(得分:1)

如果命令行太长,您可以使用每个参数的简短版本。例如,而不是:

--page-size 'Letter' --orientation 'Portrait' 

你可以使用

-s 'Letter' --O 'Portrait'