Php curl Segmentation fault

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
sti555
проходил мимо
Сообщения: 2
Зарегистрирован: 2016-01-09 2:32:22

Php curl Segmentation fault

Непрочитанное сообщение sti555 » 2016-01-09 3:02:52

Здравствуйте. Проблема с 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 мегабайт. На хостинге этот скрипт прекрасно работал сутками без сбоев. Куда копать?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

guest
проходил мимо

Php curl Segmentation fault

Непрочитанное сообщение guest » 2016-01-09 10:30:36

# 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 - должно помочь, логику своего скрипта обдумайте

sti555
проходил мимо
Сообщения: 2
Зарегистрирован: 2016-01-09 2:32:22

Php curl Segmentation fault

Непрочитанное сообщение sti555 » 2016-01-09 15:43:04

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, расширениях или еще где. Вот только как бы узнать это?

guest
проходил мимо

Php curl Segmentation fault

Непрочитанное сообщение guest » 2016-01-09 17:30:54

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? Может навести на мысли.

unisol
рядовой
Сообщения: 23
Зарегистрирован: 2016-02-01 10:53:46

Php curl Segmentation fault

Непрочитанное сообщение unisol » 2016-02-04 11:14:41

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