cari
Rumahrangka kerja phpSwooleLinux下搭建swoole服务的基本步骤

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

Nov 22, 2019 pm 04:15 PM
linuxswoolemembinaHidangkan

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

Atas ialah kandungan terperinci Linux下搭建swoole服务的基本步骤. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:CSDN. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Bagaimana saya boleh menyumbang kepada projek sumber terbuka swoole?Bagaimana saya boleh menyumbang kepada projek sumber terbuka swoole?Mar 18, 2025 pm 03:58 PM

Artikel ini menggariskan cara untuk menyumbang kepada projek Swoole, termasuk melaporkan pepijat, menyerahkan ciri, pengekodan, dan meningkatkan dokumentasi. Ia membincangkan kemahiran dan langkah yang diperlukan untuk pemula untuk mula menyumbang, dan bagaimana mencari tekanan adalah

Bagaimana saya melanjutkan swoole dengan modul tersuai?Bagaimana saya melanjutkan swoole dengan modul tersuai?Mar 18, 2025 pm 03:57 PM

Artikel membincangkan memperluaskan swoole dengan modul tersuai, memperincikan langkah -langkah, amalan terbaik, dan penyelesaian masalah. Fokus utama ialah meningkatkan fungsi dan integrasi.

Bagaimanakah saya menggunakan ciri I/O Swoole yang tidak segerak?Bagaimanakah saya menggunakan ciri I/O Swoole yang tidak segerak?Mar 18, 2025 pm 03:56 PM

Artikel ini membincangkan menggunakan ciri I/O Swoole yang tidak segerak dalam PHP untuk aplikasi berprestasi tinggi. Ia meliputi pemasangan, persediaan pelayan, dan strategi pengoptimuman. Kira Word: 159

Bagaimana saya mengkonfigurasi pengasingan proses swoole?Bagaimana saya mengkonfigurasi pengasingan proses swoole?Mar 18, 2025 pm 03:55 PM

Artikel membincangkan mengkonfigurasi pengasingan proses swoole, manfaatnya seperti kestabilan dan keselamatan yang lebih baik, dan kaedah penyelesaian masalah.

Bagaimanakah model reaktor swoole berfungsi di bawah tudung?Bagaimanakah model reaktor swoole berfungsi di bawah tudung?Mar 18, 2025 pm 03:54 PM

Model Reaktor Swoole menggunakan seni bina I/O yang didorong oleh peristiwa, yang tidak menyekat untuk menguruskan senario-senario yang tinggi, mengoptimumkan prestasi melalui pelbagai teknik. (159 aksara)

Bagaimana saya menyelesaikan masalah sambungan di Swoole?Bagaimana saya menyelesaikan masalah sambungan di Swoole?Mar 18, 2025 pm 03:53 PM

Artikel membincangkan penyelesaian masalah, penyebab, pemantauan, dan pencegahan isu sambungan dalam Swoole, kerangka PHP.

Alat apa yang boleh saya gunakan untuk memantau prestasi Swoole?Alat apa yang boleh saya gunakan untuk memantau prestasi Swoole?Mar 18, 2025 pm 03:52 PM

Artikel ini membincangkan alat dan amalan terbaik untuk memantau dan mengoptimumkan prestasi Swoole, dan kaedah penyelesaian masalah untuk isu -isu prestasi.

Bagaimana saya menyelesaikan kebocoran memori dalam aplikasi swoole?Bagaimana saya menyelesaikan kebocoran memori dalam aplikasi swoole?Mar 18, 2025 pm 03:51 PM

Abstrak: Artikel ini membincangkan kebocoran memori dalam aplikasi swoole melalui pengenalan, pengasingan, dan penetapan, menekankan sebab -sebab umum seperti pengurusan sumber yang tidak wajar dan coroutin yang tidak dikendalikan. Alat seperti pelacak swoole dan valgrind

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa