woonem
@woonem

После 60 минут рекурсии скрипт остановился. Как предотвратить?

Испытание на выделенном сервере:
60 минут работы
0 ошибок
a63b70cd8324418cb8a9f0390fbfb82e.png

Испытание на хостинге:
36 минут работы
1 ошибка 508 Resource Limit Exceeded
003062275471403cb8cc304b591060f6.png

Проверка и сбор статистики происходит с помощью записи вывода и времени вывода в лог и постоянного чтения JavaScript'ом этих логов.

Как предотвратить остановку скрипта (на хостинге не работают никакие set_time_limit)?
Сама рекурсия происходит пингованием самого себя (самовызовом).
Иногда что-то происходит и пинг не срабатывает. Вот рекурсия и останавливается.
На ошибку 508 не обращайте внимания. Она просто для статистики.
При чём после ошибки 508 скрипт всё-равно продолжает работать. Магия =)

Код:
daemon.php:
<?php
if(date('His')-file_get_contents('./date')<3)
    exit; //защита от двойного запуска
    file_put_contents('./date', date('His'));
function ping($action){
    $h=$_SERVER[HTTP_HOST];
    $http=fsockopen($h, 80, $e1, $e2, 1);
if($http){
    fwrite($http,
    'GET /'.$action.' HTTP/1.1'."\r\n".
    'Accept: */*'."\r\n".
    'Host: '.$h."\r\n\r\n"
    );
    fclose($http);
}
}
    ping('core.php'); //запуск исполнительной программы
    sleep(3);
    ping('daemon.php'); //перезапуск текущей программы
  • Вопрос задан
  • 427 просмотров
Пригласить эксперта
Ответы на вопрос 4
Phizio
@Phizio
30-40 минутные PHP-шки нестабильны. Скорее всего, у вас случаются утечки памяти.
Да, логичнее будет все же сделать ежеминутный или ежепятиминутный крон - при каждом новом вызове память будет очищаться. К тому же у вас есть защита от вызова 2 процессов одновременно. Чуть допилить, чтобы один процесс завершал другой, и будет отлично работать (годами ;)
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Просто периодически запускайте скрипт по крону.
Ответ написан
Да на хостинге не работают снятые ограничения set_time_limit, они и на сервере-то у меня не работают, приходится всё в php.ini снимать. На хостинге могут процессорное время измерять при исчерпании лимита убивать или вообще блокировать аккаунт.
Ответ написан
@vGrabko99
html, css, js, php, golang, mysql
Используйте Go ))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы