利用PHP长连接提高使用OCS的效率与性能

最近有OCS的用户反映,在使用PHP客户端对OCS做性能测试时,测试结果达不到我们给出的性能对比报告里的指标。通过了解客户的具体测试情况,我们发现大多数用户在使用PHP连OCS时,都是通过走Apache WEB服务再连到OCS,使用的是短连接。而每个短连接的开销除了每次socket重连,还有复杂的重新鉴权流程,开销比一个普通请求大许多,因此使用短连接在调用OCS的效率上较低,从而对网站的性能也有较大影响。于是我们建议用户改使用短连接为使用长连接,但是OCS要求使用的PHP MEMCACHED扩展,不像memcache扩展那样有个pconnect接口。如何才能在PHP中建立长连接,以下方法供大家参考。

在PHP官网介绍memcached构造函数时有下面一段话:

 

http://php.net/manual/en/memcached.construct.php

 

即在调用构造函数时传给它一个同样的persistent_id就能实现共享连接。代码实现如下:

<?php

$memc = new Memcached(‘ocs’);//这里的ocs,就是persistent_id

if (count($memc->getServerList()) == 0) /*建立连接前,先判断*/

{

  echo “New connection”.”<br>”;

/*所有option都要放在判断里面,因为有的option会导致重连,让长连接变短连接!*/

  $memc->setOption(Memcached::OPT_COMPRESSION, false);

  $memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

  /* addServer 代码必须在判断里面,否则相当于重复建立’ocs’这个连接池,可能会导致客户端php程序异常*/

  $memc->addServer(“your_ip”, 11212);

  $memc->setSaslAuthData(“user”, “password”);

}

else

{

  echo “Now connections is:”.count($memc->getServerList()).”<br>”;

}

$memc->set(“key”, “value”);

echo “Get from OCS: “.$memc->get(“key”);

//$memc->quit();/*代码结束的地方一定不能加quit,否则变短连接!*/

?>

上述代码要特别注意的三个地方都加了注释。构造函数里的‘ocs’关键字,就相当于一个连接池了,需要使用的连接调用new Memcached(‘ocs’)就能从池里获取连接。接下来看看执行结果。

将上述代码放到Apache工作路径/var/www/html/下面,命名为test.php.然后再浏览器输入http://your_ip:80/test.php.前8次浏览器都输出结果为:

即这8次都是新建连接,而8次后都是复用这8个连接了。抓包结果也显示8次后都是长连接,无socket重连无鉴权。那么为什么有8个链接?通过查看httpd.conf配置文件,是因为appache启动了8个子进程。

于是刚好在‘ocs’这个persistent_id的连接池里面初始化8个连接,此后的请求就用这8个连接了。

接下来测试页面跳转,拷贝一个php文件,建立连接的构造函数的persistent_id还是用‘ocs’。得到的结果是从一个连接换到了另一个连接上(因为调用的Apache子进程不一样),但无鉴权无socket重连过程,即PHP memcached的长连接设置是有效的。通常我们使用的都是PHP-FPM模式, FPM进程会和memcached server保持长连接,因此该连接的生命周期同Apache进程。

(本文作者为阿里云OCS研发工程师 玄贝)

时间: 2024-11-05 17:31:49

利用PHP长连接提高使用OCS的效率与性能的相关文章

利用socket长连接做信息报警提示

问题描述 利用socket长连接做信息报警提示 现在在做一个项目,需要用服务器推送技术做一个报警提示,就是只要有没有处理的信息显示,就自动报警

socket-android利用mina框架保持长连接通信

问题描述 android利用mina框架保持长连接通信 最近在学做一个手机客户端,服务端用java mina搭建,客户端也是利用mina 和服务端保持长连接通信. 自己的思路:1打开应用即和服务端建立连接,将session保存 2在不同的activity中用保存的session去请求相关数据 3在mina客户端的接收方法中将服务端得到的服务端响应结果广播出去,在对应的activity中接收该广播 以上思路不知道是否可行或者有什么考虑不全的地方还请各位指正一下,谢谢 解决方案 做过类似的功能,正准

Web 通信 之 长连接、长轮询(long polling)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的"不停"其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真

http长连接和短连接

HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript文件.图像文件.CSS文件等:当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话 HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的.

数据库中的长连接和短连接区别分析

什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接->数据传输->保持连接->数据传输->保持连接->----->关闭连接: 这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了 什么时候用长连接,短连接? 长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信

Comet:基于 HTTP 长连接的“服务器推”技术

很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新.发送请求.本文首先介绍.比较了常用的"服务器推"方案,着重介绍了 Comet - 使用 HTTP 长连接.无须浏览器安装插件的两种"服务器推"方案:基于 AJAX 的长轮询方式;基于 iframe 及 htmlfile 的流方式.最后分析了开发 Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架-pushlet 构建自己的"服务器推&

PHP数据库长连接mysql_pconnect的细节

PHP的MySQL持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之.这到底是为啥么.近距离观察后发现,这家伙也不容易啊,要看Apache的脸色,还得听MySQL指挥. 对于作为Apache模块运行的PHP来说,要实现MySQL持久化连接,首先得取决于Apache这个web服务器是否支持Keep-Alive. Keep-Alive Keep-Alive是什么东西?它是http协议的一部分,让我们复习一下没有Keep-Alive的http请求,从客户在浏览器输入一个有效url地址开始,浏览

算法实现-求解利用最长公共子序列进行字符串重排序算法的代码

问题描述 求解利用最长公共子序列进行字符串重排序算法的代码 利用合并LCS表求出一张基于所给连接词二进制的表,利用这张表和连接词k再反过来求出LCS表

PostgreSQL relcache在长连接应用中的内存霸占&quot;坑&quot;

背景 阿里巴巴内部的某业务在使用阿里云RDS PG时,业务线细心的DBA发现,一些长连接占据了大量的内存没有释放.后来找到了复现的方法.使用场景有些极端. 有阿里巴巴内部业务这样的老湿机陪伴的RDS PG,是很靠谱的. PostgreSQL 缓存 除了常见的执行计划缓存.数据缓存,PostgreSQL为了提高生成执行计划的效率,还提供了catalog, relation等缓存机制. PostgreSQL 9.5支持的缓存代码如下 ll src/backend/utils/cache/ attop