我在我的服务器上使用wkhtmltopdf将HTML文档传输到PDF.当我使用短URL时它非常有效:
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()中的脚本进行修改.有关更多信息,请参阅下面的评论.
让我们将注释更新为答案:传递给命令行的任何和所有变量参数都应该被转义escapeshellarg