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

nerezus

Вселенский отказник
а вот универсальные скрипты рассчитанные на установку на произвольный хостинг, тут сложнее %)
А для чего таким продуктам время исполнения > пары секунд то?)
 

fixxxer

К.О.
Партнер клуба
это уже у тредстартера надо спрашивать =)

(пере)генерация какая нибудь.
 

antd2000

Новичок
Автор оригинала: nerezus
А для чего таким продуктам время исполнения > пары секунд то?)
Для перегонки xml (сотни Мегабайт) в БД.

Кстати сработало ini_set("max_execution_time", "0");
 

seelts

Новичок
Автор оригинала: 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:

тут, конечно, не проверяется, что был именно таймаут - но на это обычно можно забить =)
fixxxer, спасибо. Мне помогло. Хотя у меня задача немного другая была. От себя только добавил "error_reporting(0)" в начало, чтобы лишне не выводилось.
 

TutanXamoN

Новичок
Интересно, сколько за свою работу получают фрилансеры, пишушие скрипты для заказчиков, которым дорого потратить несколько баксов в месяц на нормальный хостинг.
nerezus
Копейки... Но при правильном выборе проектов и заказчиков получать в месяц 2,5к$+ абсолютно реально, причем имея 3 выходных дня в неделю.

Если же по теме, то:
аффтар преследует некоторую цель которую объяснить нам не удосужился и тем не менее уверен что решение его проблемы кроеццо исключительно в том как узнать время до конца выполнения.
Рассчитывать время до конца выполнения, вводить определённую систему сохранения/приостановки/продолжения
задачи крайне геморно.
Задача в текущей постановке не имеет красивого и быстрого решения (ИМХО), может сменим формулировку и обсудим реальную проблему?
 

seelts

Новичок
Вполне вероятно, что автору эта тема уже неинтересна/неактуальна - началось всё почти год назад.
Я же просто спасибо fixxxer'у написал, потому как в моей задаче это было решением.

Возможно и автор преследовал такие же цели как и я - иметь возможность корректно завершить скрипт, даже если он будет остановлен "ненормальным" способом.

К тому, что я написал в предыдущем посте ещё добавил "err_handler()", потому как некоторые хостеры дополнительно пишут логи с ошибками в файл. Чтобы этот файл не писался/не разростался, я заменил стандартный обработчик ошибок своим. Единственное, что он делает - возвращает true.
 

dimagolov

Новичок
Автор оригинала: seelts
....добавил "err_handler()", потому как некоторые хостеры дополнительно пишут логи с ошибками в файл. Чтобы этот файл не писался/не разростался...
Феерично! А просто исправить ошибки религия не позволяет?
 

seelts

Новичок
Если бы можно было исправить ошибку, возникающую при превышении времени исполнения, то эта тема вообще не возникла бы...

Замдиректору не плохо было бы читать всю тему, а не последние пару постов. Или религия не позволяет?
 

dimagolov

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

dimagolov

Новичок
что мешает пускать долгоиграющие скрипты в CLI моде, если все равно нужно как-то доделывать прерванные задачи?
 

Viktor_Rez

Новичок
Типичная проблема на хостингах за "400" рублей в месяц.
И как правило проблема не в логике приложения, а в объемах обрабатываемых данных.

Если хостинг в crontab'e юзает wget или curl, тогда надо юзать редирект на "самого себя" с get параметром отсечения обработанных данных.
 

seelts

Новичок
Меня всегда поражает эта вот особенность у многих людей: предложить решение другой задачи вместо конкретной заданной.
Да, возможно, изначальная цель достигается огромным кол-вом других более изящных способов. Однако был конкретный вопрос - как узнать оставшееся время. Насколько я понял, ответом является "никак".
Может пора уже закрыть тему? Тем более что и автора тут уже не видно.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
seelts
А меня поражают такие археологи как ты.
 

Viktor_Rez

Новичок
seelts print "Timed out!\n"; Ну как так... Ты хоть видел реально программиста который вот так вот подвёл черту под своим алгоритмом!
 

seelts

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

Viktor_Rez

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

Автор оригинала: antd2000
Как известно max_execution_time это не есть реальное время выполнения скрипта, а "чистое время" которое скрипт занимает у процессора.
То есть скрипт может например выполнятся хоть 10 минут и запросто уложится в max_execution_time 30 сек.

Так вот.
Можно как то узнать в скрипте - сколько скрипт уже занял этого самого процессорного времени?
Пожалуйста - не утаивайте от нас тайну! Что вам сказал fixxxer! Ведь ваш ответ может быть войдет в историю!
 

seelts

Новичок
Viktor_Rez,
если это был ко мне вопрос, то

он мне ничего не сказал. он всего лишь привёл тут пример использования функции register_shutdown_function()... это и помогло мне решить мою задачу.
А ответом на вопрос "Можно как то узнать в скрипте - сколько скрипт уже занял этого самого процессорного времени?", насколько я понимаю является "никак".
 

Viktor_Rez

Новичок
seelts
Понимаю. Дело хорошее, помогать google или yandex индексировать замечательный форум на предмет часто встречающихся задач. =)
 
Сверху