- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Привет народ
кароче такая ситуация.
есть примерно такой скрипт
что он делает. в /data/urls.php есть список ссылок. он по одной берет что то делает и снова запускает сам себя. и так пока все ссылки не пройдет
так вот проблема. если его запустить. крон или с браузера. то сайт тупо виснет. не могу зайти на любую страницу пока он не отработает
как быть?
добавлял в начале
не помогло
Вы запускаете цепную реакцию и парализуете веб-сервер.
Если правильно понял что оно делает, то запускается скрипт, который не завершается пока не закончится запуск внутри его же самого, а внутри того еще он же и так далее пока не закончатся worker'ы веб-сервера.
Надо смотреть логи, но по-идее оно вообще у вас не работает никак т.к. на последнем свободном worker'е происходит снова запуск скрипта и точно также как вы не можете больше ни одну страницу открыть, так и скрипт этот также стоит в ожидании свободного worker'а, который скорей всего появляется, но позже после таймаута (например max_execution_time в php или еще какой-то таймаут выше, смотря что за веб-сервер(ы) это все обрабатывает).
Сколько там ссылок в том файле? Можно для эксперимента попробовать сделать их чуть меньше чем число рабочих процессов веб-сервера (ну или их увеличить хотяб до числа ссылок+1) и посмотреть, скорей всего будут страницы открываться.Но естественно это не выход в случае если ссылок там сотни, тысячи,...
Короче, все не правильно сделано изначально. Скрипт должен запуститься, отработать, запустить следующую копию, а сам завершиться не дожидаясь результата ее выполнения. Или должен быть некий "мастер"-скрипт, который запускает дочерний один, ждет ответа (если это нужно), потом следующий и т.д. Сейчас же по цепочке они друг друга запускают и первый (и все последующие) ждут пока не закончит работу последний в итоге все просто в подвисшем состоянии и ничего не работает пока не сработает какой-то таймаут и так далее до конца.
Вот так бы попробовать:
$_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)
спасибо за помощь. но все равно не помогло
да надо так "wget http://сайт/script.php?num=$num & exit"
но ето & exit не помог. немного помогло вместо
curl с timeout. но тоже подвисание сайта есть даже если выставить 1сек
Да, проверил по-быстрому у себя - тоже виснет. Но если добавить >/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 и т.д. по порядку. Ну и конечно же сайт должен работать нормально в это время.
у меня в кроне всегда идет подавление вывода >/dev/null 2>&1
но тоже самое. не помогает. пришлось переписать скрипт под php cli. спасибо еще раз
Да не в кроне, а в самом скрипте это надо. get_headers, curl - это все не то.
`wget -O - $config[http_home_url]script.php?num=$num >/dev/null &`;
Вот эта штука если в самом скрипте запускает дочерние, то все отлично. У меня все заработало как положено по крайней мере.
Ладно...
вот так shell_exec('wget -qO- http://site.top/cron.php?num='.$num.' >/dev/null &'); ?
так тоже самое.
у меня под php cli переделано. норм. но теперь проблема узнать $_SERVER['REMOTE_ADDR'] и getenv('HTTP_HOST')
Да, можно и shell_exec. Не знаю что тоже самое, у меня работает, один за другим запускаются, а предыдущие завершаются, ничего не зависает.
Короче ладно... не важно.
Конечно, откуда ж возьмется HTTP_HOST? Эти переменные берутся из веб-сервера, просто PHP про них знать не может, скрипт же не из под сайта запускается, а просто сам по себе.
И REMOTE_ADDR чей в данном случае должен быть? Чисто логически, если никакого "remote" вообще не происходит, все локально. :]
ой. ошибочка. не REMOTE_ADDR а SERVER_ADDR
Получится что-то типа 127.0.0.1. А какая проблема посмотреть?