Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Ограничение по времени [2]
Что нам это дает, после завершение скрипта, через пару микросекунд, он снова себе же вызовет???
Когда скрипт завершает свою работу, вызывается функция register_shutdown_function. В момент, когда внутри нее произойдет вызов скрипта самим себя - да, будет на короткое время существовать две копии скрипта, и, чтобы не было двойной обработки, я добавил в начало скрипта вызов usleep(100) - 100мс вполне достаточно, чтобы скрипт, вызвавший своего "наследника", успел завершиться.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
tuareg
Отправлено: 26 Июня, 2012 - 13:42:01
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
К сожалению вариант с sistem не подойдет. На хостинге safe_mode=Off;
Есть ли другой вариант?
Zuldek
Отправлено: 26 Июня, 2012 - 13:51:04
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
tuareg пишет:
К сожалению вариант с sistem не подойдет. На хостинге safe_mode=Off;
Есть ли другой вариант?
пинайте его с внешки. Если есть по SSH доступ или банально http запросами, больше ничего не знаю. Кроном каждую минуту врятли разрешат скрипт пинать, раз у них такие настройки. В принципе если можно каждые 5 минут, то этот вариант вам тоже подходит: в ночь запускайте и все отработает нормально. Если раз в час, - уже хуже. Тогда имхо только запускать с внешки.
EuGen
Отправлено: 26 Июня, 2012 - 13:56:11
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Zuldek пишет:
Кроном каждую минуту
Крон только - да - самое большее - раз в минуту может. А речь о 20 секундах.
А изначальная задача - в чем? Может, она дискретизируема? То есть к примеру, нужно обработать N записей в БД. Занимает это M секунд (M>20); стало быть, разбивать нужно по floor(20*N/M) записей на 1 копию скрипта. И запускать не последовательно, а параллельно даже (ну или частично - скажем, по 5 секций за раз - это уж как ресурсы позволяют)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
tuareg
Отправлено: 26 Июня, 2012 - 14:07:39
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Итак задача. Из БД нужно вытащить. Около 600-700(на данный момент) полей типа longtext
В цикле по ним нужно пройтись разбить на слова и т.д. На локальной машине, при количестве около 1000 записей, выскакивает ограничение по времени 30 секунд. Смысла перенастраивать limit по времени я не вижу, т.к наверняка, подобные ограничения есть и на хостингах, да и потом ну увеличу до 1 мин. Станет 1500 записей надо будет снова увеличивать. это путь в никуда!.
Я изначально и хотел сделать так что вытаскиваю допустим 40-50 записей, обработал их. Перезапустил скрипт (через сессию передал номер следующей) и т.д пока необработанных записей не осталось. Вот вкратце.
EuGen пишет:
И запускать не последовательно, а параллельно даже (ну или частично - скажем, по 5 секций за раз - это уж как ресурсы позволяют)
Лучше запускать последовательно. Потому что ведется определенная статистика
EuGen
Отправлено: 26 Июня, 2012 - 14:21:45
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
tuareg
Ну тогда Ваша задача дискретизируется идеально. Пишете, например, bash-скрипт такого содержания:
- где N - число записей, которые успевают обработаться за 20 секунд, M - число получившихся секций, /path/to/php - узнайте у хостера, где располагается cli-версия интерпретатора, ну или попробуйте вызывать просто php - возможно, он находится в стандартных каталогах и определится системой и без полного пути.
В самом скрипте делаете примерно так:
$rSelect=mysql_query('SELECT * FROM `table` LIMIT '.$iOffset.', '.$iCount);
//handle select ..
- а сам bash-скрипт (его текст) можно сгенерировать автоматически другим скриптом - думаю, это не составит труда.
При желании можно bash-скрипт заменить вызовом через Web и передачей параметров через $_GET - как вариант, но тогда нужно позаботиться о том, чтобы произошел последовательный вызов. Сделать это не сложно - у себя на клиенте пишете такой скрипт:
- запускаете его на своей уже локальной машине, а в script.php делаете аналогично примеру выше, но $_SERVER, разумеется, изменяете на $_GET с соответствующими правками.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
tuareg
Отправлено: 26 Июня, 2012 - 14:28:26
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
EuGen Да я уже и сам понял.
Спасибо. Придется так и сделать. Печально, конечно, что нельзя сделать штатно PHP, ну что делать.
Еще раз спасибо
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.