2

私は次のコードを持っています

function generate_pdf() {

        $fdf_data_strings = $this->get_hash_for_pdf();
        #$fdf_data_names   = array('49a' => "yes");
        $fdf_data_names = array();
        $fields_hidden    = array();
        $fields_readonly  = array();
        $hud_pdf = ABSPATH.'../pdf/HUD3.pdf';

        $fdf= forge_fdf( '',
                 $fdf_data_strings,
                 $fdf_data_names,
                 $fields_hidden,
                 $fields_readonly );

        /*  echo "<pre>";
            print_r($fdf);
            echo "</pre>";
            die('');
        */

        $fdf_fn= tempnam( '.', 'fdf' );
        $fp= fopen( $fdf_fn, 'w' );
        if( $fp ) {
          fwrite( $fp, $fdf );
            //$data=fread( $fp, $fdf );
         // echo $data;
          fclose( $fp );


          header( 'Content-type: application/pdf' );
          header( 'Content-disposition: attachment; filename=settlement.pdf' ); // prompt to save to disk

          passthru( 'pdftk HUD3.pdf fill_form '. $fdf_fn.' output - flatten');

          unlink( $fdf_fn ); // delete temp file

        }
        else { // error
          echo 'Error: unable to open temp file for writing fdf data: '. $fdf_fn;
        }
    }
}

何か問題がありますか?

問題は、pdftkをインストールしたことです

走るwhereis pdftkことは私に与える'/usr/local/bin/pdftk'

場所を物理的に確認しました。pdftkはその場所にあります。

ターミナルを使用して、実行するpdftk --versionか、他のコマンドを実行すると、実行されます

passthru('/usr/local/bin/pdftk --version')何も表示されないようにphpを使用すると

system("PATH=/usr/local/bin && pdftk --version");私が言うようにphpを使用した場合'/usr/local/bin /pdftk :there is no directory of file '

この関数スクリプトを実行すると、ファイルのダウンロードを求めるプロンプトが表示されますが、保存すると、何も保存されません。

このフォルダのアクセス許可を確認して変更しました0755, 0766, 0777, 0666。すべて試しましたが、機能しません。

3日間、乗り越えようと頑張っており、これについても質問してきましたが、一体何が起こっているのかわかりません。

壁で頭を打つ前に誰かが私を助けてくれますか?

4

6 に答える 6

6

pasthru関数は、シェルを介してプログラムを実行しません。

正確なパスをpassthruコマンドに渡します。

例えば

passthru( '/usr/local/bin/pdftk HUD3.pdf fill_form '. $fdf_fn.' output - flatten');

またはpassthru('/ usr / local / bin/pdftk'。$hud_pdf。'fill_form'。$fdf_fn。'output--flatten');

それでも機能しない場合は <?php passthru("/path/to/pdftk --help"); ?>、where / path / to / pdftkがどこから返されるパスであるかを使用してテストし、パスが正しいことを確認します。

パスが正しい場合、問題は、pdftkに使用するように指示した一時ディレクトリの権限、またはapacheユーザーに関するpdftkバイナリの権限に関連している可能性があります。

これらの権限に問題がない場合は、pdftkがphpから起動しているのにコマンドの実行がハングしていることを確認できます。その後、ここにリストされている回避策を試すことができる場合があります。

パススルーに関する詳細なドキュメントは、利用可能なパススルーPHPマニュアルです。

補足として、putenvphp関数は環境変数を設定するために使用されます。

例えばputenv('PATH='.getenv('PATH').':.');

3つのPHP関数すべて:exec()、system()、passthru()は外部コマンドを実行しますが、違いは次のとおりです。

  • exec():コマンドからの出力の最後の行を返し、何もフラッシュしません。
  • shell_exec():コマンドからの出力全体を返し、何もフラッシュしません。
  • system():コマンドから出力の最後の行を返し、出力の各行の後に出力バッファーをフラッシュしようとします。
  • passthru():何も返さず、結果の出力をブラウザーに干渉することなく渡します。特に、出力がバイナリ形式の場合に役立ちます。

PHP exec vs-system vs passthruSOQuestionも参照してください。

これらの関数の実装はexec.cにあり、popenを使用します。

于 2012-03-26T23:52:54.610 に答える
2

私は同じ問題を抱えていました、そしてこれはたくさんの実験の後に働いています:

function InvokePDFtk($pdf_tpl, $xfdf,$output){

        $params=" $pdf_tpl fill_form $xfdf output $output flatten 2>&1";

        $pdftk_path=exec('/usr/bin/which /usr/local/bin/pdftk');

        $have_pdftk= $pdftk_path=='/usr/local/bin/pdftk' ;

        $pdftk_path=$have_pdftk  ? $pdftk_path  : 'pdftk ';

        exec($pdftk_path.$params,$return_var);

        return  array('status'=> $have_pdftk,
                     'command' =>$pdftk_path.$params, 'output'=>$return_var);
    }

これがあなたにいくつかの洞察を与えるかもしれないことを願っています。(必要に応じて変更してください)

于 2012-03-30T13:05:09.583 に答える
0

Webサーバーはchrootされていますか?サーバーが表示できるディレクトリに実行可能ファイルを配置してみてください。

于 2012-04-02T18:04:25.190 に答える
0

おそらく、ifステートメントからfcloseを除外し、正しいファイルに向けられていることを確認する必要があります。:)

于 2012-04-02T07:56:20.453 に答える
0

Applemanの回答を完了すると、これら3つの関数は、phpを使用してプログラムを実行できるため、危険であると見なすことができます。したがって、攻撃者は、注意を怠ると、スクリプトの1つを悪用します。したがって、安全を確保したい多くのphp構成では、それらは無効になっています。

したがって、disable_functionsphp.ini(および任意のphp構成ファイル)でディレクティブをチェックし、使用する関数が無効になっていないかどうかを確認する必要があります。

于 2012-03-29T17:45:54.850 に答える
0

セーフモードで遊んで、通常は次の場所でWebサーバーのログファイルを確認してください。

/var/log/apache2/error.log
于 2012-04-02T20:43:46.983 に答える