2

/usr/local/bin/pdftkApache で PHP から ( 、 、 などを介してshell_exec())exec()呼び出すsystem()期待どおりに SYNOPSIS メッセージが返されます。

/usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten経由で呼び出すとshell_exec()、何も返されません。

まったく同じ文字列をコピーしてシェルの同じパスに (apache ユーザーとして) 貼り付けると、output.pdf ファイルが期待どおりに生成されます。

pdftkコマンドを PHP シェル スクリプト (shebang is ) に移動し#!/usr/bin/phpて実行すると、php script.php完全に機能します。

そのシェル スクリプトを (stderr を stdout にリダイレクトして) Apache の PHP から ( 経由でshell_exec(script.php);) 呼び出すと、次の行になります。

sh: line 1: 32547 Segmentation fault      /usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten 2>&1

コマンド ラインから (PHP 経由または直接) スクリプトを実行すると、問題なく動作します。Apache 経由で PHP を介してスクリプトを実行すると、通知なしで失敗するか、上記の SegFault が発生します。

RHEL4 の PHP 4.3.9 です。私を撃たないでください。ini_set() を使用してメモリを 512M に設定し、apache ユーザーが (fopen() を使用して) すべてのパスに読み取り/書き込みを行い、apache としてログインしていることを確認しました ...

これを見つけるために/var/log/messagesに行ってチェックしました:

Oct  4 21:17:58 discovery kernel: audit(1286241478.692:1764638):  
    avc:  denied  { read } for  pid=32627 comm="pdftk" name="zero"
    dev=tmpfs ino=2161 scontext=root:system_r:httpd_sys_script_t
    tcontext=system_u:object_r:zero_device_t tclass=chr_file

注: SELinux を無効にすると、問題が「修正」されました。これは ServerFault の質問に移動しましたか? 30 秒の SELinux アクセス制御の入門書をここで教えてもらえますか?

4

1 に答える 1

0

php-cli と php-cgi (またはモジュールは、サーバーが使用するものに依存します) は異なるバイナリです。サーバー上で共存するために同じバージョンを共有する必要さえありません。また、同じ構成を共有しない場合もあります。通常、メモリを増やしてもセグメンテーション違反には何の役にも立ちません。チェックポイント:

  1. それらは同じバージョンですか?
  2. それらは同じ設定を持っていますか (出力にロードされた *.ini の場所phpinfo();、およびおそらく出力自体全体を参照してください)。 .
  3. セグメンテーション違反は、コアよりも拡張機能で発生することが多く、一見無関係に見えることもあります。不要な拡張機能を 1 つずつ無効にして、問題が解決するかどうかを確認してください。
  4. まだ成功していませんか?でApacheを実行したいgdbかもしれませんが、私はその経験がありません。
  5. 運がない?Web サーバーが使用する cgi のモジュールを再コンパイルします。

RHEL4 の PHP 4.3.9 です。私を撃たないでください。

怒りよりもあなたのことを悲しく思います。私たちは 5.3 点を超えています。来てください。ここではもっと幸せです。

于 2010-10-05T01:02:58.727 に答える