Cron. Долго грузится сайт

12
lutskboy
На сайте с 22.11.2013
Offline
177
385

Привет народ

кароче такая ситуация.

есть примерно такой скрипт

<?php


ini_set("user_agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.2924.87 Safari/537.36");

$urls = file('/data/urls.php', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$num = isset($_GET['num']) ? intval($_GET['num']) : 0;

$urls = array_slice($urls, $num);



if (count($urls)) {

        sleep(2);

        $num++; 

        get_headers($config['http_home_url'].'script.php?num='.$num);

}

что он делает. в /data/urls.php есть список ссылок. он по одной берет что то делает и снова запускает сам себя. и так пока все ссылки не пройдет

так вот проблема. если его запустить. крон или с браузера. то сайт тупо виснет. не могу зайти на любую страницу пока он не отработает

как быть?

добавлял в начале 

session_write_close();

не помогло

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#1

Вы запускаете цепную реакцию и парализуете веб-сервер.

Если правильно понял что оно делает, то запускается скрипт, который не завершается пока не закончится запуск внутри его же самого, а внутри того еще он же и так далее пока не закончатся worker'ы веб-сервера.

Надо смотреть логи, но по-идее оно вообще у вас не работает никак т.к. на последнем свободном worker'е происходит снова запуск скрипта и точно также как вы не можете больше ни одну страницу открыть, так и скрипт этот также стоит в ожидании свободного worker'а, который скорей всего появляется, но позже после таймаута (например max_execution_time в php или еще какой-то таймаут выше, смотря что за веб-сервер(ы) это все обрабатывает).

Сколько там ссылок в том файле? Можно для эксперимента попробовать сделать их чуть меньше чем число рабочих процессов веб-сервера (ну или их увеличить хотяб до числа ссылок+1) и посмотреть, скорей всего будут страницы открываться.

Но естественно это не выход в случае если ссылок там сотни, тысячи,...

Короче, все не правильно сделано изначально. Скрипт должен запуститься, отработать, запустить следующую копию, а сам завершиться не дожидаясь результата ее выполнения. Или должен быть некий "мастер"-скрипт, который запускает дочерний один, ждет ответа (если это нужно), потом следующий и т.д. Сейчас же по цепочке они друг друга запускают и первый (и все последующие) ждут пока не закончит работу последний в итоге все просто в подвисшем состоянии и ничего не работает пока не сработает какой-то таймаут и так далее до конца.

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#2

Вот так бы попробовать:

$_GET['num'] везде меняем на $argv[1]

get_headers($config['http_home_url'].'script.php?num='.$num); меняем на:

`php script.php $num & exit`;

в крон просто добавляем:

php script.php

Т.е. скрипт запускается без параметров (num становится = 0), выполняется прогон первой ссылки, дальше запуск новой копии скрипта уже с параметром $num и выход. Т.е. не ждет завершения его. Все, крон закончил работу, дальше остались лишь висеть дочерние копии, которые также отрабатывают, запускают следующую и завершаются.

Надо пробовать, но теоретически должно работать как положено. И при этом сайт/веб-сервер вообще не участвует, на его работе не должно отражаться никак.

Если же из под php-cli запускать не вариант (есть какая-то привязка к веб-серверу, путям каким-то, переменным и т.д.), то все тоже самое реализуется через "wget http://сайт/script.php?num=$num & exit" вместо "php script.php $num & exit" (ну и опять используем $_GET['num']  вместо $argv)

lutskboy
На сайте с 22.11.2013
Offline
177
#3

спасибо за помощь. но все равно не помогло

да надо так "wget http://сайт/script.php?num=$num & exit"

но ето  & exit не помог. немного помогло вместо 

get_headers

curl с timeout. но тоже подвисание сайта есть даже если выставить 1сек

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#4

Да, проверил по-быстрому у себя - тоже виснет. Но если добавить >/dev/null все ок становится.

Попробуйте вместо:

get_headers($config['http_home_url'].'script.php?num='.$num);

вставить:

`wget -O - $config[http_home_url]script.php?num=$num >/dev/null &`;

Потом запустить браузером и наблюдать за логами. Оно должно 1 раз отработать и закончиться в браузере, но отдельно запустится wget процесс с еще одной копией, потом тот выйдет и еще один и так далее до конца - в логах должна быть последовательность через около 2сек (sleep 2 ваши) запросов типа script.php?num=2 и т.д. по порядку. Ну и конечно же сайт должен работать нормально в это время.

lutskboy
На сайте с 22.11.2013
Offline
177
#5

у меня в кроне всегда идет подавление вывода >/dev/null 2>&1

но тоже самое. не помогает.  пришлось переписать скрипт под php cli. спасибо еще раз

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#6

Да не в кроне, а в самом скрипте это надо. get_headers, curl - это все не то.

`wget -O - $config[http_home_url]script.php?num=$num >/dev/null &`;

Вот эта штука если в самом скрипте запускает дочерние, то все отлично. У меня все заработало как положено по крайней мере.

Ладно...

lutskboy
На сайте с 22.11.2013
Offline
177
#7

вот так shell_exec('wget -qO- http://site.top/cron.php?num='.$num.' >/dev/null &'); ?

так тоже самое. 

у меня под   php cli переделано. норм. но теперь проблема узнать $_SERVER['REMOTE_ADDR'] и getenv('HTTP_HOST')

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#8

Да, можно и shell_exec. Не знаю что тоже самое, у меня работает, один за другим запускаются, а предыдущие завершаются, ничего не зависает.

Короче ладно... не важно.

Конечно, откуда ж возьмется HTTP_HOST? Эти переменные берутся из веб-сервера, просто PHP про них знать не может, скрипт же не из под сайта запускается, а просто сам по себе.

И REMOTE_ADDR чей в данном случае должен быть? Чисто логически, если никакого "remote" вообще не происходит, все локально. :]

lutskboy
На сайте с 22.11.2013
Offline
177
#9
ой. ошибочка. не  REMOTE_ADDR а SERVER_ADDR
W1
На сайте с 22.01.2021
Offline
304
#10
lutskboy #:
ой. ошибочка. не  REMOTE_ADDR а SERVER_ADDR

Получится что-то типа 127.0.0.1. А какая проблема посмотреть?

Мой форум - https://webinfo.guru –Там я всегда на связи
12

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