王华山 發表於 2019-8-23 00:08:00

php swoole 安装与使用

<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">swoole 安装
用的是centOS
php安装目录:</span>/usr/local/<span style="color: rgba(0, 0, 0, 1)">php
php</span>.ini配置文件路径:/usr/local/php/etc/php.<span style="color: rgba(0, 0, 0, 1)">ini
</span>1<span style="color: rgba(0, 0, 0, 1)">、安装swoole
cd </span>/usr/local/<span style="color: rgba(0, 0, 0, 1)">src
wget https</span>:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gz   #版本不一样   https://github.com/swoole/swoole-src/releases</span>
tar zxvf v1.9.1-stable.tar.<span style="color: rgba(0, 0, 0, 1)">gz
cd swoole</span>-src-1.9.1-<span style="color: rgba(0, 0, 0, 1)">stable
</span>/usr/local/php/bin/<span style="color: rgba(0, 0, 0, 1)">phpize<br>                #查找对应的php-config   find / -name php-config
</span>./configure --with-php-config=/usr/local/php/bin/php-<span style="color: rgba(0, 0, 0, 1)">config
make
make install
</span>2<span style="color: rgba(0, 0, 0, 1)">、配置php支持swoole
vi </span>/usr/local/php/etc/php.<span style="color: rgba(0, 0, 0, 1)">ini
添加
extension</span>=swoole.<span style="color: rgba(0, 0, 0, 1)">so
</span>3、重启php-<span style="color: rgba(0, 0, 0, 1)">fpm
service php</span>-<span style="color: rgba(0, 0, 0, 1)">fpm restart
在phpinfo页面可以看到关于swoole的选项,说明安装成功。
搭建tcp 服务器
</span>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建服务器</span>
<span style="color: rgba(128, 0, 128, 1)">$host</span> = '0.0.0.0'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$port</span> = 9501<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_server(<span style="color: rgba(128, 0, 128, 1)">$host</span>,<span style="color: rgba(128, 0, 128, 1)">$port</span><span style="color: rgba(0, 0, 0, 1)">) ;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">

$host:127.0.0.1 本地ip 可以监听多个ip 使用0.0.0.0
$port:端口号
1024端口以下需要root权限
$mode : SWOOLE_PROCESS 多进程的方式
$socke_type:SWOOLE_SPCL_TCP



/
//使用
// bool $swoole_server-&gt;on(string $event,mixed $callback)
/*



$event:
connect: 当建立连接的时候 $serv 服务器信息 $fd:客户端信息
receive: 当接受到的数据$serv 服务器信息,$fd 客户端,$from_id ID,$data 数据
close:关闭连接
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;on('connect',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$fd</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "连接成功"<span style="color: rgba(0, 0, 0, 1)">
});
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;on('receive',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$fd</span>,<span style="color: rgba(128, 0, 128, 1)">$from_id</span>,<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span>"接收到的数据"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$data</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打印接收到的数据</span>
<span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;on('close',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$fd</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span>"连接关闭"<span style="color: rgba(0, 0, 0, 1)">;
})
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;start();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">启动服务</span>
?&gt;<span style="color: rgba(0, 0, 0, 1)">
上传到 服务器后
php index</span>.<span style="color: rgba(0, 0, 0, 1)">php启动
ps </span>-<span style="color: rgba(0, 0, 0, 1)">ajft 查看进程来查看启动成功没
使用网络调试助手来进行调试查看tcp服务是否好用

UDP服务器创建
udp</span>.<span style="color: rgba(0, 0, 0, 1)">php
</span>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_server("0.0.0.0",9502,SWOOLE_PROCESS,<span style="color: rgba(0, 0, 0, 1)">SWOOLE_SOCK_UDP)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监听数据接收事件</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">

$serv:服务器信息
$data:数据,接收到的数据

$fd:客户端信息
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;on('packet',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$data</span>,<span style="color: rgba(128, 0, 128, 1)">$fd</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发送数据到相应的客户端,反馈信息</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;sendto(<span style="color: rgba(128, 0, 128, 1)">$fd</span>['address'],<span style="color: rgba(128, 0, 128, 1)">$fd</span>['port'],"Server: <span style="color: rgba(128, 0, 128, 1)">$data</span>"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$fd</span><span style="color: rgba(0, 0, 0, 1)">);
}
);
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start()
</span>?&gt;<span style="color: rgba(0, 0, 0, 1)">


web 服务器
</span>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建web服务器</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_http_server("0.0.0.0",9501<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取请求</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">

$request:请求信息
$response:返回信息
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;on('request',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$request</span>,<span style="color: rgba(128, 0, 128, 1)">$response</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$response</span>-&gt;<span style="color: rgba(0, 128, 128, 1)">header</span>("Content-Type","text/html;charset=utf-8");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置返回头信息</span>
<span style="color: rgba(128, 0, 128, 1)">$response</span>-&gt;<span style="color: rgba(0, 128, 128, 1)">end</span>("hello word".<span style="color: rgba(0, 128, 128, 1)">rand</span>(100,999<span style="color: rgba(0, 0, 0, 1)">));
});
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start();

</span>?&gt;<span style="color: rgba(0, 0, 0, 1)">
实现websocket
</span>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建webscork 服务器</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span> =<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> swoole_websocket_server
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">on
//open 建立连接 $ws 服务器, $request:客户端信息</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span> -&gt;on('open',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$ws</span>,<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;push(<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd,"welcome \n"<span style="color: rgba(0, 0, 0, 1)">);
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">message 接收信息</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span> -&gt;on('message',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$ws</span>,<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "Message: <span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;data"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;push(<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd,"get it message"<span style="color: rgba(0, 0, 0, 1)">);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">close 关闭连接</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;on('close',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$ws</span>,<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "close\n"<span style="color: rgba(0, 0, 0, 1)">;
})
</span><span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start();
</span>?&gt;<span style="color: rgba(0, 0, 0, 1)">
webscork</span>.<span style="color: rgba(0, 0, 0, 1)">html
</span>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head lang="en"&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt;
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">指的服务器webscort服务器</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> wsServer="ws://192.168.0.1:9501;"
<span style="color: rgba(0, 0, 255, 1)">var</span> webSocket = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WebSocket(wsServer);
webSocket</span>.onopen = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(evt){
console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span>("连接成功"<span style="color: rgba(0, 0, 0, 1)">);
}
webSocket</span>.onclose = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(evt){
console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span>("关闭"<span style="color: rgba(0, 0, 0, 1)">)
}
webSocket</span>.onmessage = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(evt){
console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span><span style="color: rgba(0, 0, 0, 1)">(data);
}
webSocket</span>.onerror = <span style="color: rgba(0, 0, 255, 1)">function</span>(evt,<span style="color: rgba(0, 0, 0, 1)">e){
console</span>.<span style="color: rgba(0, 128, 128, 1)">log</span>("error"<span style="color: rgba(0, 0, 0, 1)">)
}
</span>&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">循环执行定时器</span>
swoole_time_tick(2000,<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$timer_id</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "执行 <span style="color: rgba(128, 0, 128, 1)">$timer_id</span> \n"<span style="color: rgba(0, 0, 0, 1)">;
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">单次执行</span>
swoole_time_after(3000,<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "3 秒后执行"<span style="color: rgba(0, 0, 0, 1)">
})
</span>?&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">task() 函数 投递异步任务
//on('事件',function(){}) 处理函数执行异步函数
//finish()函数, 任务处理完成后结果
//异步TCP服务器
//创建TCP服务器</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_server("0.0.0.0",9501<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置异步 进程工作数</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span> -&gt;set(<span style="color: rgba(0, 0, 255, 1)">array</span>('task_worker_num' =&gt;4<span style="color: rgba(0, 0, 0, 1)"> ));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 投递异步任务</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;on("receive",<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$fd</span>,<span style="color: rgba(128, 0, 128, 1)">$from_id</span>,<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$task_id</span> = <span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;tack(<span style="color: rgba(128, 0, 128, 1)">$data</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取异步ID</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> "异步ID: <span style="color: rgba(128, 0, 128, 1)">$task_id</span>\n"<span style="color: rgba(0, 0, 0, 1)">;
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">处理异步任务</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span> -&gt; on('task',functino(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$task_id</span>,<span style="color: rgba(128, 0, 128, 1)">$from_id</span>,<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "执行 异步ID:<span style="color: rgba(128, 0, 128, 1)">$task_id</span>"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-finish("<span style="color: rgba(128, 0, 128, 1)">$data</span>-&gt;ok"<span style="color: rgba(0, 0, 0, 1)">);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">处理结果</span>
<span style="color: rgba(128, 0, 128, 1)">$serv</span> -&gt;on('finish',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$serv</span>,<span style="color: rgba(128, 0, 128, 1)">$task_id</span>,<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "执行完成"<span style="color: rgba(0, 0, 0, 1)">;
})
</span><span style="color: rgba(128, 0, 128, 1)">$serv</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start();
</span>?&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程创建</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">

new swoole_process()
参数1: mixed $function 子进程创建成功后执行的函数
参数2: $redirect_stdin_stdout 重定向子进程的标准输入和输出。启用此选项后,在进程内echo将不是打印屏幕。而是写入到管道
读取键盘输入将变成从管道中读取。默认为阻塞读取
$create_pipe 是否创建管道。启用
$redirect_stdin_stdout后,此选项将忽略用户参数,强制为true,如果子进程内没有进程间通信,可以设置为false




</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建进程
//进程对应的执行函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> doProcess(swoole_process <span style="color: rgba(128, 0, 128, 1)">$worker</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "PID",<span style="color: rgba(128, 0, 128, 1)">$worker</span>-&gt;pid,"\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">sleep</span>(10<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建进程
//创建多个进程</span>
<span style="color: rgba(128, 0, 128, 1)">$process</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_process("doProcess"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$pid</span> = <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start();

</span><span style="color: rgba(128, 0, 128, 1)">$process</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_process("doProcess"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$pid</span> = <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等待结束</span>
swoole_process::<span style="color: rgba(0, 0, 0, 1)">wait();
</span>?&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程事件
//swoole_event_add()</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">参数1:int_$sock

int 文件描述
mixed $read callback 就是 stream_socket_client/fsockopen创建资源
sockets 就是sockets扩展中socket_create创建的资源,需要在编译时候加入
./configure --enable-sockets


</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(128, 0, 128, 1)">$workers</span> = [];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程数组</span>
<span style="color: rgba(128, 0, 128, 1)">$worker_num</span> =3;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建进程的数量
//创建启动进程</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0;<span style="color: rgba(128, 0, 128, 1)">$i</span>&lt;<span style="color: rgba(128, 0, 128, 1)">$worker_num</span>;<span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$process</span> =<span style="color: rgba(0, 0, 255, 1)">new</span> swoole_process('doProcess');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建单独的新进程</span>
<span style="color: rgba(128, 0, 128, 1)">$pid</span> = <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;start();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">启动进程,获取进程ID</span>
<span style="color: rgba(128, 0, 128, 1)">$workers</span>[<span style="color: rgba(128, 0, 128, 1)">$pid</span>] = <span style="color: rgba(128, 0, 128, 1)">$process</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 存入进程数组</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建进程执行函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> doProcess(swoole_process <span style="color: rgba(128, 0, 128, 1)">$process</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;write("PID:<span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;pid");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">子进程写入信息</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> "写入信息: <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;pid <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;callback"<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加进程事件 向每一个子进程添加需要执行的动作</span>
<span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$workers</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$process</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加</span>
swoole_event_add(<span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;pipe,<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$pipe</span>) <span style="color: rgba(0, 0, 255, 1)">use</span>(<span style="color: rgba(128, 0, 128, 1)">$process</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;read();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">能否读取数据</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> "接受到:<span style="color: rgba(128, 0, 128, 1)">$data</span> \n"<span style="color: rgba(0, 0, 0, 1)">;
});
}

</span>?&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程队列通信</span>
<span style="color: rgba(128, 0, 128, 1)">$workers</span> = [];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程仓库</span>
<span style="color: rgba(128, 0, 128, 1)">$worker_num</span> = 2;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最大进程数
//批量创建进程</span>
<span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0;<span style="color: rgba(128, 0, 128, 1)">$i</span>&lt;<span style="color: rgba(128, 0, 128, 1)">$worker_num</span>;<span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$process</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_process('doProcess',<span style="color: rgba(0, 0, 255, 1)">false</span>,<span style="color: rgba(0, 0, 255, 1)">false</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建子进程完成</span>
<span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;useQuneue();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开启队列,类似于全局函数</span>
<span style="color: rgba(128, 0, 128, 1)">$pid</span> = <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start();
</span><span style="color: rgba(128, 0, 128, 1)">$workers</span>[<span style="color: rgba(128, 0, 128, 1)">$pid</span>] = <span style="color: rgba(128, 0, 128, 1)">$process</span><span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程执行函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> doProcess(swoole_process <span style="color: rgba(128, 0, 128, 1)">$process</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$recv</span> = <span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;pop();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">8192</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> "从主进程获取到的数据:<span style="color: rgba(128, 0, 128, 1)">$recv</span> \n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">sleep</span>(5<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;<span style="color: rgba(0, 0, 255, 1)">exit</span>(0<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">主进程 向子进程添加数据</span>
<span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$workers</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$pid</span> =&gt;<span style="color: rgba(128, 0, 128, 1)">$process</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$process</span>-&gt;push("Hello 子进程 <span style="color: rgba(128, 0, 128, 1)">$pid</span> \n"<span style="color: rgba(0, 0, 0, 1)">)
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等待子进程结束回收资源</span>
<span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span>=0;<span style="color: rgba(128, 0, 128, 1)">$i</span>&lt;<span style="color: rgba(128, 0, 128, 1)">$worker_num</span>;<span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$ret</span> = swoole_process::wait();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等待执行完成</span>
<span style="color: rgba(128, 0, 128, 1)">$pid</span> = <span style="color: rgba(128, 0, 128, 1)">$ret</span>['pid'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">unset</span>(<span style="color: rgba(128, 0, 128, 1)">$workers</span>[<span style="color: rgba(128, 0, 128, 1)">$pid</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "子进程退出 <span style="color: rgba(128, 0, 128, 1)">$pid</span> \n"<span style="color: rgba(0, 0, 0, 1)">;
}
</span>?&gt;

&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">触发函数 异步执行 达到10次停止</span>
swoole_process::signal(SIGALRM,<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
</span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$i</span> = 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<span style="color: rgba(128, 0, 128, 1)">$i</span> \n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span>&gt;10<span style="color: rgba(0, 0, 0, 1)">){
swoole_process</span>::alarm(-1); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除定时器</span>
<span style="color: rgba(0, 0, 0, 1)">}
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定时器</span>
swoole_process::alarm(100 *1000<span style="color: rgba(0, 0, 0, 1)">);
</span>?&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建锁对象</span>
<span style="color: rgba(128, 0, 128, 1)">$lock</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> swoole_lock(SWOOLE_MUTEX);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">互斥锁</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> "创建互斥锁\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$lock</span>-&gt;lock();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开始锁定 主进程</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(pcntl_fork()&gt;0<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">sleep</span>(1<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$lock</span>-&gt;unlock();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">解锁</span>
}<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "子进程 等待锁\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$lock</span>-&gt;lock();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上锁</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> "子进程 获取所"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$lock</span>-&gt;unlock();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">释放锁</span>
<span style="color: rgba(0, 0, 255, 1)">exit</span>("子进程退出"<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "主进程 释放锁"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">unset</span>(<span style="color: rgba(128, 0, 128, 1)">$lock</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">sleep</span>(1<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "子进程退出"<span style="color: rgba(0, 0, 0, 1)">;
</span>?&gt;
&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">dns查询</span>
swoole_async_dns_lookup('www.baidu.com',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$host</span>,<span style="color: rgba(128, 0, 128, 1)">$ip</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<span style="color: rgba(128, 0, 128, 1)">$host</span>,<span style="color: rgba(128, 0, 128, 1)">$ip</span>"<span style="color: rgba(0, 0, 0, 1)">;
})
</span>?&gt;<span style="color: rgba(0, 0, 0, 1)">
swoole 实现及时通信 服务器端
</span>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">服务器代码
//创建websocker 服务器</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span> =<span style="color: rgba(0, 0, 255, 1)">new</span> swoole_websocket_server("0.0.0.0",9502<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">on 函数 open message close
//open情况</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;on('open',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$ws</span>,<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "新用户 <span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd 加入。\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>['fd'][<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd]['id'] =<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置用户ID</span>
<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>['fd'][<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd]['name'] ='匿名用户';<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置用户名</span>
<span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">message 收发消息</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;on('message',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$ws</span>,<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$msg</span> =<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>['fd'][<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd]['name'].":".<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;data."\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">strstr</span>(<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;data,"#name#"<span style="color: rgba(0, 0, 0, 1)">)){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户设置昵称</span>
<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>['fd'][<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;fd]['name']=<span style="color: rgba(0, 128, 128, 1)">str_replace</span>("#name#",'',<span style="color: rgba(128, 0, 128, 1)">$request</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">data);
}</span><span style="color: rgba(0, 0, 255, 1)">else</span>{ <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进行用户信息发送
//发送到每一个客户端</span>
<span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>['fd'] <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;push(<span style="color: rgba(128, 0, 128, 1)">$i</span>['id'],<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
}
}
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">close</span>
<span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;on('close',<span style="color: rgba(0, 0, 255, 1)">function</span>(<span style="color: rgba(128, 0, 128, 1)">$ws</span>,<span style="color: rgba(128, 0, 128, 1)">$request</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "客户端-{<span style="color: rgba(128, 0, 128, 1)">$request</span>} 断开连接\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">unset</span>(<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>['fd'][<span style="color: rgba(128, 0, 128, 1)">$request</span>]);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除连接仓库</span>
<span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(128, 0, 128, 1)">$ws</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">start()
</span>?&gt;<span style="color: rgba(0, 0, 0, 1)">

作者:a十二_4765
链接:https</span>:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.jianshu.com/p/00babd74567e</span>
<span style="color: rgba(0, 0, 0, 1)">来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/chengfengchi/p/11397574.html
頁: [1]
查看完整版本: php swoole 安装与使用