从CLI运行PHP脚本时出现分段错误,可以正常工作

我有一个PHP脚本通过PHP的zip:// wrapper通过fgetcsv读取文件。 这在当地正常工作,并通过cron作业在生产上运行。 当通过CLI调用产品时,会出现分段错误,显然在fgetcsv返回false时读取文件结束。

脚本的相关部分:

 #!/usr/local/bin/php5 <?php ... $i = 0; while (($row = fgetcsv($file)) !== false) { // processing ... if (++$i % 50000 == 0) { echo '.'; } } printf("\nFinished reading %s records.\n\n", number_format($i)); fclose($file); 

其输出:

 -bash-3.00$ ./script.php Reading file.zip................Segmentation fault 

printf之前,看起来是segfault,但是在读完所有的logging之后,我怀疑它到达文件末尾时会失败。

 -bash-3.00$ /usr/local/bin/php5 -v PHP 5.2.8 (cli) (built: Apr 14 2010 16:08:06) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies with the ionCube PHP Loader v3.1.31, Copyright (c) 2002-2007, by ionCube Ltd. 

这可能是什么原因,有没有办法解决这个问题?

让proc找出死亡的地方。 段错误由定义是一个未处理的错误,所以日志不太可能会告诉你很多有趣的事情。 猜测:PHP针对共享库进行了编译,而这些共享库在部署到的主机上不可用。

另外,既然你说你在共享主机上运行,​​为什么不涉及供应商的支持渠道呢? 他们可以通过root访问来做更多的事情来弄清楚发生了什么事情,这是他们提供的环境被破坏了。

您需要检查您的日志,并查看过程中错误的位置。 您可能需要在您的php.ini文件中启用日志logging。

可能您对该文件没有适当的权限。 当你以cron方式运行它时,你可能以root身份运行脚本(假设你在系统crontab中有cron)。

因此,请检查您的日志,并检查以确保您的文件具有与通过CLIlogin的用户一样运行的正确权限。

使用#!/usr/bin/php -q时,我遇到了同样的问题。 我正在使用fpdf.org创buildPDF。 我正在阅读PHP file命令的整个文件(39000行),我得到了相同的段错误。 我用fopen和fgets逐行replace了文件命令,问题就消失了。 我怀疑这段错误来自bash,因为当我在第一行手动运行php -q mpdf.php而不是./mpdf#!/usr/bin/php没有发生问题。 顺便说一句,我在SUSE linux 8.2上运行PHP 4.3.1。 我必须呆在那里,而不是因为一些原因而转移到以后的版本。

我希望这是一些帮助。 来自晴朗的雅典(在希腊)

Christos Michail