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

zerkms

TDD infected
Команда форума
потому что это не исключительная ситуация, а fatal error.
 

Alexandre

PHPПенсионер
2. Самое интересное, что актуально. Надо-ли ставить в скрипт дополнительный счетчик времени, или можно получить remained до max_execution_time средствами языка?
нельзя получить средствами языка

-~{}~ 11.11.09 10:54:

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

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

vovanium

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

Alexandre

PHPПенсионер
В каждом скрипте есть какие-то циклы. Так вот: эта небольшая часть данных и есть одна итерация...
Скрипт обрабатывает свою часть данных, дальше он анализирует свое время выполнения и если лимит приближается к тому, что задано в некоторой константе, то идет корректное сохранение результатов и перезапуск скрипта по вышеописанной схеме или чуть усложненной, напрмер кроме pid еще надо записать результаты промежуточных преобразований.
 

vovanium

Новичок
Alexandre
дальше он анализирует свое время выполнения и если лимит приближается к тому
и
остаточное время не вычисляется
как-то не совсем взаимосвязаны :) ну ты тоже считаешь время до лимита, просто насчет некоторой константы ты не совсем прав, так как это значение не постоянно и зависит от сервера, на одном сервере, можно спокойно запускать процессы по десятку минут, на другом же может быть ограничение в 10 секунд.
 

Alexandre

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

vovanium

Новичок
Какой нервный :)
Мне вообще-то все понятно, так как процесс описал еще на первой странице. А ты вместо наездов мог бы просто сказать что неудачно выразился ;)
 

Фанат

oncle terrible
Команда форума
nerezus, я поясню тебе, в чем тут фишка
ты общаешься с автором программы-мечты-всех-ламеров Сайпекс-дампер.
и для него (вслед за его клиентурой) разумеется, критично время выполнения онлайн скрипта. и ты его не переубедишь. миллион восторженных леммингов, которым его волшебная программа спасла жизнь, решив неразрешимую задачу дампа базы, убеждают аффтара в его правоте гораздо больше, чем ты :)
 

vovanium

Новичок
Фaнат
Речь не о дампере вообще-то.
Найди в первом посте Alexandre, что прерывание скрипта идет по времени. Он написал о выполнении по частям и том что остаточное время не вычисляется.
Я лишь уточнил, что вычисления лучше привязывать к времени... Более того там даже смайлик стоит, т.е. ничего такого страшного в словах автора нет, ладно бы там маты в его сторону были...
Или обсуждения на этом форуме уже запрещены, и можно только давать линки на faq и доки?
 

weregod

unserializer
neznayka2
потому что catch ловит эксепшн, а
> Fatal error: Maximum execution time of 30 seconds exceeded in
- необрабатываемый FATAL
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а у меня скрипт неделю работал (почту проверял) :)

изредка подвисал, бывало, но не раз в день точно
 

vovanium

Новичок
grigori
Если бы скрипты делались только для себя и своих серваков, было бы всё намного проще :)
 

fixxxer

К.О.
Партнер клуба
Элементарно:

PHP:
class TimeoutCatcher {

    protected $enabled = false;

    public function __construct() {
        register_shutdown_function( array($this, 'onShutdown') );
    }
    
    public function enable() {
        $this->enabled = true;
    }   
    
    public function disable() {
        $this->enabled = false;
    }   
    
    public function onShutdown() {
        if ($this->enabled) {
            print "Timed out!\n";
        }   
    }   
    
}

// test
set_time_limit(1);
$TimeoutCatcher = new TimeoutCatcher;
$TimeoutCatcher->enable();
// long operation
for ($i=0; $i<50000000; ++$i) { /* pass */ }
// end of long operation
$TimeoutCatcher->disable();
print "Finished!\n";
-~{}~ 10.12.09 20:54:

тут, конечно, не проверяется, что был именно таймаут - но на это обычно можно забить =)
 

nerezus

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

fixxxer

К.О.
Партнер клуба
фрилансеры с заказчиками это как раз фигня, а вот универсальные скрипты рассчитанные на установку на произвольный хостинг, тут сложнее %)

именно потому я с такими задачами просто не связываюсь, ага
 
Сверху