Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Cron запуск по порядку
 
 автор: sl1p   (10.04.2011 в 03:53)   письмо автору
 
 

Прошу прощения если не туда.

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

Пытаюсь таким способом решить ограничение max_execution_time..(скрипт должен работать около 15 часов) Возможно копать нужно не под крон даже, а посоветуете иные идеи реализации сего?

  Ответить  
 
 автор: cheops   (10.04.2011 в 16:05)   письмо автору
 
   для: sl1p   (10.04.2011 в 03:53)
 

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

  Ответить  
 
 автор: sl1p   (11.04.2011 в 02:41)   письмо автору
 
   для: cheops   (10.04.2011 в 16:05)
 

я так впринципе и метился.. спасибо..

А есть ли какието ещё способы решения работы скрипта такой длительности?

  Ответить  
 
 автор: sl1p   (11.04.2011 в 21:45)   письмо автору
 
   для: cheops   (10.04.2011 в 16:05)
 

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

  Ответить  
 
 автор: cheops   (12.04.2011 в 07:14)   письмо автору
 
   для: sl1p   (11.04.2011 в 21:45)
 

Обработка этой ситуации зависит от того, что позволено cron, в частности достаточно ли у вас прав и есть ли возможность запуска команды ps, чтобы можно было обнаружить процессы по их pid. Если нет, то можно измерить время выполнения команды (к сожалению, оно физически очень часто превышает 30 секунд) и снимать флаг по тайм-ауту.

  Ответить  
 
 автор: sl1p   (12.04.2011 в 10:05)   письмо автору
 
   для: cheops   (12.04.2011 в 07:14)
 

Случайно в голову пришла идея: вместо флага писать текущее время + 30сек например (в скрипте идёт цикл, одна итеррация занимает примерно 10 секунд, каждую итеррацию флаг обновляется, т.е. снова текущее время +30 сек. Вначале скрипта просто идёт проверка на то, является ли текущее время больше того которое во флаге, если же да, значит предыдущий вызов крона уже умер и не обновляет флаг. Идея достойна жизни?)

  Ответить  
 
 автор: cheops   (12.04.2011 в 12:41)   письмо автору
 
   для: sl1p   (12.04.2011 в 10:05)
 

Хорошая мысль, только по возможности нужно разделить задачи ожидания и вычисления. Ждать ответ сети или MySQL скрипт может очень долго и это время не входит в 30 секунд машинного времени, отводимого скрипту.

  Ответить  
 
 автор: sl1p   (12.04.2011 в 14:10)   письмо автору
 
   для: cheops   (12.04.2011 в 12:41)
 

Хм, а как же здесь быть, каким образом разделить?..

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

  Ответить  
 
 автор: cheops   (12.04.2011 в 14:23)   письмо автору
 
   для: sl1p   (12.04.2011 в 14:10)
 

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

  Ответить  
 
 автор: sl1p   (12.04.2011 в 15:19)   письмо автору
 
   для: cheops   (12.04.2011 в 14:23)
 

хмхм.. понял но не до конца, что решит разбивка этих задач?

  Ответить  
 
 автор: cheops   (12.04.2011 в 15:22)   письмо автору
 
   для: sl1p   (12.04.2011 в 15:19)
 

Маштабируемость, в случае задания-загрузки вы будете знать, что загрузка идет долго, но никогда не достигнет 30 секунд, даже если фактически файл качается часами. А в случае задания-обработки длительность будет примерно равна 30 секунд, так как будут идти сплошные вычисления.

  Ответить  
 
 автор: sl1p   (12.04.2011 в 15:42)   письмо автору
 
   для: cheops   (12.04.2011 в 15:22)
 

тоесть если скрипт будет тянуть файл откудато больше лимита, он таки его дотянет?

  Ответить  
 
 автор: cheops   (12.04.2011 в 16:28)   письмо автору
 
   для: sl1p   (12.04.2011 в 15:42)
 

Да, время которое он использует для загрузки по сети, обычно не учитывается в лимите, которое отводится скрипту на выполнение (даже если это часы работы).

  Ответить  
 
 автор: sl1p   (12.04.2011 в 16:35)   письмо автору
 
   для: cheops   (12.04.2011 в 16:28)
 

хмхм, не знал, хотя замечал что иногда намного дольше происходит работа скрипта чем лимит... очень полезно, спасибо.

  Ответить  
 
 автор: sl1p   (15.04.2011 в 21:56)   письмо автору
 
   для: cheops   (12.04.2011 в 16:28)
 

хм, скажите а функция sleep() использует лимит? Всмысле учитывается как время вычислений?

  Ответить  
 
 автор: cheops   (15.04.2011 в 22:17)   письмо автору
 
   для: sl1p   (15.04.2011 в 21:56)
 

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

  Ответить  
 
 автор: sl1p   (15.04.2011 в 23:22)   письмо автору
 
   для: cheops   (15.04.2011 в 22:17)
 

хм спасибо)

А возможно гдето можно прочитать об этой системке, как всё таки точно происходит?..

  Ответить  
 
 автор: cheops   (16.04.2011 в 08:42)   письмо автору
 
   для: sl1p   (15.04.2011 в 23:22)
 

Собственно есть только небольшое замечание в документации

The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

которое можно перевести так

Функция set_time_limit() и директива max_execution_time влияют только на время выполнения самого скрипта. Расход времени на любую активность, которая случается вне его, такая как вызов системных команд с использованием system(), сетевые операции, запросы к базам данных и т.д. не включаются в максимальное время исполнения скрипта. Это не относится к Windows, где измеряется фактическое время.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования