Привет, есть возможность установить ограничение по времени только команде или только функции, например:
function doSomething() { //..code here.. function1(); //.. some code here.. }
Я хочу установить ограничение по времени только для функции1.
Там выходит set_time_limit, но я думаю, что это устанавливает ограничение по времени на весь скрипт. Любая идея?
set_time_limit () запускается глобально, но его можно сбросить локально.
Установите количество секунд, в течение которых сценарий можно запустить. Если это будет достигнуто, скрипт вернет фатальную ошибку. Предел по умолчанию составляет 30 секунд или, если он существует, значение max_execution_time, определенное в php.ini.
Когда
set_time_limit(
,set_time_limit(
) перезапускает счетчик тайм-аута с нуля. Другими словами, если таймаутом является значение по умолчанию 30 секунд и 25 секунд для выполнения скрипта, выполняется вызов типа set_time_limit (20), скрипт будет работать в общей сложности за 45 секунд до истечения времени ожидания.
Я не тестировал его, но вы можете установить его локально, сбросив его, когда вы покинете
<?php set_time_limit(0); // global setting function doStuff() { set_time_limit(10); // limit this function // stuff set_time_limit(10); // give ourselves another 10 seconds if we want // stuff set_time_limit(0); // the rest of the file can run forever } // .... sleep(900); // .... doStuff(); // only has 10 secs to run // .... sleep(900); // ....
set_time_limit
() … Любое время, затрачиваемое на активность, которое происходит вне выполнения сценария, например системные вызовы с использованием system (), потоковые операции, запросы к базе данных и т. д., не включается при определении максимального времени выполнения сценария , Это не относится к Windows, где измеренное время реально.
Вам нужно будет самим закодировать это, если вы хотите, чтобы функция1 возвращалась, когда истекает срок.
function doStuff($seconds) { $finish=time()+$seconds; $done=false; $timeout=false; while (!$done && !$timeout) { //do stuff here, set $done to true if you complete //out of time? $timeout=time() >= $finish; } return $done; //let caller know if we completed }
Разумеется, «материал», который вы делаете, должен быть итеративным, чтобы вы могли продолжать проверять свое истекшее время и, при необходимости, выйти.
Если вы хотите выполнить тайм-аут произвольной функции и вернуть управление вам, это не поддерживается. Если вам действительно нужно это сделать, спросите его как отдельный процесс. Затем вы можете закрыть процесс, если он, кажется, слишком долго.
$endtime=time()+10; while(time()!=$endtime){ echo "."; }
в$endtime=time()+10; while(time()!=$endtime){ echo "."; }
Нет, это невозможно: max_execution_time
используется как мера безопасности, чтобы избежать ошибок на скриптах (например, бесконечный цикл), уничтожить сервер; но он не предназначен для работы на основе функциональных блоков.
И тот факт, что он заканчивается с Fatal Error, определенно не очень приятен для пользователя в любом случае …
Я использую exec для запуска shellscript, который генерирует экспорт из внешнего приложения. Если скрипт работает слишком долго, достигается max_execution_time, и пользователь никогда не узнает, что произошло. Ограничение на такую функцию поможет мне определить, близок ли конец и отправить некоторую удобную для пользователя ошибку.
Я не думаю, что это возможно, но зачем вам это делать? Если сценарий когда-либо прерывается, я, возможно, не хочу, чтобы вы этого хотели. Это должно быть больше похоже на защиту от вас самих (на всякий случай вы загружаете бесконечный цикл или что-то, что займет несколько часов), но если ваш сценарий занимает много времени, вы должны либо дать ему время, сколько потребуется, либо изменить скрипт так что он работает быстрее (для некоторых кронов это нормально, но если обычный скрипт, который вызывается довольно часто, занимает больше времени по умолчанию, вы можете столкнуться с серьезными проблемами производительности)