Назад | Перейти на главную страницу

Ошибка сегментации при запуске скрипта PHP из CLI, отлично работает как задание cron

У меня есть 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).

Поэтому проверьте свои журналы и убедитесь, что ваш файл имеет правильные разрешения для запуска от имени пользователя, в который вы входите, через интерфейс командной строки.