Могу ли я сделать часть кода тайм-аут? - PullRequest
4 голосов
/ 15 августа 2011

Я работаю с классом, который устанавливает удаленное соединение с сервером. Проблема, с которой я сталкиваюсь, заключается в том, что если соединение не получает ответ, оно будет ждать, пока оно не получит.

Этот класс не имеет встроенного тайм-аута, и Я не хочу изменять его, если смогу избежать его .

Есть ли способ, которым я могу обернуть часть кода в что-то вроде этого?

try(timeout seconds){
}catch(){
    //exception handle
}timeout(){
    // timeout handline
}

РЕДАКТИРОВАТЬ: я использую удаленное подключение в качестве одной проблемы. У меня есть и другие, которые мне нужно решить с этим, например, системные вызовы с exec или другие подобные вещи.

1 Ответ

2 голосов
/ 15 августа 2011

Не только для части кода.

Однако есть альтернативные решения, без изменения исходного кода, как требуется:

set_time_limit

set_time_limit() прервет весь сценарий, если он выполняется слишком много времени. Вы все еще можете настроить функцию отключения .

pcntl_alarm

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

Время ожидания по умолчанию

Если класс использует потоковые функции, вы можете установить время ожидания по умолчанию:

ini_set('default_socket_timeout', 5);
stream_context_set_default(array(
    'http' => array(
        'timeout' => 5, 
    ),
));

Выполнить в отдельном процессе

Вы можете выполнить форк с pcntl_fork(), но это не подходит для серверной среды.

Вы также можете использовать proc_open или popen, чтобы выполнить скрипт PHP в отдельном процессе и завершить его, если он выполняется слишком долго. (После того, как процесс порожден, выполните ожидание ожидания в потоке stdout процесса с stream_select.)

Или настроить сервер для обработки этих задач.

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