利用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

图1

 

即在调用构造函数时传给它一个同样的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个子进程。

图2

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

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

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

相关文章
|
16天前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存对性能的影响
【4月更文挑战第25天】 在提升PHP应用性能的众多策略中,Opcode缓存技术因其显著的效果和较低的复杂度而备受开发者青睐。本文将深入探讨Opcode缓存机制,解析其对PHP执行效率的提升原理,并通过实验数据展示启用Opcode缓存前后的性能差异。我们还将讨论几种流行的Opcode缓存工具,如APC、OpCache与APCu,并评估它们的优劣及适用场景,帮助开发者根据不同的项目需求做出合适的选择。通过本文,读者不仅能够了解Opcode缓存的工作原理,还能学会如何在实际项目中应用这一技术以优化PHP应用程序的性能。
|
1月前
|
消息中间件 网络协议 NoSQL
PHP中的异步编程:提高性能与效率的利器
传统的PHP编程方式在处理大量IO密集型任务时效率较低,随着业务的不断扩张和需求的增加,如何提高PHP应用的性能成为了亟待解决的问题。本文将介绍PHP中的异步编程技术,探讨其在提升性能和效率方面的作用,并通过实例演示其在实际应用中的运用。
15 0
|
11天前
|
存储 缓存 自然语言处理
深入PHP内核:探索Opcode缓存对性能的影响
【4月更文挑战第30天】 在动态内容生成的Web开发领域,PHP一直是广受欢迎的脚本语言之一。然而,由于其每次请求都需要经过解释执行的特性,性能上往往受到质疑。随着现代PHP引擎如Zend和Facebook的HipHop Virtual Bytecode (HPHPc)的出现,引入了Opcode(操作码)缓存机制来提升PHP的性能。本文将深入探讨Opcode缓存技术是如何工作的,以及它对PHP应用程序性能的具体影响。我们将通过实验数据与分析,揭示Opcode缓存在不同场景下的优势和局限性,并提出优化策略。
|
2月前
|
PHP 开发者
PHP 8.1 新特性解析:提升开发效率与性能的利器
本文将深入探讨PHP 8.1的新特性,包括联合方法调用、never返回类型、str_contains函数等,展示这些更新如何提升开发者的工作效率和代码性能。
18 1
|
2月前
|
编译器 PHP 开发者
PHP 8 新特性解析:提升性能与安全性
随着技术的不断进步,PHP 8作为一种流行的服务器端脚本语言,在性能和安全性方面有了许多值得关注的新特性。本文将深入探讨PHP 8的一些重要更新,包括Just In Time编译器、Union Types、Named Arguments等,帮助开发者更好地利用这些新功能提升应用程序的性能和安全性。
|
4月前
|
缓存 弹性计算 NoSQL
您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
【1月更文挑战第12天】【1月更文挑战第57篇】您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
357 1
|
10月前
|
关系型数据库 MySQL PHP
php使用webSocket实现Echarts长连接自动刷新的解决方案(3):获取读取数据库数据队列进行实时刷新
php使用webSocket实现Echarts长连接自动刷新的解决方案(3):获取读取数据库数据队列进行实时刷新
126 0
|
10月前
|
JSON 关系型数据库 MySQL
php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据
php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据
115 0
|
10月前
|
JSON 前端开发 JavaScript
php使用webSocket实现Echarts长连接自动刷新的解决方案(1):前端获取后端JSON数据
php使用webSocket实现Echarts长连接自动刷新的解决方案(1):前端获取后端JSON数据
107 0
|
10月前
|
PHP Windows
PHP 中 for 循环和 foreach 循环的性能和可读性
PHP 中 for 循环和 foreach 循环的性能和可读性