2012-03-24 58 views
2

我有以下代码无法执行外部程序与PHP

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或任何其他命令,它运行

如果我使用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天,我努力克服它,我也问过这个问题,但无法弄清楚到底是怎么回事。

在我用头撞墙之前,有人能帮助我吗?

+1

如何:系统( “PATH =在/ usr/local/bin目录/ PDFTK --version”); – 2012-03-24 23:13:06

+0

至于:/ usr/local/bin/pdftk --version,可能版本会输出到stderr,而不是stdout,这就是为什么你什么都得不到的原因。并且还要查看Web服务器的error.log。 – 2012-03-24 23:14:32

+0

如果您要求系统(“PATH =/usr/local/bin/pdftk --version 2>&1”),则没有任何反应bro – 2012-03-24 23:16:27

回答

6

过时函数不会通过shell执行程序。

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

E.g.

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

或 通路( '的/ usr/local/bin中/ PDFTK' $ hud_pdf 'fill_form' $ fdf_fn '输出 - 弄平'。);

如果仍然无法正常使用 <?php passthru("/path/to/pdftk --help"); ?>其中/ path/to/pdftk是由哪个或哪个位置返回的路径,以确保路径正确。

如果路径是正确的,那么问题可能与你告诉pdftk使用的临时目录或者关于apache用户的pdftk二进制文件的权限有关。

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

有关passthru的进一步文档可用passthru PHP Manual

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

E.g.putenv('PATH='.getenv('PATH').':.');

所有3 PHP函数:EXEC(),系统()和中继()执行外部命令,但区别是:

  • EXEC():从命令返回输出的最后一行并没有什么冲刷。
  • shell_exec():从命令返回整个输出并刷新任何内容。
  • system():返回命令输出的最后一行,并尝试在输出的每一行之后刷新输出缓冲区。
  • passthru():不返回任何内容,并将结果输出传递给浏览器,而不会对浏览器产生干扰,当输出为二进制格式时尤其有用。

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

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

+0

我也尝试过ful路径..没有什么帮助我 – 2012-03-27 16:39:28

0

完成Appleman的答案,这3个函数可以被认为是危险的,因为它们允许你使用php来执行程序,因此如果你不小心的话,攻击者会利用你的脚本之一。所以在许多想要安全的PHP配置中,它们被禁用。

所以你应该检查你的php.ini(和任何php配置文件)中的disable_functions指令,看看你使用的函数是否被禁用。

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); 
    } 

希望这可能会给你一些见解。 (根据您的需要更改)

0

也许您应该保持fclose不在if语句中,请确保将其指向正确的文件! :)

0

是您的网络服务器chrooted?尝试将可执行文件放入服务器可查看的目录中。

0

玩与周围的安全模式,绝对检查你的web服务器的日志文件,通常在:

/var/log/apache2/error.log