3

私はPHPを使用して、次のようなスクリプトでexec()を実行しています:

exec("pdftk xx.pdf fill_form xx.fdf output xx.pdf flatten");

最も奇妙なことは、ssh にログインしてコマンドを手動で入力すると、正常に動作することです。224k pdfを出力します。しかし、exec() コマンドを使用すると、スクリプトの最初の 36k しか表示されません。(確認しました - 正常なファイルの最初の 36k は不良ファイルと同じです)

奇妙なことはありません-これは、fdfファイルにさらに変数を追加して長くするまで、exec()で正常に機能していました。新しいデータのため、fdf に問題があると思いましたが、なぜこのプロセスが ssh から正常に実行されるのでしょうか?

更新: また、 php -f test.php を実行してみました (これには、1 つの exec 行が含まれています)。ファイル全体を適切に出力します。しかし、http://mydomain.com/test.phpにアクセスしても、ファイルの一部しか取得できません。

exec() コマンドの後に何かをエコーさせ、正常に動作するため、スクリプトはタイムアウトしません。

まだファイルを書き込むことができるため、権限の問題になることはありません (ssh は root としてログインします)。

また、exec または passthru から戻り値または終了値を取得しようとしても、何も得られません。戻り値は常に 0 です。

更新:Apacheエラーログで、私は取得しています

[2010 年 9 月 17 日金曜日 20:00:57] [エラー] 未処理の Java 例外: [2010 年 9 月 17 日金曜日 20:00:57] [エラー] java.lang.OutOfMemoryError [2010 年 9 月 17 日金曜日 20:00:57] [エラー] ] <>

php_ini を 32M から 64M に変更しましたが、それでも取得できます。これらはすべて小さなファイルであることを考えると、それだけではないと思います。しかし、PHP はそのような子プロセスのメモリを制限できますか? そのための別の設定はどこかにありますか?

ヘルプ!

4

3 に答える 3

1

結局、これはメモリの問題でした。ApacheではメインのconfファイルにRLimitMEMが設定されていましたが、今は無効にしています。今ではそれは魅力のように機能します。約89MBに設定されていて、これらのファイルは1メガ未満であるため、このアプリがその量のメモリをどのように使用するかはわかりません。

于 2010-09-18T01:16:10.300 に答える
0

更新:apacheエラーログで、

[2010年9月17日金曜日20:00:57][エラー]未処理のJava例外:[2010年9月17日金曜日20:00:57][エラー]java.lang.OutOfMemoryError[2010年9月17日金曜日20:00:57][エラー] <>

apacheがJavaエラーを出している理由がわかりませんか?それについて詳しく教えていただけますか?それはとても奇妙だと思います。

php_iniを32Mから64Mに変更しました-それでも取得できます。これらはすべて小さなファイルであることを考えると、それだけではないと思います。しかし、PHPはそのような子プロセスのメモリを制限することができますか?そのための別の設定はどこかにありますか?

また、アプリケーションが使用しているメモリで何かを行う必要があると感じています。これは、pdftkを呼び出しているため、メモリ制限を超える可能性があるためです。pdftk呼び出しはピーク時にどのくらいのメモリを使用しますか?多分あなたはさらに記憶を上げる必要がありますか?

あなたはこのようなことをしましたか?http://www.wallpaperama.com/forums/how-to-change-memory-limit-php-apache-server-t53.html

更新:また、php -f test.php(1つのexec行が含まれている)を実行してみました。ファイル全体を正しく出力します。しかし、 http://mydomain.com/test.phpにアクセスしても、ファイルの一部しか取得できません。

高負荷時にWebサーバー(VPS)を強制終了しないソリューションがあります。サイト(Webサーバー側)から、 predis phpクライアントライブラリを使用してブロッキングリスト(redis )にプッシュする必要があります。これは、必要なすべてのredisコマンド(BLPOP / LPUSH)をサポートしているためです。常に実行されているPHPデーモン(php -f)から、ブロックリストからポップしてコマンド(pdftk)を実行する必要があります。

于 2010-09-18T01:46:29.817 に答える
0

共有 Web ホストから実行していると仮定しますが、その場合は注意が必要です: 多くのホストはカスタム php.ini ファイルを使用して、 exec() の動作を制限します (まったく使用できないようにするなど)。 exec から生成されたプロセスの実行に数秒以上かかるのを防ぐシステムインプレースである可能性があります。そのため、シェルからは正常に機能する可能性がありますが、PHP のコンテキスト内では機能しません。

于 2010-09-17T23:50:21.783 に答える