PHP exec() が機能しない - 途中で終了しますか?エラーはありませんか?

StackOverflow https://stackoverflow.com/questions/3739670

質問

私は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 行だけ含まれていました)。ファイル全体を適切に出力します。でも行っても http://mydomain.com/test.php ファイルの一部しか取得できません。

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

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

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

アップデート:Apacheエラーログには、次のようなメッセージが表示されています

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

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

ヘルプ!

役に立ちましたか?

解決

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

他のヒント

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

アップデート:Apacheエラーログでは、私は取得しています

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

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 i only ファイルの一部を取得する。

高負荷時にウェブサーバー(VPS)を停止させない解決策があります。サイト(Webサーバー側)からブロックリストにプッシュする必要があります(レディス) を使用して プレディス 必要なすべての Redis コマンドをサポートしているため、php クライアント ライブラリ(BLPOP/LPUSH)。常に実行されている PHP デーモン (php -f) から、ブロック リストからポップしてコマンド (pdftk) を実行する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top