什么时候用php的长连接,PHP长连接实现与使用方法

本篇文章扣丁学堂小编和大家分享一下PHP长连接实现与使用方法,对PHP开发感兴趣的小伙伴下面就随着小编一起来看一下吧。

90f703cbc8147f3c076713fb528cc14f.png

PHP长连接实现与使用方法

长连接技术(Long Polling):

在服务器端hold住一个连接,不立即返回,直到有数据才返回,这就是长连接技术的原理,长连接技术的关键在于hold住一个HTTP请求,直到有新数据时才响应请求,然后客户端再次自动发起长连接请求。

那怎么样hold住一个请求呢?服务器端的代码可能看起来像这样的:

set_time_limit(0); //这句很重要, 不至于运行超时

while (true) {

if (hasNewMessage()) {

echo json_encode(getNewMessage());

break;

}

usleep(100000); //避免太过频繁的查询

}

没错,就是通过循环来实现hold住一个请求, 不至于立即返回. 查询到有新数据之后才响应请求. 然后客户端处理数据后,再次发起长连接请求。

客户端的代码是像这样的:

(function longPolling() {

$.ajax({

'url': 'server.php',

'data': data,

'dataType': 'json',

'success': function(data) {

processData(data);

longPolling();

},

'error': function(data) {

longPolling();

}

});

})();

一个简易的聊天室:

通过长连接, 我们可以开发一个简易的web聊天室,下面, 我们通过redis开发一个简易的web聊天室:

1、每一个客户端发起长连接时, 在服务器端生成一个消息队列, 对应该用户. 然后监听有无新数据, 有则返回数据到客户端进行处理, 并再起发起长连接请求。

2、每一个客户端发起消息时, 进行消息队列的广播

下面是代码片段:

namespace church\LongPolling;

use Closure;

use church\LongPolling\Queue\RedisQueue;

use Symfony\Component\HttpFoundation\Request;

use Symfony\Component\HttpFoundation\JsonResponse;

class Server

{

public $event = [];

public $redisQueue = null;

public $request = null;

public $response = null;

public function __construct()

{

$this->redisQueue = new RedisQueue();

$this->request = Request::createFromGlobals();

$this->response = new JsonResponse();

}

public function on($event, Closure $closure)

{

if (is_callable($closure)) {

$this->event[$event][] = $closure;

}

}

public function fire($event)

{

if (isset($this->event[$event])) {

foreach ($this->event[$event] as $callback) {

call_user_func($callback, $this);

}

}

}

public function sendMessage($data)

{

switch ($data['type']) {

case 'unicast': //单播

$this->unicast($data['target'], $data['data'], $data['resource']);

break;

case 'multicast': //组播

foreach ($data['target'] as $target) {

$this->unicast($target, $data['data'], $data['resource']);

}

break;

case 'broadcast': //广播

foreach ($this->redisQueue->setQueueName('connections') as $target) {

$this->unicast($target, $data['data'], $data['resource']);

}

break;

}

$this->fire('message');

}

public function unicast($target, $message, $resource = 'system')

{

$redis_queue = new RedisQueue();

$redis_queue->setQueueName($target)->push($resource . ':' . $message);

}

public function getMessage($target)

{

return $this->redisQueue->setQueueName($target)->pop();

}

public function hasMessage($target)

{

return count($this->redisQueue->setQueueName($target));

}

public function run()

{

$data = $this->request->request;

while (true) {

if ($data->get('action') == 'getMessage') {

if ($this->hasMessage($data->get('target'))) {

$this->response->setData([

'state' => 'ok',

'message' => '获取成功',

'data' => $this->getMessage($data->get('target'))

]);

$this->response->send();

break;

}

} elseif ($data->get('action') == 'connect') {

$exist = false;

foreach ($this->redisQueue->setQueueName('connections') as $connection) {

if ($connection == $data->get('data')) {

$exist = true;

}

}

if (! $exist) {

$this->redisQueue->setQueueName('connections')->push($data->get('data'));

}

$this->fire('connect');

break;

}

usleep(100000);

}

}

}

长连接避免了过于频繁的轮询. 但服务器维持一个长连接也有额外的资源消耗. 大并发时性能不理想. 在小型应用里面可以考虑使用,更建议客户端使用html5的websocket协议, 服务器端使用swoole。

以上就是扣丁学堂小编给大家分享的PHP长连接实现与使用方法详解,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询。扣丁学堂有专业的PHP培训班供大家学习,不仅有时俱进的课程体系还有专业的老师授课,定能让你轻松学习,高薪就业。

本文仅代表作者个人观点,不代表SEO研究协会网官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱cxb5918@163.com。更多相关资讯,请到SEO研究协会网www.seoxiehui.cn学习互联网营销技术请到巨推学院www.jutuiedu.com。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值