Bug #65634 [Asn->Csd]: HTTP wrapper is very slow with protocol_version 1.1
| From: | aharvey@php.net | Date: | Wed, 11 Sep 2013 21:17:19 +0000 |
| Subject: | Bug #65634 [Asn->Csd]: HTTP wrapper is very slow with protocol_version 1.1 | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-181531@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=65634&edit=1
ID: 65634
Updated by: aharvey@php.net
Reported by: butesa at freenet dot de
Summary: HTTP wrapper is very slow with protocol_version 1.1
-Status: Assigned
+Status: Closed
Type: Bug
Package: HTTP related
Operating System: Ubuntu 12.04 x64
PHP Version: 5.5.3
Assigned To: aharvey
Block user comment: N
Private report: N
New Comment:
Implemented on master:
https://github.com/php/php-src/commit/8983a38d5130c11bd96643dfa2b2f1393ac5969d
I don't think this is a good candidate for 5.4 or 5.5: it's debatable whether
this is a bug fix, and it does subtly change PHP's behaviour. I'd be surprised if
it broke any code, but it should be something users have to test, and putting it
in the next version should ensure that.
Previous Comments:
------------------------------------------------------------------------
[2013-09-11 20:30:19] aharvey@php.net
Fair point. Let me see if we can send a Connection: close request header by
default and allow overriding via the headers context option if the user wants it
for some reason.
------------------------------------------------------------------------
[2013-09-10 19:43:18] butesa at freenet dot de
I looked into RFC 2616 today. It says:
HTTP/1.1 applications that do not support persistent connections MUST include the "close"
connection option in every message.
Obviously, the HTTP wrapper can't handle persistent connections correctly. So it should
automatically add a Connection: close header when protocol_version is set to 1.1.
------------------------------------------------------------------------
[2013-09-09 23:52:31] butesa at freenet dot de
I don't see how it can be not a bug if a http request takes 100 seconds.
If the server uses connection: keep-alive, then the client has to close the connection if it
doesn't want to make any further requests.
------------------------------------------------------------------------
[2013-09-09 23:03:47] aharvey@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
www.google.de responds with a keep-alive connection when a HTTP/1.1 request is
made and no Connection request header is included, which is valid in RFC 2616.
Sending a "Connection: close" request header restores the 1.0 behaviour.
------------------------------------------------------------------------
[2013-09-08 16:27:47] butesa at freenet dot de
Description:
------------
Loading a website with the http wrapper takes very long if protocol_version is set to 1.1. The time
it takes depends on the timeout. On some servers the problem doesn't occur.
I tested also on Ubuntu 10.04 (PHP 5.3.2-1ubuntu4.19) and Ubuntu 12.04 (PHP 5.3.10-1ubuntu3.7), both
64bit.
Test script:
---------------
<?php
$url = 'http://www.google.de/intl/de/policies/?fg=1';
foreach(array(1.0,1.1) as $proto)
{
for ($timeout = 1; $timeout < 60; $timeout+=10)
{
$st = microtime(true);
$opt = array(
'http' => array(
'timeout' => $timeout,
'protocol_version' => $proto,
),
);
$context = stream_context_create($opt);
$content = file_get_contents($url,false,$context);
printf("%2d %.1f %f %s\n", $timeout, $proto, microtime(true) - $st, md5($content));
}
}
?>
Expected result:
----------------
The request takes the same time, no matter what timeout and protocol_version is set.
Actual result:
--------------
Output of the test script:
For $url='http://www.google.de/intl/de/policies/?fg=1':
1 1.0 0.279102 60bf7bc72d2a06b337c8a8464e0f9e66
11 1.0 0.277956 60bf7bc72d2a06b337c8a8464e0f9e66
21 1.0 0.283753 60bf7bc72d2a06b337c8a8464e0f9e66
31 1.0 0.285862 60bf7bc72d2a06b337c8a8464e0f9e66
41 1.0 0.277894 60bf7bc72d2a06b337c8a8464e0f9e66
51 1.0 0.285653 60bf7bc72d2a06b337c8a8464e0f9e66
1 1.1 2.284301 60bf7bc72d2a06b337c8a8464e0f9e66
11 1.1 22.305424 60bf7bc72d2a06b337c8a8464e0f9e66
21 1.1 42.309270 60bf7bc72d2a06b337c8a8464e0f9e66
31 1.1 62.355997 60bf7bc72d2a06b337c8a8464e0f9e66
41 1.1 82.360794 60bf7bc72d2a06b337c8a8464e0f9e66
51 1.1 102.379933 60bf7bc72d2a06b337c8a8464e0f9e66
For $url='http://www.example.com':
1 1.0 0.491382 09b9c392dc1f6e914cea287cb6be34b0
11 1.0 0.426191 09b9c392dc1f6e914cea287cb6be34b0
21 1.0 0.428513 09b9c392dc1f6e914cea287cb6be34b0
31 1.0 0.423852 09b9c392dc1f6e914cea287cb6be34b0
41 1.0 0.423751 09b9c392dc1f6e914cea287cb6be34b0
51 1.0 0.431590 09b9c392dc1f6e914cea287cb6be34b0
1 1.1 1.420486 09b9c392dc1f6e914cea287cb6be34b0
11 1.1 6.143113 09b9c392dc1f6e914cea287cb6be34b0
21 1.1 5.994384 09b9c392dc1f6e914cea287cb6be34b0
31 1.1 5.991940 09b9c392dc1f6e914cea287cb6be34b0
41 1.1 6.012121 09b9c392dc1f6e914cea287cb6be34b0
51 1.1 6.007920 09b9c392dc1f6e914cea287cb6be34b0
For $url='http://www.php.net':
1 1.0 1.673016 2dcc6fe85b335205a35d9980a9095735
11 1.0 1.935555 2dcc6fe85b335205a35d9980a9095735
21 1.0 1.648235 2dcc6fe85b335205a35d9980a9095735
31 1.0 1.637566 2dcc6fe85b335205a35d9980a9095735
41 1.0 1.633473 2dcc6fe85b335205a35d9980a9095735
51 1.0 1.718051 2dcc6fe85b335205a35d9980a9095735
1 1.1 1.647803 2dcc6fe85b335205a35d9980a9095735
11 1.1 1.863799 2dcc6fe85b335205a35d9980a9095735
21 1.1 1.673567 2dcc6fe85b335205a35d9980a9095735
31 1.1 1.651704 2dcc6fe85b335205a35d9980a9095735
41 1.1 1.657976 2dcc6fe85b335205a35d9980a9095735
51 1.1 1.635651 2dcc6fe85b335205a35d9980a9095735
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=65634&edit=1