easyswoole初体验

# 系统 linux
# PHP(7.2)+mysql+apache
# 环境软件(宝塔)

## 准备:
在宝塔平台上先安装PHP7.2,安装好后安装swoole4.0扩展.[注:在宝塔环境下,执行php -v 显示的PHP版本默认是当前最高版的,同时swoole也是当前版本的swoole]

## 安装easyswoole

composer require easyswoole/easyswoole=3.x
php vendor/easyswoole/easyswoole/bin/easyswoole install



 

这个时候会报错

Warning: putenv() has been disabled for security reasons in phar:///usr/bin/




说putenv函数被禁止,需要在宝塔接触禁止函数

## 设置域名绑定easyswoole(apache)


  Options +FollowSymlinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]  fcgi下无效
  RewriteRule ^(.*)$  http://127.0.0.1:9501/$1 [QSA,P,L]
   #请开启 proxy_mod proxy_http_mod request_mod


 

## 设置配置文件
easyswoole这里使用开发和生成环境分离的配置,项目根目录下的dev.php为开发配置,produce.php为生产环境
修改easyswoole数据库配置文件时,ftp无法上传,报错说权限不足,因为是root用户执行composer下载的easyswoole,所以这里要修改一下组和所属用户为www

chown -fR www ./*
chgrp -fR www ./*

 


安装easyswoole组件 orm(数据库组件),smtp(邮箱发送),fast-cache(缓存队列),task(异步),具体请看官方文档

在 /EasySwooleEvent.php 初始化相关组件,数据库和队列

use EasySwoole\ORM\Db\Connection;
use EasySwoole\ORM\DbManager;
use EasySwoole\FastCache\Cache;
use EasySwoole\EasySwoole\ServerManager;

public static function initialize()
{
    // TODO: Implement initialize() method.
    date_default_timezone_set('Asia/Shanghai');
    $config = new \EasySwoole\ORM\Db\Config(Config::getInstance()->getConf('MYSQL'));
    $config->setMaxObjectNum(20);//配置连接池最大数量
    DbManager::getInstance()->addConnection(new Connection($config));
}

public static function mainServerCreate(EventRegister $register)
{
    // TODO: Implement mainServerCreate() method.
    Cache::getInstance()->setTempDir(EASYSWOOLE_TEMP_DIR)->attachToServer(ServerManager::getInstance()->getSwooleServer());

}

 

## 设置路由
创建文件 App\HttpController\Router.php
创建这个文件后,程序会自动识别和加载路由

get('/email', '/Index/index');
    }
}


当请求 www.test.com/email 时,请求地址是 Index控制器下的index方法
www.test.com的默认路由是 /Index/index## 输出json
easyswoole 使用 echo,var_dump,exit('xxx) 等方法的结果不会输出到客户端(如浏览器,ajax,curl),而是输出在控制台上
自定义json数据输出,使用控制器的$this->response()->write方法输出到客户端

    protected function AjaxJson($code, $data, $msg) {
        $json = [
            'code' => $code,
            'data' => $data,
            'msg' => $msg,
        ];

        $this->response()->write(json_encode($json));
        return false;
    }


注:这里不能使用die,exit等中止函数## 使用邮箱的SMTP 发送邮箱
### 准备: 需要在 邮箱上开通 IMAP/SMTP权限,并获取到 授权密码,获取到邮箱的 SMTP的服务地址(如smtp.163.com),服务器放行25端口
代码:

    // 目标邮箱
    $to_email = '[email protected]';

    $this->param = [
        'email' => '[email protected]',
        'email_password' => 'xxxxx',
    ];

    // 我方邮箱账号密码
    $email = $this->param['email'];
    $email_password = $this->param['email_password'];

    $config = new MailerConfig();
    $config->setServer('smtp.163.com');
    $config->setPort(25);
    $config->setSsl(true); // 开启ssl
    $config->setUsername($email);
    $config->setPassword($email_password);
    $config->setMailFrom($email);
    $config->setTimeout(10);//设置客户端连接超时时间
    $config->setMaxPackage(1024*1024*5);//设置包发送的大小:5M

    $mimeBean = new Html(); //设置文本或者html格式
    $mimeBean->setSubject('邮箱标题');
    $mimeBean->setBody('

邮箱内容主体

');     $mailer = new Mailer($config);     $res = $mailer->sendTo($to_email, $mimeBean);     if($res){         $this->AjaxJson(1,$res,'测试发送成功');return false;     }else{         $this->AjaxJson(0,$res,'测试发送失败');return false;     }

# 队列和数据库的简单使用

    // emails 的格式 是 [email protected],[email protected],[email protected],[email protected],[email protected]
    $request = $this->request();
    $p_emails = explode(',', $request->getRequestParam('emails'));
    $job = new Job();
    foreach ($p_emails as $ko => $vo) {
        // 投递任务
        $job->setData($vo); // 任意类型数据
        $job->setQueue("p_emails");
        $jobId = Cache::getInstance()->putJob($job);
    }

    $g_emalis = [
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]',
    ];

    // 获取数据库数据
    $queryBuild = new QueryBuilder();
    // 支持参数绑定 第二个参数非必传
    $queryBuild->raw("select * from mail where id=1");
    $data = DbManager::getInstance()->query($queryBuild, true, 'default')->getResultOne();

    $task = TaskManager::getInstance();
    // 数据库数据存在时
    if (isset($data['title'])) {

        // 异步执行
        $task->async(function () use ($g_emalis, $data) {
                foreach ($g_emalis as $ko => $vo) {
                    // 取出任务
                    $job = Cache::getInstance()->getJob('p_emails');// Job对象或者null
                    if ($job === null){
                        echo "没有任务\n";
                    } else {
                        $chache = $job->toArray();
                        // var_dump($chache['data']);
                        echo 'p_email:'.$chache['data'].'----g_email:'.$vo."\n";
                        echo 'title:'.$data['title'].'----content:'.$data['content']."\n";
                        // 主动重发队列 (当队列全部取出时,会重新重头开始取出任务)
                        Cache::getInstance()->releaseJob($job);
                    }
                }
                // 清空缓存队列
                Cache::getInstance()->flushJobQueue('p_emails');
        });
    }

seayswoole文档

你可能感兴趣的:(架构)