У меня есть PHP-скрипт, который читает файл через fgetcsv
через PHP zip://
обертка. Это отлично работает локально и при запуске в производственной среде через задание 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
но после прочтения всех записей, поэтому я подозреваю, что он терпит неудачу, когда достигает конца файла.
-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.
Что может быть причиной этого и есть ли способ исправить?
strace
прока выяснить, где он умирает. Segfault по определению является необработанной ошибкой, поэтому логи вряд ли расскажут вам много интересного. Предположение: php скомпилирован с использованием общей библиотеки, недоступной на хосте, на котором он был развернут.
В качестве альтернативы, если вы говорите, что работаете на виртуальном хостинге, почему бы не задействовать канал поддержки поставщика? С корневым доступом они могут делать гораздо больше, чтобы понять, что происходит, и нарушена именно среда, которую они предоставляют.
У меня была такая же проблема при использовании #!/usr/bin/php -q
. Я создавал PDF-файл с помощью fpdf.org. Я читал весь файл (с 39000 строками) с помощью PHP file
command, и я получал ту же ошибку segfault. Я заменил команду file на fopen и fgets, читая построчно, и проблема исчезла. Я подозреваю, что этот segfault возник из-за bash, потому что когда я запускал вручную php -q mpdf.php
вместо того ./mpdf
с участием #!/usr/bin/php
в первой строке проблема не возникла. Кстати, я использую PHP 4.3.1 на SUSE linux 8.2. Я должен оставаться там и не переходить к более поздним релизам по ряду причин.
Надеюсь, это помогло. Привет из солнечных Афин (в Греции)
Христос Михаил
Вам нужно проверить свои журналы и посмотреть, где в процессе возникает ошибка. Возможно, вам потребуется включить ведение журнала в файле php.ini.
Скорее всего, у вас нет необходимых разрешений для файла. Когда вы запускаете его как cron, вы, вероятно, запускаете скрипт как root (при условии, что у вас есть cron в системном crontab).
Поэтому проверьте свои журналы и убедитесь, что ваш файл имеет правильные разрешения для запуска от имени пользователя, в который вы входите, через интерфейс командной строки.