2016-05-28 31 views
0

我有一個PDF生成器腳本(使用html2pdf lib)的問題。 該腳本在手動啓動時完美運行,但在作爲cron任務啓動時返回此錯誤由cron發起的PDF生成器的TCPDF錯誤

TCPDF錯誤:無法創建輸出文件:/0000/images/upload/demonstration/factures/2016-05-demonstration.pdf

這裏是參與創建腳本的一部分。

require('html2pdf/html2pdf.class.php'); 
     try 
      { 
      $pdf = new HTML2PDF('P','A4','fr'); 
      $pdf->writeHTML($content); 
      ob_end_clean(); 
      $pdf->Output(''.$_SERVER['DOCUMENT_ROOT'] . '/0000/images/upload/'.$data["id_client"].'/factures/'.$fichier.'.pdf', 'F'); 
      } 
     catch(HTML2PDF_exception $e) { 
      die($e); 
      } 

我嘗試了許多其他線程建議的解決方案,但目前爲止沒有任何工作。文件和目錄有權限777,我使用正確的絕對路徑(它手動起作用的事實證明了它)。

有什麼想法?

回答

1

$ _SERVER ['DOCUMENT_ROOT']在通過命令行運行PHP時不可用,因爲DOCUMENT_ROOT是VHost配置中設置的Apache變量。您可以在錯誤消息中看到該變量顯然爲空,並且正在嘗試寫入操作系統根目錄中名爲「0000」的目錄。

必須設置文檔根一些其他的方式通過CLI中運行時,如:

  1. 通過設置變量
  2. 的CLI工作創建一個配置文件,具體的環境。
  3. 直接在PHP設置DOCUMENT_ROOT索引(例如:$ _SERVER [ 'DOCUMENT_ROOT'] = '/路徑/到/文件/根';)
  4. 硬編碼的路徑

STEP 1

弄清楚文檔根目錄實際上是。你可以這樣來做:

die(var_dump($_SERVER['DOCUMENT_ROOT'])); 

確保通過Web瀏覽器(不是由cron)運行上面的臨時代碼,它會告訴你,你的文檔根目錄是什麼。

STEP 2

接的我上面提供的選項之一。

假設您選擇選項4(硬編碼)。將代碼中的$ _SERVER ['DOCUMENT_ROOT']替換爲上述步驟1中獲得的任何路徑。它現在可以通過瀏覽器和cron工作。

重要提示:服務器之間的文檔根目錄發生變化,因此如果您要將您的代碼部署到另一臺服務器,您必須知道文檔根目錄位於特定服務器上。

+0

感謝您的解釋! 所以,我嘗試了不同的選擇: 相對路徑:$ pdf->輸出('../ images/upload /'.$ data [「id_client」]。'/ factsures /'。fichier。'。pdf','F'); 手動工作正常,但似乎沒有在克朗工作。 –

+0

Absolte path(hard code):$ pdf-> Output('http://'.$data [「domaine」]。'/ images/upload /'.$ data [「id_client」]。'/ factsures /' 。$ fichier。'。pdf','F'); 警告:fopen(http://www.domain.fr/images/upload/demonstration/factures/2016-05-demonstration.pdf):無法打開流:HTTP包裝不支持/ home/yatacrea中的可寫連接/www/0000/scripts/html2pdf/_tcpdf_5.0.002/tcpdf.php on line 6168 TCPDF錯誤:無法創建輸出文件:http://www.domain.fr/images/upload/demonstration/factures/2016-05 -demonstration.pdf –

+0

你嘗試過的東西都不起作用。 Apache下的工作目錄與cron不同,所以相對路徑不起作用。在你的下一個嘗試中,你正在嘗試寫入一個http流,這也是行不通的。讓我用更精確的信息更新我的答案。 –