2

我在我的服务器上使用 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=ImAAmAVeryLongStringThatDoNothing 它也不起作用。

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

编辑:

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

编辑2:

使用 exec()、system() 或 passthru() 时是否有字符串长度限制?

编辑3:

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

4

2 回答 2

5

Let's update the comment to an answer: any and all variable arguments passed to the command line should be escaped with escapeshellarg

于 2011-08-03T14:45:13.067 回答
1

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

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

您可以使用

-s 'Letter' --O 'Portrait' 
于 2011-08-03T14:51:13.983 回答