php swoole 通讯,php-fpm应用与php-swoole应用进行通信

原标题:php-fpm应用与php-swoole应用进行通信

基础要求

linux万物皆文件

socket通信

基础进制转换写在前面

这篇文章是自己练习的内容,主要想实现应用间的通信机制。

Workerman中提供的建议方案

与其它mvc框架结合建议以上图的方式(ThinkPHP为例):

1、ThinkPHP与Workerman是两个独立的系统,独立部署(可部署在不同服务器),互不干扰。

2、ThinkPHP以HTTP协议提供网页页面在浏览器渲染展示。

3、ThinkPHP提供的页面的js发起websocket连接,连接workerman

4、连接后给Workerman发送一个数据包(包含用户名密码或者某种token串)用于验证websocket连接属于哪个用户。

5、仅在ThinkPHP需要向浏览器推送数据时,才调用workerman的socket接口推送数据。

6、其余请求还是按照原本ThinkPHP的HTTP方式调用处理。

总结:

把Workerman作为一个可以向浏览器推送的通道,仅仅在需要向浏览器推送数据时才调用Workerman接口完成推送。业务逻辑全部在ThinkPHP中完成。

我们使用swoole环境的常驻内存、协程特性来做一些其他事务,如:任务队列及其消费、缓存、异步执行等情况时

可以如建议中第5步所说,FPM环境调用Swoole环境提供的接口(可以用TCP/HTTP等方式)来开始一个任务

进程通信

上面的方案可以用在单机中,也可以用在集群部署中。

进程通信一般仅限于单机中使用

进程通信的方式有好几种,这里主要写明我测试的一种。

unix socket 文件

在linux环境中,万物皆为文件,套接字也可以用文件来表示,然后一个进程(一般是swoole环境)监听它,其他进程(FPM环境)连接它,并且发送数据

这里使用的是Easyswoole框架提供的一个基类,如果是纯Swoole环境可以下载框架源码并查看原理

EasySwoole部分

继承了 AbstractUnixProcess ,封装好了很多内容,直接写明onAccept 接受数据做处理即可

namespaceAppUnixSocket;

useEasySwooleComponentProcessSocketAbstractUnixProcess;

useSwooleCoroutineSocket;

classSiamextendsAbstractUnixProcess

{

functiononAccept(Socket $socket)

{

// 收取包头4字节计算包长度 收不到4字节包头丢弃该包

$header = $socket->recvAll( 4, 1);

if(strlen($header) != 4) {

$socket->sendAll( self::pack(json_encode([

'res'=> 'fail',

'msg'=> '长度有误',

], 256)));

$socket->close;

return;

}

// 收包头声明的包长度 包长一致进入命令处理流程

// 多处close是为了快速释放连接

$allLength = self::packDataLength($header);

$data = $socket->recvAll($allLength, 1);

if(strlen($data) == $allLength) {

echo$data;

// 执行任务逻辑

$socket->sendAll( self::pack(json_encode([

'res'=> 'ok',

'msg'=> '长度相同',

], 256)));

$socket->close;

} else{

$socket->sendAll( self::pack(json_encode([

'res'=> 'fail',

'msg'=> '长度不相等',

], 256)));

$socket->close;

}

}

staticfunctionpack($string)

{

returnpack( 'N', strlen($string)) . $string;

}

staticfunctionpackDataLength($head)

{

returnunpack( 'N', $head)[ 1];

}

}

写好了任务逻辑,还需要加入启动该进程

EasySwooleEvent.php文件

publicstaticfunctionmainServerCreate(EventRegister $register)

{

$config = newUnixProcessConfig;

$config->setSocketFile(EASYSWOOLE_ROOT. "/Temp/siam_unix.sock");

$config->setProcessName( 'siam_unix');

$siam = newSiam($config);

ServerManager::getInstance->getSwooleServer->addProcess($siam->getProcess);

} 普通环境发送数据 <?php

$sock = dirname( __FILE__). "/Temp/siam_unix.sock";

$unixSock = stream_socket_client( "unix:///".$sock);

fwrite($unixSock, siam_pack( 'my name is siam'));

//echo fread($unixSock, 4096)."n";

fclose($unixSock);

functionsiam_pack($string)

{

returnpack( 'N', strlen($string)) . $string;

}

functionpackDataLength($head)

{

returnunpack( 'N', $head)[ 1];

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值