Парсер/демон на php падает без причины

12
S
На сайте с 11.01.2011
Offline
69
645

Здравствуйте уважаемые форумчане. Прошу подсказки у тех кто имеет опыт настройки php окружения для парсеров, демонов либо других "долгоиграющих" скриптов. Суть такая пишу скрипт загрузки товаров в интернет магазин из xml прайса. Столкнулся с той проблемой что на моем сервере парсер отрабатывает нормально, однако на хостинге клиента прекращает работу спустя 20-60 минут после запуска. В итоге я решил проверить как долго вообще будет выполнятся php скрипт на клиентском хостинге, для проверки написал что то вроде демона:


<?php
ini_set('max_execution_time', 0);
set_time_limit(0);
ini_set("memory_limit", "128M");
ignore_user_abort(true);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

function shutdown()
{
file_put_contents(__DIR__ . '/log/shutdown_log.txt', 'Выполнили функцию shutdown!'.PHP_EOL, FILE_APPEND);
$err_arr = error_get_last();
$err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line'];
file_put_contents(__DIR__ . '/log/shutdown_log.txt', $err, FILE_APPEND);

}

function sig_handler($signo)
{
$info = "\n" . 'received signal ' . $signo . "\n";
$info .= "\n" . 'Выполнили функцию sig_handler! ' . $signo . "\n";
file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $info.PHP_EOL, FILE_APPEND);
$err_arr = error_get_last();
$err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line'];
file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $err, FILE_APPEND);
exit;
}

register_shutdown_function('shutdown');
declare(ticks = 1);
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");


$time = date('H-i-s');
file_put_contents(__DIR__ . '/log/time_test_ON.txt', $time);

while(true){
$time = date('H-i-s');
file_put_contents(__DIR__ . '/log/time_test_log.txt', $time);
sleep(1);
}

После запуска демона через консоль, он прекращает работу примерно через 20 минут, при этом shutdown() и sig_handler() - никаких логов не создают. Хотя если убить скрипт через консоль командой kill pid то обе функции отрабатывают нормально, то есть логи создаются.

В общем я в тупике, предполагаю что это некое ограничение на хостинге, однако не могу понять в чем именно оно состоит и как его пофиксить.

vovka83
На сайте с 30.03.2010
Offline
119
#1

Обратится в саппорт для начала?

Бесплатно 20 euro от Hetzner - http://bit.do/20euro
LEOnidUKG
На сайте с 25.11.2006
Offline
1547
#2

Никакого тупика нет, на обычном хостинге всё так и будет. Покупайте VPS, чтобы работать без ограничений или переделывайте на крон.

✅ Трастовых площадок под размещение статей и ссылок. Опыт 12 лет! ( https://searchengines.guru/ru/forum/675690 ) ⭐ Купить вечные трастовые ссылки для сайта ( https://getmanylinks.ru/?srh ) ⭐ Ускорение ваших сайтов (WP, Opencart и др.) + Настройка сервера ( https://searchengines.guru/ru/forum/997205 )
edogs software
На сайте с 15.12.2005
Offline
714
#3

sitesoft,

1) register_shutdown_function обычно вываливается из текущей директории, а иногда и из текущего юзера. у Вас путь непонятно какой в результате оказывается, поэтому логи может и пробуют писаться, просто не туда. Используйте абсолютный жестко заданный путь и сделайте директорию с логами 777, тогда должно записать.

2) ограничения по времени выполнения нередко можно обойти через тот же register_shutdown_function , запускайте скрипт, регистрируйте парсер через register_shutdown_function и умирайте - может работать вечно на большинстве хостингов, т.к. "что мертво, то умереть не может"©

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход.
S
На сайте с 11.01.2011
Offline
69
#4
vovka83:
Обратится в саппорт для начала?

Можно, но сперва хорошо бы понять что именно от них требовать.

SocFishing
На сайте с 26.09.2013
Offline
118
#5
<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('track_errors', 1);
ini_set('html_errors', 1);

while(true){
$time = date('H-i-s');
file_put_contents(__DIR__ . '/log/time_test_log.txt', $time);
sleep(1);
}?>

Вот это как запускаете? просто php 111.php ?

Попробуйте запустить как /usr/bin/nohup php 111.php >/tmp/111.log 2>&1 &

Не вижу в вашем коде ничего криминального. Дескрипторы file_put_contents должны закрываться, т.е. в количество открытых файлов это не упирается. Попробуйте через nohup, так как у вас может рваться контекст с консолью при открытом демоне. Поток переведет /tmp/111.log в том числе и ошибки. Если и это дропнет, то значит хостинг.

★Сервис идентифицирует (https://socfishing.com/?utm_source=searchengines) посетителей вашего сайта и предоставляет их профили ВКонтакте, Телефон, Почта! Цены копеечные, работаем 8 лет.
S
На сайте с 11.01.2011
Offline
69
#6
edogs:
sitesoft,
1) register_shutdown_function обычно вываливается из текущей директории, а иногда и из текущего юзера. у Вас путь непонятно какой в результате оказывается, поэтому логи может и пробуют писаться, просто не туда. Используйте абсолютный жестко заданный путь и сделайте директорию с логами 777, тогда должно записать.

2) ограничения по времени выполнения нередко можно обойти через тот же register_shutdown_function , запускайте скрипт, регистрируйте парсер через register_shutdown_function и умирайте - может работать вечно на большинстве хостингов, т.к. "что мертво, то умереть не может"©

Вот как раз в том то и дело что скрипт обрывается "молча" потому что если не дожидаясь 20 минут убиваю процесс вручную командой kill pid то тогда обе функции отрабатывают и логи создаются, поэтому не похоже что проблема в путях.

---------- Добавлено 22.03.2020 в 05:01 ----------

SocFishing:
Вот это как запускаете? просто php 111.php ?
Попробуйте запустить как /usr/bin/nohup php 111.php >/tmp/111.log 2>&1 &

Не вижу в вашем коде ничего криминального. Дескрипторы file_put_contents должны закрываться, т.е. в количество открытых файлов это не упирается. Попробуйте через nohup, так как у вас может рваться контекст с консолью при открытом демоне. Поток переведет /tmp/111.log в том числе и ошибки. Если и это дропнет, то значит хостинг.

Запускаю командой:

nohup php -f time_test.php &

но результат тот же, 20 минут и обрывает. Тоже грешу на хостинг, но понять бы что именно, требовать от саппорта.

SocFishing
На сайте с 26.09.2013
Offline
118
#7
nohup php -f time_test.php &

вы не перенаправляете вывод куда-то, в том числе и ошибки. Попробуйте то что я скинул.


<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('track_errors', 1);
ini_set('html_errors', 1);

while(true){
$time = date('H-i-s');
file_put_contents(__DIR__ . '/log/time_test_log.txt', $time);
sleep(1);
}?>

/usr/bin/nohup php 111.php >/tmp/111.log 2>&1 &

Настройки PHP дефолтные? не было каких-то модулей оптимизации? По хостингу нужно чекнуть количество операций в секунду IOPS.

Чекнуть запись, какое кол-во операций? параметр IOPS

sudo apt-get install fio

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=4G --readwrite=randwrite

Чекнуть операции ввода вывода на провалы

sudo apt-get install ioping

ioping -c 1000

S
На сайте с 11.01.2011
Offline
69
#8

Получил ответ от хостинга:

"Здравствуйте, на наших серверах виртуального хостинга есть ограничение в 1200 секунд на время работы пользовательского процесса. Запущенные Вами процессы были остановлены при превышении данного лимита:" - так что таки да на их стороне была проблема.

---------- Добавлено 22.03.2020 в 21:27 ----------

SocFishing:
вы не перенаправляете вывод куда-то, в том числе и ошибки. Попробуйте то что я скинул.
/usr/bin/nohup php 111.php >/tmp/111.log 2>&1 &

Вывод перенаправлять пробовал, но результат был тот же, + из за вывода очень сильно рос файл вывода, соответственно я хотел исключить возможные проблемы связанные с размером дискового пространства.

SocFishing:

Настройки PHP дефолтные? не было каких-то модулей оптимизации? По хостингу нужно чекнуть количество операций в секунду IOPS.

Настройки PHP и менял и возвращал дефолтные, результат был одинаков.

SocFishing:

Чекнуть запись, какое кол-во операций? параметр IOPS
sudo apt-get install fio
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=4G --readwrite=randwrite

Чекнуть операции ввода вывода на провалы
sudo apt-get install ioping
ioping -c 1000

А я вот не знаю сработал бы sudo apt-get install на виртуальном хостинге, наверное врядли. В любом случае спасибо, буду знать как на vps чекать если что.🚬

SocFishing
На сайте с 26.09.2013
Offline
118
#9

sitesoft, ооо нужно было сразу начинать, что у клиента хостинг (я думал vps). Вы видимо запускали через exec демона. Ясно.

LEOnidUKG
На сайте с 25.11.2006
Offline
1547
#10
SocFishing:
sitesoft, ооо нужно было сразу начинать, что у клиента хостинг (я думал vps). Вы видимо запускали через exec демона. Ясно.

Вроде так и начинали:

однако на хостинге клиента
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий