STREAM_CLIENT_PERSISTENT参数疑惑

echo1

@walkor大人,

$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1,  STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);

这段代码中的STREAM_CLIENT_PERSISTENT标志代表什么含义, 是持久连接的意思吗?

求举例,求解答。

5890 3 0
3个回答

walkor

STREAM_CLIENT_PERSISTENT 就是创建一个持久连接,
如果下次创建的连接和当前ip端口一致,那么就不会创建新的连接,而是复用这个链接。

这个通常用于php-fpm中与某个服务端建立长链接,建立的链接不会因为请求结束而销毁,能避免每次建立链接三次握手和关闭链接四次挥手,能一定程度上降低双方服务器开销。

例子php手册有,和不用STREAM_CLIENT_PERSISTENT的使用方法一模一样。

  • 暂无评论
echo1

@walkor , 我测试了下,应该是当前php-fpm请求利用

$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
来连接服务端, 如果这次请求中有多次利用STREAM_CLIENT_PERSISTENT来连接同一个IP跟PORT就会复用这个链接,
但是php-fpm请求结束后,再次运行 还是会有建立链接的过程的。

web_server服务端:

$web->onConnect = function() {
echo "connect\n";
};

测试脚本:

$client = stream_socket_client('tcp://127.0.0.1:55151', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);

$client1 = stream_socket_client('tcp://127.0.0.1:55151', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);

$client2 = stream_socket_client('tcp://127.0.0.1:55151', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);

var_dump($client, $client1, $client2); //会打印一次connect。

脚本结束后再次运行这个脚本,还是会打印connect的。

脚本测试后,STREAM_CLIENT_PERSISTENT 这个参数,是针对当前php-fpm请求的链接复用。

@walkor ,我说的对吗?

  • 暂无评论
walkor

把php-fpm进程数设置为1试下

  • echo1 2016-09-13

    我是通过php cli 来执行的。

  • walkor 2016-09-13

    好吧,你牛,用php cli测试来猜测php-fpm的行为

  • echo1 2016-09-13

    用 php-fpm测试了下,果然是持久链接,应该是php-fpm进程保存了持久链接的信息。@1 ,灰常感谢。

年代过于久远,无法发表回答
🔝