PHP задает допустимое время выполнения функции, возвращает значение по умолчанию, если время выполнения превзойдено [дубликат]

Простое обновление к API версии Java 8

public Map<String, List<String>> splitQuery(URL url) {
    if (Strings.isNullOrEmpty(url.getQuery())) {
        return Collections.emptyMap();
    }
    return Arrays.stream(url.getQuery().split("&"))
            .map(this::splitQueryParameter)
            .collect(Collectors.groupingBy(SimpleImmutableEntry::getKey, LinkedHashMap::new, **Collectors**.mapping(Map.Entry::getValue, **Collectors**.toList())));
}

и toList () необходимо использовать с коллекторами, которые не были указаны в верхнем ответе. В противном случае это приведет к ошибке компиляции в IDE

2
задан IMB 22 March 2012 в 08:10
поделиться

3 ответа

Вы не можете ограничить время выполнения функцией в PHP. Однако не отчаивайтесь: если вы указали, что ваша функция читает URL-адрес, вы можете использовать расширение curl , у которого есть опции, заданные опциями через curl_setopt , как показано ниже:

CURLOPT_TIMEOUT Максимальное количество секунд для выполнения функций cURL. CURLOPT_CONNECTTIMEOUT Количество секунд ожидания при попытке подключения.

Используя их, вы можете ограничить фактическое время, затрачиваемое на обработку URL с помощью curl.

Вы также можете использовать расширение http , которое также позволяет вам выполнять http-соединения и имеет параметры времени ожидания .

Наконец, вы может использовать опции контекста - file_get_contents :

$opts = array('http' =>
    array(
        'timeout' => 1.5 // 1.5 seconds
    )
);

$context = stream_context_create($opts);

$result = file_get_contents('http://example.com/getdata.php', false, $context);
3
ответ дан StasM 19 August 2018 в 02:46
поделиться

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

Если вы использовали cURL, вы можете использовать curl_multi_exec , чтобы получить это поведение несколько вручную или просто указать время ожидания, а затем функция может вернуть значение false.

Пример:

function my_func($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // timeout after 10 seconds

    // .. set other options as needed
    $result = curl_exec($ch);

    if ($result === false) {
        // timeout or other failure
        return false;
    }
}

Теперь функция не будет работать дольше 10 секунд из-за таймаута. Вы также можете использовать curl_errno () для проверки таймаута:

if (curl_errno($ch) == 28) {
    // timeout was exceeded
}
2
ответ дан drew010 19 August 2018 в 02:46
поделиться

Сделайте что-то вроде:

foreach ($arr as $k => $v)
{
    $before = time()

    $r = my_func($v); 

    $after = time();

    $timeDelta = $after - $before;
    if($timeDelta < 10){
      $r = true;
    }
    $new[$k] = $r;
}
0
ответ дан NoviceCoding 19 August 2018 в 02:46
поделиться
  • 1
    Выполняется ли $after = time(), даже my_func() еще не закончена? Кстати, я добавил дополнительную информацию в мой вопрос. – IMB 22 March 2012 в 08:11
  • 2
    Я не думаю, что это нужно. Протестируйте это, хотя, не могу себя прямо сейчас. Чтобы проверить это, поставьте time () в конце вашей функции (внутри нее) и сравните $ после этого времени, они должны быть одинаковыми или действительно близкими. – NoviceCoding 22 March 2012 в 08:15
Другие вопросы по тегам:

Похожие вопросы: