2019-12-07 swoole概念及初体验

一 .Swoole概念: 面向生产环境的    PHP    异步   网络通信引擎 

            1. 它本身是一个PHP的C扩展.可用来开发PHP的高性能高并发TCP/UDP Server。

            2. Swoole的网络IO部分基于epoll/kqueue事件循环,是全异步非阻塞的。

            3. 业务逻辑部分使用多进程同步阻塞方式来运行。这样既保证了Server能够应对高并发和大量TCP连接。又保证业务代码仍然可以简单的编写。

            4. Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数。

                而Swoole扩展在运行后会接管PHP的控制权,进入事件循环。当IO事件发生后底层会自动回调指定的PHP函数.


  二. Swoole特点: 

            1. 由于是纯C编写性能极强     2. 简单易用开发效率高     3. 事件驱动异步非阻塞    4. 并发百万TCP连接    5. TCP/UDP/UnixSock   

            6. 服务器端/客户端                7. 全异步/半异步半同步     8. 支持多进程/多线程      9. CPU亲和性/守护进程    10. 支持IPv4/IPv6网络


三. Swoole初体验及问题:

        注意: 

        server只能用于php-cli环境,在其他环境下会抛出致命错误 ( *php-cli环境即命令行运行)

        例如写入server.php文件,只能使用 php server.php 来运行,不可以到浏览器访问. 

        如果在浏览器中访问 server.php 文件,则会提示致命错误 :

        Fatal error: Uncaught Swoole\Exception: Swoole\Server can only be used in CLI mode in /www/wwwroot/swoole/server.php       

            ok接下来编写代码

            1. 编写server.php :
                

                      //1.构建Server对象, 默认创建的是一个同步的阻塞tcp服务

                      $host = '0.0.0.0';     //也可以用其他ip地址, 0.0.0.0 代表监听所有ip

                      $server = new Swoole\Server($host,9501);

                      // var_dump($server);

                      //2. 设置运行时的参数

                      //$server->set(array(

                               // 'worker_num'=>8, //工作进程数量

                               // 'daemonize'=>true //是否作为守护进程后台执行

                      //));

                      //3. 注册事件回调函数,回调函数一般用闭包函数,且先后顺序无所谓.

                          //监听连接进入事件,字面意思.

                          $server->on('connect',function($server,$fd){

                                      echo 'Client:Connect';

                          });

                          //监听数据接收事件

                         $server->on('receive',function($server,$fd,$from_id,$data){

                                        $server->send($fd,'Swoole:'.$data);

                                        $server-close($fd);

                         });

                         //监听连接关闭事件

                         $server->on('close',function($server,$fd){

                                     echo 'Client:close';

                         });

                        //监听swoole启动事件

                        $server->on('Start',function(){

                                     echo 'swoole start';

                        });

                  //4.启动服务

                  $server->start();//阻塞与非阻塞



            2. 记得一定使用命令行执行 php server.php   来运行.

            3.报错提醒:

                        <1> 运行后没反应/看起来像是卡住了.  查看代码,是否监听了onstart 启动服务事件,事件中是否有输出内容.

                        <2> 记得关闭防火墙

                        <3> 报错 : failed to listen server port[0.0.0.0:9501], Error: Address already in use[98] in /www/wwwroot/swoole/server.php:2

                               使用  netstat -apn | grep 9501  命令来查看9501端口是否已经占用. 如果是, 例如进程pid为8513, 使用 kill -9  8513   命令.

                               然后再次执行 php server.php

你可能感兴趣的:(2019-12-07 swoole概念及初体验)