2012-03-24 100 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