Swoole在工作中的应用

本文介绍了Swoole作为C语言编写的高性能网络通信引擎如何解决PHP性能问题,提供异步多线程、数据库连接池等功能,并展示了在实际项目中的应用,包括安装步骤、基类定义、任务处理和定时任务设置。Swoole通过协程支持同步编程,降低了PHP的I/O开销。然而,安装可能导致内存泄漏和兼容性问题,需要注意管理和监控。

众所周知,PHP的特点是开发效率高,适应当下多变的节奏,但是缺点也明显,就是不能常驻内存,跟数据库无法建立长连接,I/O开销和频繁实例化成为PHP性能的瓶颈。

Swoole是C语言编写的高性能网络通信引擎,诞生之初就是来解决PHP的性能问题,提供了异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。

Swoole
2.0版本增加了对协程(Coroutine)的支持,可以已同步的方式编写代码,底层自动进行协程调度,转变为异步IO。解决了传统异步编程嵌套回调的问题。

不过因为PHP默认在程序结束时销毁内存,一些扩展就没有清理,同时安装Swoole会导致内存泄漏和一些其他兼容性问题。

一 安装

下载源代码包,在虚拟机进入目录,执行命令进行编译和安装,注意要php-5.3.10以上版本。

wget https://github.com/swoole/swoole-src/archive/v4.5.2.tar.gz
tar -zxvf  swoole-src-4.5.2.tar.gz
cd swoole-src-4.5.2
phpize
./configure
make && make install
在/etc/php.d/新建文件swoole.ini,写入extension=swoole.so
重启apache

二 基类

<?php
namespace Kcloze\Jobs\Command;

use Symfony\Component\Console\Input\InputArgument;
use Kcloze\Jobs\Utils;
use Kcloze\Jobs\Process;

class AppCommand extends Command
{
    protected static $defaultName = 'app';

    public function __construct(array $config)
    {
        parent::__construct($config);
    }

    protected function configure()
    {
        $this->setDescription('manager swoole-jobs ');
        $this->addArgument('name', InputArgument::REQUIRED, 'Who do you want to start swoole-jobs?');
    }


    protected function start($work)
    {
        Utils::log(['subtype' => 'running','param'=>['work'=>$work], 'message' => 'swoole-jobs is starting...']);
        $this->output->writeln('swoole-jobs is starting...');
        $process = new Process($work);
        $process->start();
    }

    protected function restart($work)
    {
        Utils::log(['subtype' => 'running','param'=>['work'=>$work], 'message' => 'swoole-jobs is restarting...']);
        $this->output->writeln('swoole-jobs is restarting...');
        $this->stop($work);
        sleep(3);
        $this->start($work);
    }

    protected function stop($work)
    {
        Utils::log(['subtype' => 'running','param'=>['work'=>$work], 'message' => 'swoole-jobs is stopping...']);
        $this->output->writeln('swoole-jobs is stopping...');
        $this->sendSignal(SIGUSR1,$work);
    }

    protected function status($work)
    {
        $this->sendSignal(SIGUSR2,$work);
    }

    protected function exit($work)
    {
        Utils::log(['subtype' => 'running','param'=>['work'=>$work], 'message' => 'swoole-jobs is exiting...']);
        $this->output->writeln('swoole-jobs is exiting...');
        $this->sendSignal(SIGTERM,$work);

    }
}

三 使用

<?php
namespace Kcloze\Jobs\Jobs\coupon;
use lib\Log;
use bll\coupon\CouponBll;

class CouponDeal
{
    private static $bllObj;

    /**
     * 获取BLL对象单例
     * @param $bllName
     * @return object
     */
    private static function getInstance($bllName)
    {
        if(empty(self::$bllObj[$bllName]) || !(self::$bllObj[$bllName] instanceof $bllName))
        {
            self::$bllObj[$bllName] = new $bllName();
        }

        return self::$bllObj[$bllName];
    }

    /**
     * @brief 回调方法
     * @param $data 消息
     * @return mixed
     */
    public function dealCoupon($data)
    {
        $aRes = ['status'=>0];
        $oCouponBll = self::getInstance('bll\newbll\coupon\CouponBll');
        //TODO 处理优惠券,考虑后面会有多种类型的优惠券
        switch($data['type']){
            case '100':
                $aRes = $oCouponBll->dealAutoCoupon($data);
            break;   
        }
 
        //日志
        Log::info([
            'type' => 'coupon_deal',
            'call_file'     => __FILE__,
            'call_function' => __FUNCTION__,
            'param' => $data,
            'return' => $aRes,
            'message' => 'deal coupon'
        ]);

        $msg = 'consume auto coupon mq message fail';
        return $aRes;
    }
}

四 设置定时任务

. /etc/profile

umask 000

CURDIR=/www/lib/swoolejobs/bin
PHP=/usr/bin/php
cd $CURDIR
procNum=$(ps -ef | grep swoole-jobs.php | grep -v grep | wc -l)
if [ "$procNum" -lt "1" ];then
    if [ $1 == "check" ];then
        list="internal "
        for i in $list;
        do
            master_num=$(ps -aux | grep swoole-jobs_${i}_master| grep -v grep | wc -l)
            worker_num=$(ps -aux | grep swoole-jobs_${i}_worker| grep -v grep | wc -l)
            if [ $master_num -eq 0 ];then
                $PHP $CURDIR/swoole-jobs.php restart -w $i
                $PHP $CURDIR/swoole-jobs.php restartlog $i
            elif [ $worker_num -eq 0 ];then
                $PHP $CURDIR/swoole-jobs.php exit -w $i
                $PHP $CURDIR/swoole-jobs.php start -w $i
                $PHP $CURDIR/swoole-jobs.php restartlog $i
            fi
        done
    else
        $PHP $CURDIR/swoole-jobs.php $1 -w $2
    fi
fi

五 命令

在虚拟机开启:

sh swoolejobs.sh check

在这里插入图片描述
查看进程:

./swoolejobs.sh stop

在这里插入图片描述
停止进程:

ps axu | grep swoole

在这里插入图片描述
以上就是Swoole在工作中的应用。

在 Hyperf 框架中,Swoole 被用作底层运行引擎,使得 Hyperf 可以实现异步、协程化的高性能 Web 服务。Hyperf 利用 Swoole 提供的协程能力、异步 I/O 和常驻内存特性,构建出适用于高并发场景的服务端应用。 ### 应用场景 1. **API 服务**:Hyperf 非常适合用于构建 RESTful API 或微服务后端,尤其在需要处理大量并发请求的场景下表现优异。 2. **实时通信服务**:基于 Swoole 的 WebSocket 支持,Hyperf 可以轻松实现聊天系统、实时通知等应用场景[^3]。 3. **后台任务处理**:利用协程和异步特性,可以构建高效的队列消费者或定时任务系统。 4. **Serverless 架构适配**:由于框架启动速度快(<10ms),非常适用于 AWS Lambda、阿里云函数计算等 Serverless 场景[^3]。 ### 使用方法 #### 1. 安装与初始化 首先确保 PHP 环境已安装 Swoole 扩展,并通过 Composer 创建 Hyperf 项目: ```bash composer create-project hyperf/hyperf-skeleton my_project ``` 进入项目目录并启动服务: ```bash cd my_project php bin/hyperf.php start ``` 此时服务将基于 Swoole 启动 HTTP 服务器。 #### 2. 控制器与路由定义 在 `app/Controller` 目录下创建控制器文件,例如 `IndexController.php`: ```php <?php declare(strict_types=1); namespace App\Controller; use Hyperf\HttpServer\Annotation\Controller; use Hyperf\HttpServer\Annotation\GetMapping; #[Controller] class IndexController { #[GetMapping(path: "/")] public function index(): string { return "Hello from Hyperf with Swoole!"; } } ``` #### 3. 异步任务处理 使用 `Hyperf\Contract\ContainerInterface` 和 `Hyperf\Utils\Coroutine` 实现异步操作: ```php use Hyperf\Utils\Coroutine; Coroutine::create(function () { // 异步执行耗时操作 sleep(1); echo "Async task completed\n"; }); ``` #### 4. 缓存清理(如配置更新) 在开发过程中,修改配置后可能需要清除缓存以使更改生效,可执行如下命令: ```bash php bin/hyperf.php clear:all ``` 该命令会清除日志、缓存和注解扫描结果[^2]。 #### 5. 自定义 Swoole 配置 可以在 `config/autoload/swoole.php` 中调整 Swoole 的运行参数,例如设置 worker 数量、开启协程等: ```php return [ 'server' => [ 'options' => [ 'worker_num' => 4, 'enable_coroutine' => true, ], ], ]; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值