Странное поведение timeout и времени выполнения

Ярослав

Новичок
Приветствую.

Проясните ситуацию, почему время выполнения в 2 раза больше чем таймаут?
Скрипт 1
PHP:
<?php

printf('%10s,s | %10s,s' . PHP_EOL, 'Timeout', 'Execution');
printf('---------------------------' . PHP_EOL);
for($i = 1; $i <= 15; $i++) {

    $context = stream_context_create(array(
        'http'    => array(
            'method'    => 'GET',
            'timeout'   => $i
        )
    ));
    
    $time = microtime(true);
    $result = file_get_contents('http://site.name/sandbox/timeout/2.php', false, $context);
    
    printf('%12d | %12d' . PHP_EOL, $i, microtime(true) - $time);
}
Скрипт 2
PHP:
<?php

echo '1';

sleep(25);
Результаты
PHP:
   Timeout,s |  Execution,s
---------------------------
           1 |            2
           2 |            4
           3 |            6
           4 |            8
           5 |           10
           6 |           12
           7 |           14
           8 |           16
           9 |           18
          10 |           20
          11 |           22
          12 |           24        
          13 |           25     <-- Скрипт2 уже успел выполнится ( sleep(25) )
          14 |           25
          15 |           25
 

Yaponchick

Новичок
timeout: макс. время молчания... если идут всяки ACK то, какой нафиг таймаут?
 

Вурдалак

Продвинутый новичок
https://bugs.php.net/bug.php?id=48280
the value is used both for connection timeout, and then again for read timeout.
IMHO, тут проблема в документации, там просто сказано:
Read timeout in seconds, specified by a float (e.g. 10.5).
http://php.net/manual/en/context.http.php

Можно было бы зарепортить еще раз с уже правильной формулировкой проблемы.

UPD: Объясните и мне, плз, я вот что-то не понимаю: connection тут явно есть, на него время не расходуется. Почему read timeout становится в два раза больше?
UPD2: а, вот сейчас потестил: побольше отдал данных в 2.php перед sleep'ом и timeout стал ожидаемо работать. Только вот интересно, если connection timeout истек, то нафига еще ждать read timeout? Все-таки на стороне PHP какая-то фигня есть.
 

Ярослав

Новичок
Протестировал с сURL - этот нормально отрабатывает (просто обрывает по таймауту, который задан)
PHP:
   Timeout,s |  Execution,s
---------------------------
           1 |            1
           2 |            2
           3 |            3
           4 |            4
           5 |            5
           6 |            6
           7 |            7
           8 |            8
           9 |            9
          10 |           10
          11 |           11
          12 |           12
          13 |           13
          14 |           14
          15 |           15
Сама по себе функция file_get_contents работает хорошо, и в использовании ИМХО проще курла, но все же "косяки" иногда напрягают :(

1. Иногда тупит с конекшеном
2. Как уже выяснили, нельзя указать по отдельности connect timeout и общий таймаут, к примеру, как это сделано в cURL (CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT)
 
Сверху