首页 php框架 Swoole Linux下搭建swoole服务的基本步骤

Linux下搭建swoole服务的基本步骤

Nov 22, 2019 pm 04:15 PM
linux swoole 搭建 服务

Linux下搭建swoole服务的基本步骤

一、安装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 \n";
           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 &#39;open<<&#39;.$data[&#39;client_id&#39;];
       $this->doOpen($data);
    }
 
   /**
    * 发送消息时,执行方法
    * @param $server
    * @param $frame
    */
   public function message($server, $frame) {
       echo "GET_mesage\n";
       $data = [
           &#39;client_id&#39; => $frame->fd,
           &#39;data&#39;      => $frame->data,
           &#39;frame&#39;     => $frame,
       ];
       $this->doMessage($data);
    }
 
   /**
    * 执行具体任务
    * @param $server
    * @param $task_id
    * @param $from_id
    * @param $data
    */
   public function task($server, $task_id, $from_id, $data) {
       $data[&#39;task_id&#39;] = $task_id;
       $data[&#39;from_id&#39;] = $from_id;
       $this->doTask($data);
    }
 
   /**
    * 任务结果处理
    * @param $server    服务器对象
    * @param $taskId    任务进程ID
    * @param $data
    */
   public function finish($server, $taskId, $data) {
       $data[&#39;task_id&#39;] = $taskId;
       $this->doFinish($data);
    }
 
   /**
    * 关闭链接
    * @param $server        服务器对象
    * @param $client_id     客户端唯一标识
    */
   public function close($server, $client_id) {
       $data = [
           &#39;client_id&#39; => $client_id
       ];
       $this->doClose($data);
    }
 
   /**
    * 客户端成功连接到服务器时,会触发该方法
     * 子类根据需求重写该方法
    * @param $data
    * [
    *    &#39;client_id&#39;,    //客户端唯一标识
    *    &#39;data&#39;,        //一些请求数据
    *    &#39;frame&#39;,        //swoole的数据
    * ];
    */
   public function doOpen($data) {
       echo "建立连接成功";
 
    }
 
   /**
    * 得到Swoole Websocket Server
    *
    * @return null|\swoole_websocket_server
    */
   public function getServer()
    {
       return $this->server;
    }
 
   /**
    * 收到客户端发来的消息,会触发该方法
    * 子类根据需求重写该方法
    * @param $data
    * [
    *    &#39;client_id&#39;,    //客户端唯一标识
    *    &#39;data&#39;,        //客户端发送过来的消息(数据)
    *    &#39;frame&#39;,        //swoole的数据
    * ];
    */
   public function doMessage($data) {
       $info = json_decode($data[&#39;data&#39;],true);
       $officeid = $info[&#39;officeid&#39;];
       $client_id = $data[&#39;client_id&#39;];
       echo"<<<<".$officeid.">>>>".$client_id."\r\n";
       if ($officeid == 1) {
           $this->sendMsgToClient(&#39;2&#39;,array(&#39;msg&#39; =>&#39;我是1号场地发送给你数据&#39;));
       } else {
           $this->sendMsgToClient(&#39;1&#39;,array(&#39;msg&#39; =>&#39;我是3号场地发送给你数据&#39;));
       }
    }
 
   /**
    * 具体的工作任务。需要通过 $this->doJob()来触发
    * 子类根据需求重写该方法
    * @param $data
    * [
    *    &#39;client_id&#39;,    //客户端唯一标识
    * ];
    */
   public function doTask($data) {
    }
 
   /**
    * 工作的结果处理。
     * 子类根据需求重写该方法
    * @param $data
    * [
    *    &#39;client_id&#39;,    //客户端唯一标识
    * ];
    */
   public function doFinish($data) {
    }
 
   /**
    * 客户端断开时会自动触发该方法
    * 子类根据需求重写该方法
    * @param $data
    * [
    *    &#39;client_id&#39;,    //客户端唯一标识
    * ];
    */
   public function doClose($data) {
    }
 
 
   /**
    * 发送任务
    * @param $data    必须是数组,且要有$data[&#39;client_id&#39;]
    */
   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[&#39;action&#39;][&#39;name&#39;]} | " . date(&#39;Y-m-dH:i:s&#39;) . "\r\n";
       $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(&#39;Server:  打开WebSocket连接&#39;);
    };

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

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

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

    functiondoSend(msg){
           console.log(&#39;Client:发送消息  &#39; + msg);
           websocket.send(msg);
    }
});
登录后复制

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

require&#39;src/WebSocketSwoole/WebSocketService.php&#39;;
// require &#39;./WebSocketService.php&#39;;
session_start();
// $demoService = new\WebSocketSwoole\WebSocketService();
$demoService =\WebSocketSwoole\WebSocketService::getInstance();
$demoService->run();
登录后复制

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

以上是Linux下搭建swoole服务的基本步骤的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

docker desktop怎么用 docker desktop怎么用 Apr 15, 2025 am 11:45 AM

如何使用 Docker Desktop?Docker Desktop 是一款工具,用于在本地机器上运行 Docker 容器。其使用步骤包括:1. 安装 Docker Desktop;2. 启动 Docker Desktop;3. 创建 Docker 镜像(使用 Dockerfile);4. 构建 Docker 镜像(使用 docker build);5. 运行 Docker 容器(使用 docker run)。

centos和ubuntu的区别 centos和ubuntu的区别 Apr 14, 2025 pm 09:09 PM

CentOS 和 Ubuntu 的关键差异在于:起源(CentOS 源自 Red Hat,面向企业;Ubuntu 源自 Debian,面向个人)、包管理(CentOS 使用 yum,注重稳定;Ubuntu 使用 apt,更新频率高)、支持周期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社区支持(CentOS 侧重稳定,Ubuntu 提供广泛教程和文档)、用途(CentOS 偏向服务器,Ubuntu 适用于服务器和桌面),其他差异包括安装精简度(CentOS 精

docker镜像失败怎么办 docker镜像失败怎么办 Apr 15, 2025 am 11:21 AM

Docker镜像构建失败的故障排除步骤:检查Dockerfile语法和依赖项版本。检查构建上下文中是否包含所需源代码和依赖项。查看构建日志以获取错误详细信息。使用--target选项构建分层阶段以识别失败点。确保使用最新版本的Docker引擎。使用--t [image-name]:debug模式构建镜像以调试问题。检查磁盘空间并确保足够。禁用SELinux以防止干扰构建过程。向社区平台寻求帮助,提供Dockerfile和构建日志描述以获得更具体的建议。

怎么看docker进程 怎么看docker进程 Apr 15, 2025 am 11:48 AM

Docker 进程查看方法:1. Docker CLI 命令:docker ps;2. Systemd CLI 命令:systemctl status docker;3. Docker Compose CLI 命令:docker-compose ps;4. Process Explorer(Windows);5. /proc 目录(Linux)。

vscode需要什么电脑配置 vscode需要什么电脑配置 Apr 15, 2025 pm 09:48 PM

VS Code 系统要求:操作系统:Windows 10 及以上、macOS 10.12 及以上、Linux 发行版处理器:最低 1.6 GHz,推荐 2.0 GHz 及以上内存:最低 512 MB,推荐 4 GB 及以上存储空间:最低 250 MB,推荐 1 GB 及以上其他要求:稳定网络连接,Xorg/Wayland(Linux)

docker原理详解 docker原理详解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

vscode怎么切换中文模式 vscode怎么切换中文模式 Apr 15, 2025 pm 11:39 PM

VS Code 切换中文模式的操作步骤:打开设置界面(Windows/Linux:Ctrl ,,macOS:Cmd ,)搜索 "Editor: Language" 设置在下拉菜单中选择 "中文"保存设置重启 VS Code

vscode 无法安装扩展 vscode 无法安装扩展 Apr 15, 2025 pm 07:18 PM

VS Code扩展安装失败的原因可能包括:网络不稳定、权限不足、系统兼容性问题、VS Code版本过旧、杀毒软件或防火墙干扰。通过检查网络连接、权限、日志文件、更新VS Code、禁用安全软件以及重启VS Code或计算机,可以逐步排查和解决问题。

See all articles