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 'open<<'.$data['client_id']; $this->doOpen($data); } /** * 发送消息时,执行方法 * @param $server * @param $frame */ public function message($server, $frame) { echo "GET_mesage\n"; $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."\r\n"; 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') . "\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('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 = new\WebSocketSwoole\WebSocketService(); $demoService =\WebSocketSwoole\WebSocketService::getInstance(); $demoService->run();
PHP中文网,大量的免费swoole入门教程,欢迎在线学习!
以上是Linux下搭建swoole服务的基本步骤的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

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

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

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)。

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

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

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