Реклама на сайте Advertise with us

Таймаут исполнения РНР скрипта на сервере.

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Считаю до трех

С нами с 23.03.05
Сообщения: 12353
Рейтинг: 2918

Ссылка на сообщениеДобавлено: 04/03/06 в 17:32       Ответить с цитатойцитата 

Дело вот в чем. Написал я для себя простенький скрипт, который просматривает всю базу галер у ТГП на предмет нерабочих линков. Ну и грубо говоря сносит нерабочие линки. Потом отчет на мыло присылает. Запускать предполагалось Кроном раз в сутки.
Так вот - проявилась следующая неожиданная проблема: операция проверки каждого линка занимает некоторое время, и в результате скрипт прекращает свое выполнение видимо по наступлению какого-то таймаута. При попытке запуска локально на Денвере он ругается:
"Fatal error: Maximum execution time of 30 seconds exceeded".
при этом не успевая проверить даже десяток линков.

Это можно как-то побороть или я изначально выбрал неправильную статегию написания подобного скрипта?

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 04/03/06 в 17:47       Ответить с цитатойцитата 

В самом начале скрипта ставь строчку <?php set_time_limit(600);?> где 600 - время исполнения в секундах... 0 - выполнять бесконечно, пока невыполнится или сервер неупадет icon_smile.gif

6
 

Считаю до трех

С нами с 23.03.05
Сообщения: 12353
Рейтинг: 2918

Ссылка на сообщениеДобавлено: 04/03/06 в 17:54       Ответить с цитатойцитата 

Спасибо, оценил.
Пробую.

0
 



С нами с 26.02.03
Сообщения: 2366
Рейтинг: 987

Ссылка на сообщениеДобавлено: 04/03/06 в 21:38       Ответить с цитатойцитата 

Создай файл .htaccess следующего содержания:
php_value max_execution_time 300
и поместить его в каталог со скриптом (300 - это время выполнения скрипта в секундах, вместо него можно указать другое значение).

3
 

www.awm-tools.com

С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056


Передовик Master-X (01.01.2006) Передовик Master-X (16.01.2006) Передовик Master-X (01.03.2006)
Ссылка на сообщениеДобавлено: 04/03/06 в 23:08       Ответить с цитатойцитата 

Вариант с увеличением времени выполнения скрипта не корректен с точки зрения безопасности и надежности работы сервера.

Данные задачи решаются путем запуска крона, например, каждые 5 минут. За один раз идет проверка фиксированного кол-ва линков.

Засабмить свой вебмастерский ресурс, получи PR!

3
 



С нами с 09.09.05
Сообщения: 148
Рейтинг: 129

Ссылка на сообщениеДобавлено: 05/03/06 в 14:40       Ответить с цитатойцитата 

A d u l t писал:
Вариант с увеличением времени выполнения скрипта не корректен с точки зрения безопасности и надежности работы сервера.
Данные задачи решаются путем запуска крона, например, каждые 5 минут. За один раз идет проверка фиксированного кол-ва линков.
а где тут могут возникнуть проблемы с безопасностью? smail12.gif ходит себе скрипт по урлам, никого не трогает...
у меня ни разу не было проблем со скриптами, что крутились по пол часа...
2топикстартер:
есть маза задачу пускать форками... то бишь pcntl_fork(); пускай с десяток потоков, в 10 раз быстрее работать будет. ну и по желанию сэт_тайм_лимит(0)ж icon_smile.gif
зы: при многопоточности не забываем лочить файлы и/или таблицы! icon_smile.gif

1
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/03/06 в 16:37       Ответить с цитатойцитата 

Во-первых, не советую ставить на рабочем сервере примочку pcntl к пхп. Она переколбашивает все системные вызовы (exec,system,mail) таким образом, что там где должен был вернуться результат true, возвращается false и там где процесс должен был вернуть 0, возвращается 255.

Во-вторых, вариант с увеличением времени выполнения скрипта не корректен с точки зрения безопасности и надежности работы сервера ТОЛЬКО в случае глобального увеличения таймаута в php.ini, а при увеличении таймаута конкретного скрипта не вижу ничего болезненного (если афтар знает что делает)

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

В четвертых, для этих целей рекомендую не дергать скрипт через HTTP, а дергать из под шелла с помощью /usr/local/bin/php - тогда все проблемы самоликвидируются.

3
 

Web Developer С++

С нами с 25.11.01
Сообщения: 859
Рейтинг: 759

Ссылка на сообщениеДобавлено: 05/03/06 в 17:51       Ответить с цитатойцитата 

Могу взять тестером системы:
http://www.dfservice.com/site-monitor/index.html.ru.htm

Последняя версия работает без использования крон(и трафика тоже) и в несколько потоков.

Софт для вебмастеров, криптобот, программинг (C++/PHP), партнерка: https://dfservice.com/ru/

1
 

Cкриптоманьяк

С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245

Ссылка на сообщениеДобавлено: 05/03/06 в 20:32       Ответить с цитатойцитата 

Pentarh писал:
Во-первых, не советую ставить на рабочем сервере примочку pcntl к пхп. Она переколбашивает все системные вызовы (exec,system,mail) таким образом, что там где должен был вернуться результат true, возвращается false и там где процесс должен был вернуть 0, возвращается 255.


Оппа. А я думаю, в чем дело, какого хера по статусу не удается результат вызова проверить. Бум знать на будущее.
Кстати, с обработчиком сигналов в том же pcntl не работал? А то есть ощущение, что нихера он не обрабатывает.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/03/06 в 20:42       Ответить с цитатойцитата 

Xrenoder писал:
Оппа. А я думаю, в чем дело, какого хера по статусу не удается результат вызова проверить. Бум знать на будущее.
Кстати, с обработчиком сигналов в том же pcntl не работал? А то есть ощущение, что нихера он не обрабатывает.

Я тоже долго думал в чем дело, потом накопал в гуглгрупс что это такой прикол pcntl. Причем разработчики не помню как аргументируют, но багом это не считают. Наоборот, типа фишка icon_smile.gif

С обрабочиком сигналов работал. Вот кусок кода из утилитки-демона, которая мониторит мускуль и в случае чего поднимает. Здесь задача при любом выходе убить свой pid-файл. Повесил обработчики:

Код:
function sig_handler($signo)
{
    global $mypid;
    switch ($signo) {
            case SIGTERM:
            case SIGINT:
                // handle shutdown tasks
                @unlink($mypid);
                syslog(LOG_NOTICE,"Cautch term signal. Exiting.");
                exit("Cautch term signal\n");
                break;
            default:
                break;
    }
}

pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");

register_shutdown_function("sig_handler",SIGTERM);


Все работает, только вот когда делаю 'kill pid' то пид нифига не убивается, хотя есть обработчик на SIG_TERM icon_sad.gif

0
 

Cкриптоманьяк

С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245

Ссылка на сообщениеДобавлено: 06/03/06 в 02:55       Ответить с цитатойцитата 

Pentarh писал:
Я тоже долго думал в чем дело, потом накопал в гуглгрупс что это такой прикол pcntl. Причем разработчики не помню как аргументируют, но багом это не считают. Наоборот, типа фишка icon_smile.gif
С обрабочиком сигналов работал. Вот кусок кода из утилитки-демона, которая мониторит мускуль и в случае чего поднимает. Здесь задача при любом выходе убить свой pid-файл. Повесил обработчики:
Код:
function sig_handler($signo)
{
    global $mypid;
    switch ($signo) {
            case SIGTERM:
            case SIGINT:
                // handle shutdown tasks
                @unlink($mypid);
                syslog(LOG_NOTICE,"Cautch term signal. Exiting.");
                exit("Cautch term signal\n");
                break;
            default:
                break;
    }
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
register_shutdown_function("sig_handler",SIGTERM);

Все работает, только вот когда делаю 'kill pid' то пид нифига не убивается, хотя есть обработчик на SIG_TERM icon_sad.gif


А какие сигналы у тебя проверено обрабатываются? INT? У меня не ловило TERM и ABRT, после чего я плюнул на это дело и пошел в обход.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 06/03/06 в 02:58       Ответить с цитатойцитата 

Как видишь, TERM, INT

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 06/03/06 в 02:59       Ответить с цитатойцитата 

TERM = kill
INT = Ctrl-C

0
 



С нами с 21.01.05
Сообщения: 34
Рейтинг: 24

Ссылка на сообщениеДобавлено: 06/03/06 в 06:36       Ответить с цитатойцитата 

Pentarh писал:

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

Вот про если можно поподробней, вылетает скрипт при запуске через web
Код:

ignore_user_abort (1)
set_time_limit (1000)

Если в браузер, то до конца работает.
И вылетает без ошибок, наверно апач прибиавет или еще что ?
Какие еще причины могут быть ?
Я уже запарился, может дело в этой буферизации ?
ob_implicit_flush () это ?

1
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 06/03/06 в 18:27       Ответить с цитатойцитата 

Дело в том что апач убивает процесс если тот долго ничего не выводит в поток. По этому для тебя решением будет логгирование работы скрипта.

Скажем, отпарсил галерку и выбрасываешь в поток строку, отключая буферизацию:
Код:

echo "Gallery $url done <br>\n";
flush(); ob_flush();


тогда апач будет видеть что скрипт "живой" и не будет его убивать. А таймлимит оставь.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 06/03/06 в 18:33       Ответить с цитатойцитата 

2xrenoder: я подумал мож у тебя значение константы SIGTERM php не соответствует значению системной константы TERM. Посмотри "man 1 kill", там для твоей системы должны быть численные значения этих констант.

0
 

Cкриптоманьяк

С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245

Ссылка на сообщениеДобавлено: 07/03/06 в 13:50       Ответить с цитатойцитата 



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

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »