Страница 1 из 1

Php curl Segmentation fault

Добавлено: 2016-01-09 3:02:52
sti555
Здравствуйте. Проблема с php на FreeBSD, может кто подскажет. Ситуация следующая. Есть сервер на FreeBSD 10.2-RELEASE. На нем стоит Apache 2.4.18 и php 5.6.16.

uname -a

Код: Выделить всё

FreeBSD webserver.local 10.2-RELEASE FreeBSD 10.2-RELEASE #0 r286666: Wed Aug 12 15:26:37 UTC 2015     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
apachectl -v

Код: Выделить всё

Server version: Apache/2.4.18 (FreeBSD)
Server built:   Jan  6 2016 15:51:20
php -v

Код: Выделить всё

PHP 5.6.16 (cli) (built: Jan  6 2016 16:46:34)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
php -m

Код: Выделить всё

[PHP Modules]
bz2
Core
ctype
curl
date
dom
ereg
exif
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mcrypt
mhash
mysql
mysqli
mysqlnd
openssl
pcre
PDO
Phar
posix
Reflection
session
sockets
SPL
standard
tokenizer
zip
zlib

[Zend Modules]
На php написан скрипт, который в цикле выполняет CURL запросы. Проблема в том, что по истечении, примерно, 30 минут, скрипт завершается с ошибкой

PHP Fatal error: Maximum execution time of 300 seconds exceeded in .../script.php on line 449
Segmentation fault (core dumped)

Номер строчки в коде с ошибкой может быть разным, но всегда указывает на использование функции curl_exec($ch);

gdb -c php.core

Код: Выделить всё

GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd".
Core was generated by `php'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000008012a04ca in ?? ()
Память скрипт не расходует, то есть после получаса работы не превышает 3 мегабайт. На хостинге этот скрипт прекрасно работал сутками без сбоев. Куда копать?

Php curl Segmentation fault

Добавлено: 2016-01-09 10:30:36
guest
# grep max_execution_time /usr/local/etc/php.ini

see: http://php.net/max-execution-time

в скрипт, например (нижнее плохо, можете подобрать свой предел):

ini_set('MAX_EXECUTION_TIME', -1);
set_time_limit(0); тоже плохо

google: curl PHP Fatal error: Maximum execution time of 300 seconds exceeded in

на php.ru есть объяснение про curl_multi - должно помочь, логику своего скрипта обдумайте

Php curl Segmentation fault

Добавлено: 2016-01-09 15:43:04
sti555
max_execution_time в php.ini установлен в 0, да и к тому же из CLI этот параметр автоматически задается нулем. Я поначалу тоже подумал на него, но дело не в нем. Так, например, такой скрипт

Код: Выделить всё

        $timestart = time();
        echo "Timestart ".$timestart." \r\n";
        $itercount = 0;
        while (1)
        {
            $itercount++;
            echo "Current iter is ".$itercount."\r\n";
            echo "Time start is ".$timestart." \r\n";
            echo "Current time is ".time()." \r\n";
            sleep(1);
        }
исправно выполняется без прерываний сутки и более. В гугле искал, но никакого решения к сожалению не нашел. По поводу мультикурла - не могу его использовать конкретно в этом скрипте в силу особенностей последнего. Также, как я писал выше, скрипт прекрасно работает у хостера (не выделенный сервер, а самый обычный дешевый хостинг) и не прерывается. Видимо проблема где-то на моем сервере, в сборке php, расширениях или еще где. Вот только как бы узнать это?

Php curl Segmentation fault

Добавлено: 2016-01-09 17:30:54
guest
sti555 писал(а):max_execution_time в php.ini установлен в 0, да и к тому же из CLI этот параметр автоматически задается нулем. Я поначалу тоже подумал на него, но дело не в нем. Так, например, такой скрипт

Код: Выделить всё

        $timestart = time();
        echo "Timestart ".$timestart." \r\n";
        $itercount = 0;
        while (1)
        {
            $itercount++;
            echo "Current iter is ".$itercount."\r\n";
            echo "Time start is ".$timestart." \r\n";
            echo "Current time is ".time()." \r\n";
            sleep(1);
        }
исправно выполняется без прерываний сутки и более. В гугле искал, но никакого решения к сожалению не нашел. По поводу мультикурла - не могу его использовать конкретно в этом скрипте в силу особенностей последнего. Также, как я писал выше, скрипт прекрасно работает у хостера (не выделенный сервер, а самый обычный дешевый хостинг) и не прерывается. Видимо проблема где-то на моем сервере, в сборке php, расширениях или еще где. Вот только как бы узнать это?
Вы не поняли, про curl_multi - это как пример, про timeout и limit - наводка, что нельзя отключать, можно
изменить, а дальше, нужно обдумать логику и выполнить анализ кода возврата по которому принимать
соответствующие действия или использовать exception.
Если по истечении какого-то времени - Вы не можете получить данные, значит сайт недоступен или
сеть упала или...
Ибо, как я понял, скрипт работает некоторое время, затем начинает валить в корку.

ps. Попробуйте под виртуалкой установить другую версию php и пробный код... Иногда, модули php
конфликтуют и важен порядок в php.extension (комментарьте, бывает некоторые модули не живут
друг с другом).
Посмотрите что было на хостинге: версия php? Может навести на мысли.

Php curl Segmentation fault

Добавлено: 2016-02-04 11:14:41
unisol
Maximum execution time of 300 seconds exceeded - это "выжрано времени проца 300с", к реальному времени отношения почти не имеет, чем быстрее проц - тем дольше оно сможет исполняться в реале (нюансы с "время проца" = "время 1 ядра" или в "количество ядер" раз больше). По выжиранию процесс прибивается средствами ОС, что и выглядит как segfault.
Выходов 2 - увеличить макс. время исполнения или "не делать так" - сделать, чтоб скрипт завершался/запускался и продолжал работу завершившегося.