视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Linux下搭建swoole服务的基本步骤
2020-11-03 23:09:30 责编:小采
文档


一、安装swoole服务

1.下载swoole源码,下载地址: https://github.com/swoole/swoole-src/releases

2.将tar包上传到/usr/local/src/swoole下面,这里面存储安装源文件。

3.解压源文件,tar –xvfswoole.tar

4.进入到刚解压的目录下输入命令phpize

5.注意:phpize是php-devel中的东西,它可以给PHP动态添加扩展,所以,请确保你的机器上安装了php-devel软件包。

6.接着,依次输入如下命令:./configure,执行编译检测make,编译swoole

7.缺少pcre和pcre-devel相关软件包,安装上即可。

8.sudo make install

9.php.ini一般在etc下面 编译安装成功后,我们还需要修改php.ini,在其中加入swoole.so扩展:

10.extension=swoole.so

11.输入php -m中能查看到swoole说明扩展安装成功。

二、安装apache启动swoole服务

(1)测试是否安装正确启动swoole Php服务

(2)在apache中添加server.php文件,和client.php文件。一般目录在var/www/html下面

(3)打开两个终端 在这两个文件所在的目录下面打开这两个文件,可以实现socket长连接服务。

安装lsof:yum -y install lsof

三、配置Server端

class WebSocketService {
 
 private static $instance = NULL;
 public $tagindex = 0;
 public $server = null;
 public $office_cache = null;
 public $timer_arr = []; //该变量保存所有的定时器任务ID,每一个客户端可以通过$timer_arr[客户端ID]
 得到该客户端建立的所有定时器
 public $conf = [
 'host' => '0.0.0.0',
 'port' => 9999, //服务使用端口
 'worker_num' => 2, //启动worker进程数
 'task_worker_num' => 8, //启动task进程数
 'is_daemonize' => 0, //是否后台运行:0-否,1-是
 'log_file' =>'/tmp/swoole_webSocket_server.log', //日志文件路径
 'abc' =>0,
 ];
 
 public function getTagIndex() {
 return $this->conf['abc'];
 }
 
 public function setSetTagIndex($index) {
 $this->conf['abc'] = 100;
 echo $this->getTagIndex();
 }
 
 public function __construct($config = []) {
 $this->office_cache = array('1' => '1', '3'=>'2');
 $this->conf = array_merge($this->conf, (array)$config);
 }
 
 //静态方法,返回此类唯一实例 
 public static function getInstance(){
 if(empty(self::$instance)){ 
 echo "instance 
";
 self::$instance=new WebSocketService(); 
 } 
 return self::$instance; 
 }
 
 /**
 * 服务器端运行webSocket的入口
 */
 public function run() {
 try {
 $this->server = new swoole_websocket_server($this->conf['host'],$this->conf['port']);
 $this->server->set(
 [
 'worker_num' => $this->conf['worker_num'],
 'task_worker_num' =>$this->conf['task_worker_num'],
 'daemonize' => $this->conf['is_daemonize'],
 'log_file' => $this->conf['log_file'],
 ]
 );
 
 //注册方法列表
 $this->server->on('open', [$this, 'open']);
 $this->server->on('message', [$this, 'message']);
 $this->server->on('task', [$this, 'task']);
 $this->server->on('finish', [$this, 'finish']);
 $this->server->on('close', [$this, 'close']);
 
 $this->server->start();
 } catch (Exception $e) {
 var_dump($e->getCode() . ':' . $e->getMessage());
 }
 
 }
 
 /**
 * 建立socket链接时,执行方法
 * @param $server
 * @param $request
 */
 public function open($server, $request) {
 $data = [
 'client_id' => $request->fd,
 'request' => $request
 ];
 echo 'open<<'.$data['client_id'];
 $this->doOpen($data);
 }
 
 /**
 * 发送消息时,执行方法
 * @param $server
 * @param $frame
 */
 public function message($server, $frame) {
 echo "GET_mesage
";
 $data = [
 'client_id' => $frame->fd,
 'data' => $frame->data,
 'frame' => $frame,
 ];
 $this->doMessage($data);
 }
 
 /**
 * 执行具体任务
 * @param $server
 * @param $task_id
 * @param $from_id
 * @param $data
 */
 public function task($server, $task_id, $from_id, $data) {
 $data['task_id'] = $task_id;
 $data['from_id'] = $from_id;
 $this->doTask($data);
 }
 
 /**
 * 任务结果处理
 * @param $server 服务器对象
 * @param $taskId 任务进程ID
 * @param $data
 */
 public function finish($server, $taskId, $data) {
 $data['task_id'] = $taskId;
 $this->doFinish($data);
 }
 
 /**
 * 关闭链接
 * @param $server 服务器对象
 * @param $client_id 客户端唯一标识
 */
 public function close($server, $client_id) {
 $data = [
 'client_id' => $client_id
 ];
 $this->doClose($data);
 }
 
 /**
 * 客户端成功连接到服务器时,会触发该方法
 * 子类根据需求重写该方法
 * @param $data
 * [
 * 'client_id', //客户端唯一标识
 * 'data', //一些请求数据
 * 'frame', //swoole的数据
 * ];
 */
 public function doOpen($data) {
 echo "建立连接成功";
 
 }
 
 /**
 * 得到Swoole Websocket Server
 *
 * @return null|swoole_websocket_server
 */
 public function getServer()
 {
 return $this->server;
 }
 
 /**
 * 收到客户端发来的消息,会触发该方法
 * 子类根据需求重写该方法
 * @param $data
 * [
 * 'client_id', //客户端唯一标识
 * 'data', //客户端发送过来的消息(数据)
 * 'frame', //swoole的数据
 * ];
 */
 public function doMessage($data) {
 $info = json_decode($data['data'],true);
 $officeid = $info['officeid'];
 $client_id = $data['client_id'];
 echo"<<<<".$officeid.">>>>".$client_id."
";
 if ($officeid == 1) {
 $this->sendMsgToClient('2',array('msg' =>'我是1号场地发送给你数据'));
 } else {
 $this->sendMsgToClient('1',array('msg' =>'我是3号场地发送给你数据'));
 }
 }
 
 /**
 * 具体的工作任务。需要通过 $this->doJob()来触发
 * 子类根据需求重写该方法
 * @param $data
 * [
 * 'client_id', //客户端唯一标识
 * ];
 */
 public function doTask($data) {
 }
 
 /**
 * 工作的结果处理。
 * 子类根据需求重写该方法
 * @param $data
 * [
 * 'client_id', //客户端唯一标识
 * ];
 */
 public function doFinish($data) {
 }
 
 /**
 * 客户端断开时会自动触发该方法
 * 子类根据需求重写该方法
 * @param $data
 * [
 * 'client_id', //客户端唯一标识
 * ];
 */
 public function doClose($data) {
 }
 
 
 /**
 * 发送任务
 * @param $data 必须是数组,且要有$data['client_id']
 */
 public function doJob($data) {
 $this->server->task($data);
 }
 
 public function finishJob($data) {
 $this->server->finish($data);
 }
 
 /**
 * 发送消息到客户端
 * @param $client_id
 * @param $msg
 */
 public function sendMsgToClient($client_id, $msg) {
 echo "发送信息给客户端:{$client_id} | {$msg['action']['name']} | " . date('Y-m-dH:i:s') . "
";
 $this->server->push($client_id, json_encode($msg));
 }
 
 /**
 * 关闭客户端链接
 * @param $client_id
 */
 public function closeClient($client_id) {
 $this->server->close($client_id);
 }
 
 /**
 * 添加定时器
 * @param $client_id
 * @param $tick_time
 */
 public function addTimer($client_id, $tick_time) {
 //暂未实现,先使用swoole原生写法
 }
 
 /**
 * 清除定时器
 * @param $client_id
 * @param $arr
 */
 public function clearTimer($client_id, &$arr) {
 if (is_array($arr)) {
 foreach ($arr[$client_id] as $val) {
 if (is_array($val)) {
 foreach ($val as $v) {
 swoole_timer_clear($v);
 }
 } else {
 swoole_timer_clear($val);
 }
 }
 }
 unset($arr[$client_id]);
 }
}

四、配置html前端

$(document).ready(function(){
 varwsurl = "ws://182.92.101.206:9999/";
 console.log(wsurl);
 varwebsocket = new WebSocket(wsurl);
 websocket.onopen= function(evt){
 console.log('Server: 打开WebSocket连接');
 };

 websocket.onclose= function(evt){
 console.log('Server: 关闭WebSocket连接');
 };

 websocket.onmessage= function(evt){
 varres = JSON.parse(evt.data);
 console.log('Server: 收到消息(来自:'+res+'请求)');
 console.log(res);
 };

 websocket.οnerrοr= function(evt){
 console.log('Server: 出现错误');
 console.log(evt.data);
 }

 functiondoSend(msg){
 console.log('Client:发送消息 ' + msg);
 websocket.send(msg);
 }
});

五、启动start.php文件,cd到指定目录下,然后PHP-CLI运行php start.php。这种方式是没有启用线程保护的关掉后程序结束线程还在占用。

require'src/WebSocketSwoole/WebSocketService.php';
// require './WebSocketService.php';
session_start();
// $demoService = newWebSocketSwooleWebSocketService();
$demoService =WebSocketSwooleWebSocketService::getInstance();
$demoService->run();

PHP中文网,大量的免费swoole入门教程,欢迎在线学习!

下载本文
显示全文
专题