время выполнения функции в PHP или что-нибудь еще - PullRequest
8 голосов
/ 27 сентября 2011

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

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

ОК, я знаю, что, например, есть функция set_time_limit (), которая возвращает фатальную ошибку, но я не хочу этого, я хочу, чтобы мой код просто продолжался через x секунд, или, возможно, после превышения времени, бросил исключение, поймал это и делать что-то еще?

Пишет ли какое-то решение для функции "сторожевой таймер" и как это сделать?

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

BR, Newman

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

PHP не предоставляет общего способа тайм-аута функции. Но многие компоненты, где эта проблема является распространенной, позволяют вам определить время ожидания.

Примеры:

  • Оболочка потока HTTP позволяет указать параметр timeout:

    file_get_contents('http://example.com', false, stream_context_create(
        array('http' => array('timeout' => 10 /* seconds */))
    ));
    
  • PDO (уровень абстракции базы данных) позволяет вам установить тайм-аут, используя атрибут PDO::ATTR_TIMEOUT (обратите внимание, что этот атрибут может означать разные вещи с разными драйверами базы данных):

    $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10 /* seconds */);
    
  • Вы можете установить тайм-аут соединения при использовании FTP :

    $ftp = ftp_connect('example.com', 21, 10 /* seconds */)
    

Точно так же все другие расширения, которые обращаются к потенциально удаленным ресурсам, будут предоставлять такие параметры или опции тайм-аута.

0 голосов
/ 27 сентября 2011

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

Я бы предложил посылать время вашего исключения из ваших функций, используя такие вещи, как microtime(), и выбрасывать исключение, если превышен лимит времени; исключение, которое вы сможете поймать снаружи и продолжать действовать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...