# 系统 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 installcomposer dump-autoload
安装 IDE 代码提示组件
composer require easyswoole/swoole-ide-helper

这个时候会报错

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

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

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

<IfModule mod_rewrite.c>Options +FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{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
</IfModule>

## 设置配置文件
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
创建这个文件后,程序会自动识别和加载路由

<?php
namespace App\HttpController;use EasySwoole\Http\AbstractInterface\AbstractRouter;
use FastRoute\RouteCollector;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;class Router extends AbstractRouter
{function initialize(RouteCollector $routeCollector){$routeCollector->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 = '9527@qq.com';$this->param = ['email' => '8888888@163.com','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('<h1>邮箱内容主体</h1>');$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 的格式 是 a@163.com,b@163.com,c@163.com,dd@163.com,eeee@163.com$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 = ['g_1_a@163.com','g_2_a@163.com','g_3_a@163.com','g_4_a@163.com','g_5_a@163.com','g_6_a@163.com',];// 获取数据库数据$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对象或者nullif ($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文档

easyswoole初体验相关推荐

  1. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  2. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  3. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  4. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  5. 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...

  6. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  7. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  8. Spring环境搭建,IoC容器初体验~

    由于最近的任务是关于IoC配置文件格式的转换,所以需要从Spring的IoC容器开始学起,今天根据网上的介绍搭建了Spring环境,并对其IoC容器进行了初体验.文章中涉及到的软件以及推荐的一本关于S ...

  9. 来自新手Banana Pi香蕉派初体验

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 一段时间来对有强大的技术支持和完善的社区的Raspberry Pi很感兴趣,本想入一片学习学习,但转念一想Raspb ...

最新文章

  1. Modus串行链路系统电气特性:2线-Modus、4线-Modus、RS232-Modus和RS485-Modus的特性
  2. Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源
  3. 4.4、Bootstrap V4自学之路------组件---表单
  4. 中文输入法不触发onkeyup事件的解决办法
  5. python django项目断点调试
  6. POJ 2778 DNA Sequence (AC自动机+矩阵快速幂)
  7. 《Go语言圣经》学习笔记 第一章 Go语言入门
  8. 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树
  9. C语言,全局变量与局部变量问题
  10. MySQL数据库MyISAM与InnoDB存储引擎的比较
  11. 孤岛惊魂4服务器稳定吗,《孤岛惊魂5》究竟好不好玩 让我来告诉你(缺点)
  12. 豆瓣 音乐和读书的搜索页的 window.__DATA__ 的解密
  13. 大学excel题库含答案_2017excel试题库附答案.doc
  14. 壁纸最佳分辨率尺寸表
  15. 关于mipi数据的一些评估计算
  16. 解决Ubuntu18无法进入-显示/dev/nvme0n1p8:recovering Journal
  17. 说说dota、人生、程序(长篇、神经质)
  18. 计算机网络中传输速率最快的,计算机网络中常用的传输介质中传输速率最快的是什么...
  19. (全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系?
  20. javascript socket

热门文章

  1. 【conda安装pytorch总是下载cpu版本的问题】
  2. 正大国际期货:如何摆脱炒黄金期货被套单?
  3. 如何在网页中展示360度照片
  4. 创新趋势下的NPDP认证
  5. vscode删除卸载残余
  6. Kotlin学习之路(4)——类,对象和接口
  7. Xcode使用教程详细讲解 (下)
  8. C语言学习笔记(9)之C语言的组成
  9. C++实现用汉字读一个正整数
  10. 大模型开发(四):OpenAI API调用方法