Как узнать в скрипте - далеко ли еще до max_execution_time?

nerezus

Вселенский отказник
vovanium
> ты так говоришь, вроде у всех твоих клиентов исключительно свои сервера с неограниченными правами.
А что это за клиент такой. который не может 10 баксов в месяц на нормальный хостинг потратить?

По крайней мере мои клиенты не юзают фри хостинги. Минимум - это хороший шаред, где админы поставят необходимые модули или настроят софт по пожеланиям клиента.

> Хорошо хоть не советуешь написать свой модуль на СИ он же явно быстрее бы работал чем на php...
И про оптимизацию почитай ;) Много нового узнаешь.
Хотя яи на C модули делал, но этого требовала задача: переписывание тонны кода на пхп, когда есть готовые либы на С - просто глупо.
 

iceman

говнокодер
что ему даст, если он узнает сколько осталось времени до завершения скрипта?
 

vovanium

Новичок
nerezus
Ты часом не в битриксе работаешь? Как раз люди по твоим принципам работают, вместо того чтобы сделать элементарную вещь, которая позволит работать везде, ты начинаешь составлять списки правильных хостеров.
Причем тут оптимизация, речь не о обычных страничках сайта, если ты никогда не имел дела с рессурсоемкими задачами, то не стоит думать что таких задач не бывает.

Что касается либ, ну давай распарси xml-ку метров 300-500 с товарами и занеси это все ну допустим в базу магазина oscommerce ну или другого, я посмотрю как у тебя это за доли секунды будет происходить.

Так что давай оставим тему правильных хостингов, си-шных модулей и т.п. в покое, речь не о них.

iceman
что ему даст, если он узнает сколько осталось времени до завершения скрипта?
Если знаешь сколько осталось до вырубания скрипта, то можешь штатно завершить работу, нормально сохранив статус, на каком этапе остановился, и потом можешь продолжить работу с места остановки. Если же работа прерывается принудительно, то неизвестно точно где именно скрипт прервался.
 

Resha

Новичок
Автор оригинала: nerezus
vovanium что мешает поставить ограничения в неограниченное состояние и не париться?
Скрипт, работающий на выделенном сервере под рут-правами так или иначе прервется. Доказано опытным путем на макоси, линуксе и т.п. Саму причину найти так и не удалось. Я считаю, дело в Апаче. Скрипт обрывался как после 2-х часов, так и после 6-ти. Таким образом, процесс нестабилен.

А автору бы порекомендовал посмотреть в сторону коротких скриптов и крона.

Схема такая:
Скрипт запускается => отрабатывает свою (небольшую) часть данных => запускает выполнение следующего скрипта (с уходом в /dev/null и &) => ...
Крон в свою очередь раз в минуту чекает, должен ли скрипт работать (можно эту информацию давать через файлы с номерами процессов скрипта), если должен, лезет в список процессов, если процесс отсутствует, перезапускает скрипт.

Крон тут нужен, потому что каким-то образом и процесс с запуском следующего скрипта после отработки 20-30 секунд первого скрипта иногда "слетает". Т.е. так можно подстраховаться.
 

Mandor

Новичок
Если автору нужно знать время до прерывания работы скрипта для того что чтобы корректно завершиться и сохранить состояние, то могу предложить альтернативный вариант: сохранять состояние на каждой итерации (либо раз в секунду/минуту), в конце работы скрипта очищать эту информацию, а в начале проверять её наличие (если есть - начинать с указанного места).
 

nerezus

Вселенский отказник
если ты никогда не имел дела с рессурсоемкими задачами, то не стоит думать что таких задач не бывает.
перечитай еще раз мой пост. Чтобы понять смысл.
И не надо на меня наезжать в стиле "если ты нихрена не имел опыта", это выглядит просто глупо.

под рут-правами
скрипт под апачем под рут-правами? [тут было нецензурное предложение частичной фрагментации тела вашего админа в целях предупреждения его репродукции]

Что касается либ, ну давай распарси xml-ку метров 300-500 с товарами и занеси это все ну допустим в базу магазина oscommerce ну или другого, я посмотрю как у тебя это за доли секунды будет происходить.
Ничто не мешает это сделать в консоли.

Крон в свою очередь раз в минуту чекает, должен ли скрипт работать (можно эту информацию давать через файлы с номерами процессов скрипта), если должен, лезет в список процессов, если процесс отсутствует, перезапускает скрипт.
О, Властелин Геморроя, что мешает сделать все с консоли(ее наличие подтверждено наличием крона)?
 

Resha

Новичок
nerezus, сервер не был публичным, паблик-фолдер Апача был закрыт htaccess'ом. Доступ к этому серверу (как по ssh, так и по http) осуществлялся только мной для запуска чисто служебных утилит.

Да, кстати, вообще говоря, я написал глупость. На Апач грешили вначале. Потом весь процесс был переведен на консоль (собственно, этот процесс и описан и вы правильно заметили про крон -> консоль). Тем не менее, скрипт падал. Даже та самая цепочка скриптов. Я не админ, причину указать не могу, логи ошибок не показывали. Впринципе, есть вероятность утечки памяти. Было это лет 5 назад, так что вспомнить что именно я там проверял, чтобы понять причину, не могу.

Я же привел пример, когда память стопроцентно будет освобождаться и вообще использоваться в небольших количествах.
 

vovanium

Новичок
Mandor
состояние на каждой итерации
Это скорее запасной вариант. Т.к. скрипт может вполне вырубиться между окончанием итерации и сохранением состояния, поэтому штатное прерывание и возобновление все равно лучше. Тем более что можно нормально дать команду интерфейсу, что скрипт прервался и соотвественно запустить продолжение выполнения.
nerezus
Ничто не мешает это сделать в консоли.
Просто пример, есть два проекта с одинаковым функционалом, твой с инструкцией как задачу делать в консоли и списком правильных хостеров, и другой в которой та же задача делается нажатием кнопки в cms'ке и при этом красиво показывает что происходит, прогресс, сколько времени осталось и который может нормально работать на любом хостинге. Ну и какому продукту отдадут предпочтение обычные клиенты, угадаешь?
 

alexv

Новичок
vovanium
но кнопка в смс и ежедневный импорт данных отнюдь не одинаковый функционал ;)

используя register_shutdown_function можно сохранять состояние

хотя nerezus прав, с сиротами лучше не связываться
 

iceman

говнокодер
Если знаешь сколько осталось до вырубания скрипта
ну дык ты его знаешь, 30 секунд, что мешает уложица в них? и успеть сохранить состояние? хотяб эксперементальным путем)

Resha
помню в 42 под Сталинградом...
 

vovanium

Новичок
alexv
Ты похоже не понял о чем речь. Есть какая-то рессурсоемкая задача (про импорт xml это лишь один из примеров, а то тут некоторые начали кричать, что php скрипты должны меньше секунды выполняться). Понятное дело что сделать чтобы эта задача работала в условиях без ограничений рессурсов это элементарно, но зачастую по разным причинам это неприемлимо (неважно нет доступа к консоли, нужно сделать более удобный выбор параметров задачи и чтобы запуск могла любая блондинка выполнить и т.п.). Вот как раз в таких случаях делается работа скрипта в несколько этапов.
Т.е. данный скрипт будет отлично работать и на консоли без ограничений, но если же есть ограничения, то не нужно будет рассказывать клиентам о плохом хостинге, криворуких админах и т.п.

используя register_shutdown_function можно сохранять состояние
Можно только опять же более геморно, т.к. во-первых вызов функции возможен в любом месте, во-вторых, вывод уже закрывается, в-третьих, скрипты может вырубать сам сервер, после определенного использования процессорного времени, а если скрипт ориентируется по времени остановки то его легко настроить на любое время работы.

хотя nerezus прав, с сиротами лучше не связываться
Это как бы личное дело каждого. Просто я делаю один массовый скрипт, и уже давно не рассчитываю только на идеальные условия хостинга, поэтому скрипт подстаивается под хостинг, а не хостинг нужно покупать под скрипт. ;)

-~{}~ 12.10.09 21:07:

iceman
ну дык ты его знаешь, 30 секунд, что мешает уложица в них
Ничего не мешает именно так и делаю, о чем писал ещё в начале темы, если есть ограничение 30 секунд, то после 29 секунды останавливается выполнение и ставится статус остановлено, после чего ajax интерфейс сам дергает скрипт и тот продолжает работу с места остановки. Т.е. в принципе если не выводить в логе сообщение о том, что работа была продолжена то для юзера это будет вообще прозрачно, он даже не догадается что были остановки.
 

alexv

Новичок
я вас понял правильно
но ТС на вопрос зачем? ответил "Чтобы вовремя корректно завершить работу скрипта и сохранить даные."
что и позволит эта функция

а в вашем случае, как вы определяете 29 секунду выполнения?
 

vovanium

Новичок
alexv
Ну ТС видимо еще не сталкивался с тем, что max_execution_time не единственное ограничение, и скрипты могут вырубаться сервером, без всяких извещений об ошибке вообще, поэтому в принципе и не юзаю register_shutdown_function, хотя изначально экспериментировал с ней.

Что касается 29 секунд, то обычное сравнение time() с временем окончания + блочная запись как в файл, так и в базу (чтобы не после каждой строки это делалось). Экпериментально убедился, что сравнение с time в таком случае практически не влияет на время выполнения. Кроме того пишется еще в специальный файл статус, по нему можно выводить инфу о прогрессе для интерфейса юзера, а также определять, что есть еще ограничения у сервера (т.е. если файл длительное время не обновлялся) и ввести это ограничение в настройки скрипта.

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

alexv

Новичок
все работает , только если есть мониторящий javascript ?
интересуюсь,тк когда-то ваял что-то очень похожее ;)
 

vovanium

Новичок
alexv
Ну в принципе зависит от типа запуска если запускаешь из крона или консоли, то там обычно без ограничений, поэтому скрипт работает без остановок, если же есть ограничения, то придется дергнуть скрипт для продолжения (это в принципе может делать второй запуск из крона, через минуту к примеру, тогда если была остановка то продолжаем, если нет, то просто выходим).
А когда работает из web, то скрипт запускается ajax-запросом и сразу закрывает вывод в броузер, а броузер потом с помощью ajax читает лог-файл и прогресс-файл, показывает что там и как и если нужно делает повторный запуск скрипта.

javascript же в принципе нужен для автоматизации, раньше делал к примеру, чтобы по завершению времени выполнения появлялась кнопка продолжить, при нажатии на которую просто обновлялась страница и процесс шел дальше, но зачем делать вручную то, что комп может сделать и сам :) А с ajax это получается еще и быстрее, и красивее :)
 

alexv

Новичок
кнопку продолжить можно и скриптом нажать

я делал проще
грузил php скрипт в iframe, тот при помирании писал цифру прогресса+META refresh если надо продолжить
js только читал из этого фрейма
 

vovanium

Новичок
alexv
Ну то уже детали реализации, просто я специально весь интерфейс делал web 2.0, он один раз загружается и после этого все команды отдаются и принимаются результаты с помощью ajax. В общем получилось красиво и функционально, скоро выйдет общедоступная версия, вот как выглядит лог в процессе выполнения, если интересно:
http://sypex.net/beta/img/sxd_200_log.png

частота обновления интерфейса в процессе выполнения по
умолчанию 3 раза в секунду (можно настраивать)
 

Resha

Новичок
Автор оригинала: iceman
ну дык ты его знаешь, 30 секунд, что мешает уложица в них? и успеть сохранить состояние? хотяб эксперементальным путем)
Resha
помню в 42 под Сталинградом...
Почему именно 30 секунд? А если не 30 секунд, а 2 часа? Не много ли времени автор убьет на эксперименты.

А тот подход, который использовал я, позволял в нон-стоп режиме сканить яндекс с гуглом 24 часа в сутки в 50 "потоков" (процессов). Причем все 50 "потоков" изначально генерились одним скриптом - "диспетчером". Собственно, он потом и следил, чтобы этих "потоков" всегда было 50 (точнее столько, сколько прописано в конфиге). Диспетчер занимался в том числе раздачей заданий скриптам. В случае с долгоиграющими заданиями их, во-первых, скорее всего можно распараллелить (тот же парсинг) или просто поделить на более маленькие последовательные задачи (если выполнение следующей задачи зависит от предыдущей). В итоге вам не нужно ставить 500 метров лимит памяти и 24 часа лимит выполнения. Все укладывается в дефолтные настройки, а при возможном сбое скрипта (например, в случае shutdown'а), задание выполняется снова.

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

Мне такого подхода хватало для того, чтобы "проанализировать" (парсинг с некоторым количеством в меру сложных регулярок) около 150 тысяч страниц выдачи поисковиков с углублением на один уровень по локальным ссылкам с этих страниц. Т.е. в сумме около 500-600 тысяч в сутки.
 

Agr

Новичок
возможно, самый простой путь - отловить аварийное завершение скрипта set_error_handler()
 

neznayka2

Новичок
Почему catch не срабатывает при
Fatal error: Maximum execution time of 30 seconds exceeded in
?
PHP:
try {  for ($i=0; $i<1000000;$i++) {
 print $i."\n"; 
} 
} catch (Exception $e) {
 print 'error';  
}
Вместо "printa" надо завершить соединение с БД и кое что еще.
 
Сверху