最近公司的一项目中,需要用php搭建一个socket服务。 本来php是不适合做服务的,因为和第三方合作,需要采用高效而稳定的tcp协议进行数据通信。经过多次尝试,最终选择了开源的php扩展:swoole,是用c写的多线程异步server。 其中二进制数据通信使用php自带
最近公司的一项目中,需要用php搭建一个socket服务。
本来php是不适合做服务的,因为和第三方合作,需要采用高效而稳定的tcp协议进行数据通信。经过多次尝试,最终选择了开源的php扩展:swoole,是用c写的多线程异步server。
其中二进制数据通信使用php自带的pack()和unpack()函数。需要注意的是,使用pack()打包字母时,需要传入其相应的ascii码值。
附一段关闭该socket服务的shell脚本(当代码有更新,socket服务需要重启时会用到):
#!/bin/shecho start kill socket...pid=`netstat -anp|grep 10001|awk '{printf $7}'|cut -d/ -f1`echo pid: $pidkill -50 $pidecho killed pid 10001 #假定此socket服务的端口为10001kill -usr1
ps:php扩展的安装步骤(http://coolerfeng.blog.51cto.com/133059/98460/):
1 首先进入要安装的扩展的源码目录
cd /tmp/phpext/swoole
2 在swoole文件夹下产生configure文件
#/usr/local/php5/bin/phpize
configuring for:
php api version: 20041225
zend module api no: 20060613
zend extension api no: 220060519
出现这样的提示说明可以扩展。
3 配置编译和安装#./configure --with-php-config=/usr/local/php5/bin/php-config
#make
#make install
4 在/opt/php/lib/php/extensions下产生一个swoole.so文件 5 编辑php.ini(如果php安装在/usr/local/php5 则php.ini在/usr/local/php5/lib/php.ini中添加
extension_dir = /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/
extension = swoole.so
6 重启apache,然后通过php -m或phpinfo()来查看是否成功加载了swoole扩展。
【相关技术总结】
1. 采用tcp/ip协议协议
tcp/ip、http、socket的区别:http://jingyan.baidu.com/article/08b6a591e07ecc14a80922f1.html
2. 打包及解析二进制:使用php自带的pack()和unpack()函数
http://blog.csdn.net/zhuoxiong/article/details/7362179
http://www.cnblogs.com/wanzibox/articles/1283110.html
http://www.neatstudio.com/show-2327-1.shtml
3. 搭建socket服务:使用swoole扩展
swoole官网:http://www.swoole.com/,http://wiki.swoole.com/wiki/index/prid-1
swoole入门教程及文档:https://github.com/linkeddestiny/swoole-doc
4. 启动和停止socket服务:shell脚本
linux&shell:http://blog.csdn.net/wklken/article/category/1138797
shell 在线手册:
http://shouce.jb51.net/shell/index.html
linux 在线手册:
http://www.hi-docs.com/linux.html
http://man.linuxde.net/
5. 业务逻辑用到:cookie验证、redis缓存
http://www.cnblogs.com/imxiu/category/545814.html