2016-05-28 29 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流,这也是行不通的。让我用更精确的信息更新我的答案。 –