开发者社区> 问答> 正文

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

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


最近有PHP用户反馈,利用OCS做压测,达不到我们给出的性能对比报告里的指标: http://bbs.aliyun.com/read/162907.html。通过了解具体情况,大多数用户在使用PHP连OCS时,都是通过走ApacheWEB服务再连到OCS,使用的是短连接。而每个短连接的开销不止是socket重连,还有复杂的重新鉴权流程,开销比一个普通请求大许多,因此对网站的效率是有很大影响的。于是我们建议用户改短连接为长连接,但是OCS要求使用的PHP MEMCACHED扩展,不像memcache扩展那样有个pconnect接口,于是查了资料写个简单明了的教程供大家参考.


在PHP官网介绍memcached构造函数时有下面一段话。
[font=&][attachment=56945]


即在调用构造函数时传给它一个同样的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次浏览器都输出结果为:

[font=&] New connection
Get from OCS: value
即这8次都是新建连接,而8次后都是复用这8个链接了。抓包结果也显示8次后都是长连接,无socket重连无鉴权。那么为什么有8个链接了,查看了我的httpd.conf配置文件,是因为我的appache启动了8个子进程。
[font=&][attachment=56946]
于是刚好在’ocs’这个persistent_id的连接池里面初始化8个连接,此后的请求就用这8个链接了。

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

展开
收起
唐翰 2014-07-22 10:53:26 8373 0
5 条回答
写回答
取消 提交回答
  • Re利用PHP长连接提高使用OCS的性能
    用了一台ecs测试先。

    现在ocs吞吐量达到100-200m, 存储只用了2G, 命中率70-80之间来回晃动

    你们吞吐量设置太低了
    2014-12-11 23:03:04
    赞同 展开评论 打赏
  • 改造下dz怎么弄
    2014-08-08 10:46:24
    赞同 展开评论 打赏
  • 完全看不懂,哈哈。
    2014-08-07 09:13:39
    赞同 展开评论 打赏
  • Re利用PHP长连接提高使用OCS的性能
    这些对高手没有问题
    普通站长怎么可能理解呢
    2014-07-23 02:23:30
    赞同 展开评论 打赏
  • 赞 一个
    2014-07-22 11:32:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载