我在服务器上使用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()中的脚本进行修改。有关更多信息,请参阅下面的评论。
答案 0 :(得分:5)
让我们将评论更新为答案:传递给命令行的所有变量参数都应使用escapeshellarg
进行转义
答案 1 :(得分:1)
如果命令行太长,您可以使用每个参数的简短版本。例如,而不是:
--page-size 'Letter' --orientation 'Portrait'
你可以使用
-s 'Letter' --O 'Portrait'