【问题标题】:php and persistent HTTP connectionsphp 和持久的 HTTP 连接
【发布时间】:2017-05-28 03:44:50
【问题描述】:

有什么方法可以在请求之间使用 HTTP 持久连接? 我没有看到 CURL 扩展有办法创建一个供所有请求使用的连接池,就像 mysql、redis、pg 的其他扩展一样。

据我所知,您只能在同一请求中使用持久 http 连接。

西尔维乌

【问题讨论】:

    标签: php http curl connection-pooling persistent-connection


    【解决方案1】:

    PHP 的 pecl_http 扩展使用 libcurl 并允许您打开可重复使用的持久 TCP 连接:

    $client = new http\Client('curl', $persistentHandleID); 
    $request = new http\Client\Request('GET', 'http://example.com/');
    $client->enqueue($request);
    $client->send();
    $response = $client->getResponse($request);
    

    如果在同一 PHP 进程上运行的另一个 $client(可能在不同的 PHP 请求期间)访问同一主机并共享同一 $persistentHandleID,它将通过与以前相同的 TCP 连接发送其 HTTP 请求。

    在 PHP 模块关闭或$client 发送Connection: Closeforbids further use of the connection 之前,TCP 连接将保持活动状态:

    $client->setOptions(['forbid_reuse' => true, … ]);
    

    【讨论】:

    【解决方案2】:

    在 HTTP 中有 keep-alive 和流水线的概念。 Keep-Alive 允许在多个 HTTP 请求和响应中使用一个 TCP 连接。这允许浏览器在一个 TCP 连接上加载包含其所有资源(例如图像、脚本等)的网页,从而避免了连接设置和拆除开销。 CURL 默认使用这个,将Connection: keep-alive 附加到标题中。服务器配置为最大请求以及连接将保持打开状态的时间。但它仍然以请求-响应模式运行。

    使用流水线可以在收到响应之前发出多个请求。流水线没有广泛实现,客户端和服务器都必须实现它。要在 CURL 中使用,您必须找到一个为您的客户端实现它的库(那里有一些),并且服务器也必须使用它。

    如果您不确定您的 CURL 应用程序是否正在发送 keep-alive 标头,请使用 http 代理或数据包嗅探器来检查您的流量。

    【讨论】:

    • 使用 HTTP/1.1 持久连接是默认的,不需要 Connection: 标头。 PHP 程序需要做的就是在执行后续请求时重用相同的 curl 句柄。
    • 我的问题是:有什么方法可以在请求之间使用 HTTP 持久连接,并且在最后一篇文章中我写道:据我所知,您只能在同一请求中使用持久 http 连接。由于 php 脚本的生命周期,我看不到如何使用连接池。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2014-01-12
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多