(转载: http://vistaswx.com/blog/article/php-server-push)。
找了很多资料,这篇资料是感觉解释的最清楚的。拷贝下来,以备后用。
随着人们对Web即时应用需求的不断上升,Server Push(推送)技术在聊天、消息提醒尤其是社交网络等方面开始兴起,成为实时应用的数据流核心。这篇日志试图探讨的便是各种适合于PHP的Push的实现方式以及其优劣。
1. 什么是Server Push
想象在聊天应用中,如果使用传统的ajax来承担消息的传入,那么一般是通过每隔一定时间拉取一次信息的方式实现,但是其实这种方式有大量查询是浪费的。聊天等Web应用更需要服务器在特定时间来主动告知前端有新的消息(Push),而不是前端每时每刻问服务器:“来消息了吗?”(Pull)。这也正是为什么这个技术常被叫做反向ajax。
其他别名:Comet,反向Ajax
2. 如何实现Push
其实所谓的推送技术也没有多么复杂,目前从大类上有3种,一种仍然建立在ajax基础上,还有一种建立在框架基础上,最后一种抛弃了传统的HTTP协议,使用Flash或者HTML5的WebSockets技术。接下来将对这三种类别产生的不同的方式进行探讨。
1) Ajax 长轮询
Ajax长轮询从本质上来说仍然是一种pull,但是实时性较高,无用请求减少很多,是一种不错的Push实现方案。不过它只减少了网络上的无谓消耗。
核心: 客户端发起一个ajax请求,服务端将请求搁置(pending)或者说挂起,直到到了超时时间(timeout)或需要推送时返回;客户端则等待ajax返回后处理数据,再发起下一个ajax请求。
优点: 兼容性较高,实现简单
缺点: 对于php这种语言来说,如果要做到实时,那么服务端就要承受大得多的压力,因为搁置到什么时候往往是不确定的,这就要php脚本每次搁置都进行一个while循环。
当然,如果服务器刷新每秒级,那尚可接受,只是实时性上退化了。
注意: 浏览器有连接数限制。我得出的结论是如果当前页面上有一个ajax请求处于等待返回状态,那么其他ajax请求都会被搁置(Chrome, Firefox已测)。似乎跟页面标记有关,一个规范的HTML可以同时有多个请求。如果页面有一般ajax需求怎么办?解决方法是开个框架,框架中使在另一个域名下进行Comet长轮询,需要注意跨域问题。
PHP实现: Jquery+php实现comet
相关: Ajax跨域和js跨域解决方案
2) Frame 长连接
受到ajax启发,出现了框架下的长连接。
核心: Frame中发起一个普通请求,服务器将其搁置;需要推送时输出直接执行
脚本,然后继续保持连接。如果担心超时问题可以改成框架论询。
优点: 与1一样具有高兼容特性
缺点: 最大的问题是如果框架在载入,那么浏览器就好一直显示“载入中”,这就弱爆了(解决方法参见文末的相关阅读资源)。同样服务器也要能hold住大量循环……另外,是否有同域连接限制没测试。
3) Flash/HTML5 WebSockets
用flash来发起WebSockets,秒杀前面一切问题。
优点: 标准化, RealTime, Push
缺点: 服务器需要能应对WebSockets;还有如果既没有Flash又不支持HTML5的怎么办?
PHP实现: Start Using HTML5 WebSockets Today
6) 使用兼容封装层(socket.io)
以上每种方法都有优劣,那么终极解决方案便是合在一起!能WebSockets时候就WebSockets,不支持HTML5特性就退化到Flash,没有Flash则退化到Ajax长轮询。这也是我的Rainbowfish所采用的方式。
优点: 高度封装,编写非常容易,几乎不需要关心如何去实现的。实时,超低负载,高并发。
缺点: 其实算不上缺点,socket.io的服务器端要求是node.js,而不是php。
个人看法: 如果你是独立主机,能运行程序,那么socket.io配合node.js是个非常高效的选择。为什么呢?因为它还可以避免php的服务端高负载。
Rainbowfish的消息系统通过这种方式实现: 所有客户端都通过socket.io挂在nodejs服务器上(注意: 只是挂着,不需要任何循环,因为它是事件驱动的);需要推送消息了,服务器就与nodejs通信(比如访问某个地址来实现),告诉它推送什么消息到哪里;nodejs收到推送信号后,则通过socket.io实时传输数据给浏览器。这个其实也是一条单向的路,因为nodejs服务器不具备与php通信的能力,实际上也不需要,网页上直接连php就可以了。
3. 结束语
事实上,第一个方法(Ajax Long Pull)是一个不错的方法,只是如果使用php完成的话服务器负载上有点大,但这其实是通病;而最后列举的socket.io方案完全避免了这个问题,因为它属于另一种架构,并且这种组合也可以配合几乎所有的脚本语言实现push。
对于实时性要求非常高的应用,或许使用php实现实时部分并不是一个好的选择,将会面临非常大的服务器负载(可以通过编写支持等待事件的扩展来解决这个问题);如果只是消息提示等,则可以调整服务器上刷新的间隔降低到秒的级别,负载尚可接受。不过无论哪种用途,配合那些非阻塞语言或许才是最好的选择。
4. 相关阅读
How to implement COMET with PHP
相关推荐
在IT行业中,消息推送是一项关键的技术,特别是在移动应用开发中,它允许服务器向客户端实时发送信息,无需客户端持续轮询。本主题主要关注"U盟消息推送"、"phpiOS推送"、"php安卓推送"以及"thinkPHP推送"这四个关键...
在本文中,我们将深入探讨如何在uniapp项目中利用unipush和个推SDK服务端实现推送功能,并结合Thinkphp + RestAPI V2构建后端系统。uniapp是一款跨平台的移动应用开发框架,它允许开发者用一套代码库来创建iOS、...
在IT行业中,推送服务是移动应用开发者不可或缺的一部分,特别是对于iOS平台的应用,为了实时通知用户,需要使用苹果的Push Notification Service(简称APNs)。而PHP作为广泛应用的服务器端脚本语言,可以用来创建...
本文将深入探讨“ios消息推送源码”,包括PHP服务端的实现,适用于那些正在使用Xcode 6.1进行APNs(Apple Push Notification service)开发的开发者。 首先,APNs是苹果公司提供的一个服务,它允许应用开发者向已...
本文将深入探讨APNS的工作原理、PHP服务器端实现以及如何使用`pushTest.php`进行推送。 首先,APNS是苹果公司提供的一项服务,它允许应用开发者在用户未启动应用的情况下,通过服务器向iOS、iPadOS或watchOS设备...
本文将深入探讨iOS APNS推送消息的实现,包括iPhone端和服务端的设置和交互。 首先,让我们从iPhone端开始。在iOS应用中集成APNs推送功能,开发者需要做以下几件事: 1. **获取设备Token**:当用户安装并首次运行...
本文将探讨几种常见的Android消息推送解决方案,以及它们的优缺点。 首先,消息推送分为Pull(拉)和Push(推)两种方式。Pull方式是客户端定期向服务器请求新数据,而Push方式则是服务器在有新数据时直接推送给...
这种技术称为Apple Push Notification Service(APNS),它使用JSON格式的推送消息,通过TCP/IP连接将这些消息发送到用户的设备。本文将详细探讨如何使用C++来实现iOS服务器推送。 首先,理解APNS的工作原理至关...
在本文中,我们将深入探讨极光推送的工作原理、PHP服务器端的集成以及如何进行消息推送。 1. 极光推送工作原理: 极光推送的核心是基于长连接的推送技术,通过在客户端(App)和服务器之间建立持久化的TCP连接,...
标题"Laravel开发-push"暗示我们将探讨如何在Laravel项目中构建和管理推送系统。Laravel的推送管理器可能是为了集成多种推送服务,如Firebase Cloud Messaging (FCM)、Apple Push Notification service (APNs)、...
在本文中,我们将深入探讨如何使用PHP作为服务端来实现iOS消息推送,主要针对苹果的APNs(Apple Push Notification service)。首先,了解APNs是苹果提供的一项服务,允许开发者向已安装其应用程序的iOS设备发送远程...
在IT行业中,WAP Push是一种技术,用于向移动设备推送数据,如消息、铃声、图片等,而WAP Push Gateway则是实现这一功能的核心组件。本文将深入探讨如何搭建一个WAP Push Gateway,并结合DSP(数字信号处理)与图像...
PushResult.php接收并处理这些推送,可能包括验证消息的合法性、更新本地数据库中的充值记录,并可能进一步通知用户充值结果(成功、失败或待处理)。 3. **QueryResult.php** 这个文件可能用于查询充值记录或结果...
本文将深入探讨如何使用PHP通过Stream方法发送Apple iOS推送通知,基于提供的项目"iOS-Stream-Push-Notifications-PHP"。 首先,我们要理解Apple Push Notification Service (APNs)的工作原理。APNs是苹果提供的...
在本DEMO中,我们将探讨如何利用友盟PHP SDK来实现服务端的推送功能。 首先,我们需要了解友盟推送的基本概念。友盟推送服务主要包含以下几个核心部分: 1. **设备注册**:当用户安装并启动应用时,应用会向友盟...
在本文中,我们将深入探讨如何使用 Laravel 框架中的 "laravel-push-notification" 扩展包来实现 Push Notification 的服务端支持。Push Notification 是移动应用中常见的功能,用于向用户实时发送消息、提醒或者...
在本文中,我们将深入探讨如何在 Laravel 开发中利用 `laravel-pushover` 包来实现推送通知功能。`laravel-pushover` 是一个专为 Laravel 框架设计的扩展,它允许开发者轻松地与 Pushover 服务集成,从而能够向 iOS ...
在本文中,我们将深入探讨Laravel框架中的HTTP/2服务器推送功能。HTTP/2服务器推送是一种先进的网络技术,它允许服务器在客户端请求一个资源时,主动推送其他相关的资源,从而提高网页加载速度和性能。在Laravel框架...
本文将深入探讨 Laravel 开发中的 HTTP/2 服务器推送技术,并介绍如何在 Laravel5 中使用 `laravel-HTTP2ServerPush` 这个中间件来实现这一功能。 首先,让我们理解 HTTP/2 服务器推送的基本概念。在 HTTP/1.x 协议...
Server Push是一种服务器主动将数据推送到客户端的技术,与传统的HTTP请求-响应模式不同,它允许服务器在客户端未发起请求时推送数据,常用于实时性要求高的应用场景,如即时消息、股票更新、天气预报等。...