php - 无法使用 PHP 执行外部进程

标签 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;
        }
    }
}

有什么问题吗?

问题是,我已经安装了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是没有目录的文件'

当我运行这个函数脚本时,弹出文件下载提示,但是当我保存它时,什么都没有保存,

我已经检查了这个文件夹的权限并更改了它 0755, 0766, 0777, 0666 我已经试过了,没有任何效果

3 天以来,我一直在努力克服它,我也问过这方面的问题,但无法弄清楚我到底发生了什么。

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

最佳答案

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

将确切路径传递到 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"); ?>其中/path/to/pdftk 是由 which 或 where is 返回的路径,以确保路径正确。

如果路径正确,则问题可能与您告诉 pdftk 使用的临时目录的权限或与 apache 用户相关的 pdftk 二进制文件的权限有关。

如果这些权限没有问题,您可以验证 pdftk 从 php 启动但在运行命令时挂起,然后可以尝试列出的解决方法 here .

有关 passthru 的更多文档可用 passthru PHP Manual .

作为旁注,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。

关于php - 无法使用 PHP 执行外部进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856406/

相关文章:

javascript - 如何修复我的 CSS 并使我的网站看起来像博客或杂志?

linux - 从 bash 脚本启动 Ant 构建 : build. xml 不存在

python - wxPython 中的 "NotImplementedError: wxGCDC is not available on this platform"

c# - ITextSharp/PDF : place Base64 Image from Web on PDF as Pseude-Signature

batch-file - 在for循环中批量设置var

php - 比较 2 个数组并删除相似的值

javascript - 如何通过使用 ajax 从数据库获取 json 数据,使用 javascript 将 case 添加到 switch 语句?

php - 当一个 CT 引用另一个时,如何消除 View 中重复的 Drupal 节点?

linux - vsftp虚拟用户设置配置

pdf - 从 A4 页面获取两本 A6 完整小册子序列