无法使用PHP执行外部进程

Zaf*_*fee 2 php linux pdftk

我有以下代码

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它有什么问题吗?

问题是,我已经安装了pdftk

跑步whereis pdftk给了我'/usr/local/bin/pdftk'

实际检查了位置,pdftk在那个位置..

使用终端,如果我运行pdftk --version或任何其他命令,它运行

如果我使用PHP就像passthru('/usr/local/bin/pdftk --version')没有显示

如果我使用PHP就像system("PATH=/usr/local/bin && pdftk --version");它说的那样'/usr/local/bin /pdftk :there is no directory of file '

当我运行这个函数脚本时,提示文件下载弹出,但是当我保存它时,nothng被保存,

我已经检查了这个文件夹的权限并更改了0755, 0766, 0777, 0666我已经尝试了所有,nothng的工作

3天,我正在努力克服它,我也问过这个问题,但无法弄清楚到底是怎么回事.

在我撞墙之前,有人可以帮助我吗?

App*_*234 6

pasthru函数不通过shell执行程序.

将准确的路径传递给passthru命令.

例如

passthru( '/usr/local/bin/pdftk HUD3.pdf fill_form '. $fdf_fn.' output - flatten');
Run Code Online (Sandbox Code Playgroud)

或者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启动但是从运行命令挂起,然后可能会尝试这里列出的解决方法.

关于passthru的进一步文档是可用的passthru PHP手册.

作为旁注,putenv php函数用于设置环境变量.

例如 putenv('PATH='.getenv('PATH').':.');

所有3个PHP函数:exec(),system()和passthru()执行外部命令,但不同之处是:

  • exec():返回命令的最后一行输出并且不刷新任何内容.
  • shell_exec():返回命令的整个输出并且不刷新任何内容.
  • system():返回命令的最后一行输出,并尝试在输出的每一行之后刷新输出缓冲区.
  • passthru():不返回任何内容并传递结果输出​​而不会干扰浏览器,尤其在输出为二进制格式时非常有用.

另请参阅PHP exec vs-system vs passthru SO Question.

这些函数的实现位于exec.c并使用popen.