我有一个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