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())を使用すると、ページが永久に読み込まれ続け、Webサーバーが応答しなくなることです。Puttyからプロセスを閉じる必要があります(ps -x、次にPIDを強制終了します)。

?phpsid =を削除するとうまく機能することに注意してください。これが、問題が長いコマンドでのみ発生すると言っている理由です。?phpsid = d8dbfbb91c0748d91426441e67aaf2b6を削除し、それを?anything = ImAmAVeryLongStringThatDoNothingに置き換えると、それも機能しません。

私はWHM/cPanelを使用してCentOS5を使用しています。助けてくれてありがとう!

編集:

urlencode()を試しましたが、機能しません。
escapeshellarg()を試しましたが、コマンドは正しく渡されましたが、機能しません。
短いパラメータを使用しようとしましたが、コマンドは正しく渡されましたが、機能しません。

編集2:

exec()、system()、またはpassthru()の使用中に文字列の長さに制限はありますか?

編集3:

最後に、 Wrikkenのおかげで、問題は、URLでsession_id()を渡し、それをexec()で再利用していたことでした。session_write_close();を追加する必要がありました。exec()の前にあるため、PHPは現在のセッションのロックを解除して、exec()のスクリプトで再利用できるようにします。詳細については、以下のコメントを参照してください。

4

2 に答える 2

5

コメントを回答に更新しましょう。コマンドラインに渡されるすべての可変引数は、次のコマンドでエスケープする必要があります。escapeshellarg

于 2011-08-03T14:45:13.067 に答える
1

コマンドラインが長すぎる場合は、各パラメーターの短いバージョンを使用できます。たとえば、次の代わりに:

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

あなたが使用することができます

-s 'Letter' --O 'Portrait' 
于 2011-08-03T14:51:13.983 に答える