Как пропустить процесс или функцию, если она не дает результата в течение фиксированного времени? - PullRequest
2 голосов
/ 16 июля 2010

В PHP я видел, что, если определенный процесс или функция не завершены, из-за этого задерживается все приложение, которое включает эту функцию.который включает в себя более 20 функций.Функция «x» отнимает слишком много времени, поэтому страница результатов задерживается из-за этого.У меня вопрос, как мне установить ограничение по времени для функции «X», скажем, 2 секунды, и если оно не будет выполнено в течение этого времени, то функцию «X» следует пропустить.сделать это или лучше?

Ответы [ 4 ]

2 голосов
/ 16 июля 2010

Итак, если вы говорите о file_get_contents (почему вы не сказали это сразу?), Вы можете указать время ожидания, используя контексты потока:

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 10
        )
    )
);
file_get_contents("http://example.org/", 0, $ctx);

См. HTTP-контекстОпции .

При использовании curl используйте curl_setopt для CURLOPT_TIMEOUT.

curl_setopt($curl, CURLOPT_TIMEOUT, 10);

. Время ожидания будет установлено на десять секунд.

1 голос
/ 16 июля 2010

Не прямой ответ на ваш вопрос, но, возможно, возможное решение вашей проблемы:

Смешаны ли результаты поиска разных сайтов в одном большом результате?

Если нет, ябудет использовать ajax для одновременной загрузки различных разделов / результатов, показывая суб-результаты, как только они станут доступны.

Если вы хотите смешать все суб-результаты, вы все равно можете сделать то же самое, сохраняя суб-результаты.приводит к сеансу и генерирует ваш окончательный результат, когда все 20 известны или когда прошло определенное время.

Однако это сильно зависит от javascript ...

Редактировать: jqueryпример:

Используя jquery, вы можете загрузить разные результаты в различных div:

javascript

/* start loading results when the document is loaded */
$(document).ready(function() {
    $("#results01").load("http://www.mysite.com/page_results_01.php");
    $("#results02").load("http://www.mysite.com/page_results_02.php");
    ...
    $("#results20").load("http://www.mysite.com/page_results_20.php");
});

html

<div id="results01">Loading results from page 01 ...</div>
<div id="results02">Loading results from page 02 ...</div>
...
<div id="results20">Loading results from page 20 ...</div>

Emtpy div не показывается, поэтому вы можете избавиться от текста, если не хотите его ...

0 голосов
/ 16 июля 2010

Каноническим способом обработки чего-либо подобного без обращения к пулу потоков является сигнал тревоги.Вот что я смог найти в быстром поиске документации по PHP:

http://php.net/manual/en/function.pcntl-signal.php

http://php.net/manual/en/function.pcntl-alarm.php

0 голосов
/ 16 июля 2010

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

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