最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-03 23:09:30
文档

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

Linux下搭建swoole服务的基本步骤:一、安装swoole服务1.下载swoole源码,下载地址: https://github.com/swoole/swoole-src/releases2.将tar包上传到/usr/local/src/swoole下面,这里面存储安装源文件。3.解压源文件,tar –xvfswoole.tar4.进入到刚解压的目录下输入命令
推荐度:
导读Linux下搭建swoole服务的基本步骤:一、安装swoole服务1.下载swoole源码,下载地址: https://github.com/swoole/swoole-src/releases2.将tar包上传到/usr/local/src/swoole下面,这里面存储安装源文件。3.解压源文件,tar –xvfswoole.tar4.进入到刚解压的目录下输入命令


一、安装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入门教程,欢迎在线学习!

文档

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

Linux下搭建swoole服务的基本步骤:一、安装swoole服务1.下载swoole源码,下载地址: https://github.com/swoole/swoole-src/releases2.将tar包上传到/usr/local/src/swoole下面,这里面存储安装源文件。3.解压源文件,tar –xvfswoole.tar4.进入到刚解压的目录下输入命令
推荐度:
标签: 服务 linux 基本
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top