HTTP协议的特性:属于“请求-响应”模型,只有客户端发起了请求消息,服务器才能给出响应消息,没有请求,就没有响应;一个请求消息,服务器只能返回一个响应消息。有些特殊应用场景中,如“在线股票”、“聊天室”等,需要模拟呈现出“客户端不发请求,服务器也在不停的给出响应”效果,若使用HTTP协议,只能使用“AJAX+定时器”来近似的实现——心跳请求,问题:心跳过慢则信息的实效性差,心跳过快则服务器压力太大!
WebSocket协议的特性:属于“广播-收听”模型,只要客户端连接到服务器上,就不再断开(永久连接),一方可以不停的给对方发消息,对方可以不给出响应。使用WS协议代替心跳请求,可以非常好的解决HTTP协议在某些应用中的不足。WS协议的服务器也有不足:永久连接限制了客户端的数量。
业务场景:
有更新的数据,会同步写到redis队列中,前端需要实时去更新页面展示内容,WS服务端会刷队列取数据给到前端
WebSocket应用程序必需两个程序:
socket_client.html
socket_server.php
WS服务器端程序:
socket_server.php
(如果有socket 扩展并且是开启状态的可以略过)
- 在官方的php.tar 或 php.gz包 里面有ext文件夹 里面有扩展的安装包(mamp环境的可以放到/Applications/MAMP/bin/php/php5.6.28/include/ 目录下)
- ## MAC安装php默认安装位置在/usr/local/php里面(如果自己装了php找到对应目录)
- cd /Applications/MAMP/bin/php/php5.6.28/include/
- /usr/local/php/bin/phpize ##这一步是php化
- ./configure --prefix=/Applications/MAMP/bin/php/php5.6.28 --with-php-config=/Applications/MAMP/bin/php/php5.6.28/bin/php-config --enable-sockets(地址需要根据自己的实际地址进行更换)
- make && make install ## 会提示安装好了sockets.so到/Applications/MAMP/bin/php/php5.6.28/lib/php/extensions/no-debug-non-zts-20131226中
- ## 接下来打开php.ini
- /sockets
- 找到;extension=sockets.so 把注释去掉,如果没有 extension=sockets.so 加上
- 然后重启web服务器
- php -m 查看是否存在sockets扩展
安装好扩展之后用命令行执行
-
php socket_server.php (执行调用PHP解释器,执行PHP语言编写的Socket服务器程序)
-
注:这里可能有一个问题,命令行执行的时候,可能跟浏览器访问时候用的php.ini不是同一个,这时候需要同步用一个正确的,不然会有一些扩展显示未安装。
解决:命令行输出 php --ini 查看命令行所用的php.ini 路径;在查看phpinfo()显示php.ini的路径;把命令的php.ini内容用正确的替代。问题解决
WS客户端程序:
socket_client.html
redis代码
redis_server.php
代码已上传github 奉上地址:https://github.com/869051375/socket
欢迎下载,请求指正错误。