在我看来,swoole的优点是性能高,可定制性强,应用场景广(支持http服务,socket服务,或者自己手撸个tcp服务)。但对于日常使用TP或laravel这类框架的开发者来说说,使用原生的swoole框架来做开发并不是很方便,于是产生了很多以swoole为核心的swoole框架,如easyswoole,Swoft ,SwooleDistributed 等,具体介绍可以看swoole的衍生开源项目。这次使用easyswoole来做一个http服务。
easyswoole目前有三个版本:v1, v2, v3。如果你不需要用到协程,建议用v1,否则建议用v3,这次我用v2。easyswoole的安装,路由配置就不多介绍了,请看官方文档:EasySwoole V2 中文手册。

env环境配置

在日常开发中,最少都会有两个环境:开发环境和生产环境,常见的方法是使用不同配置文件来区分这两个环境(如数据库的连接配置,Redis的连接配置等)。easyswoole v2默认没这个功能(v3有),为了实现这个功能,我使用vlucas/phpdotenv来做。
1.安装phpdotenv

composer require vlucas/phpdotenv

2.在根目录下添加Config目录,在该目录下添加database.php文件,并将数据库的配置信息移到该文件中,内容参考如下:

<?phpreturn ['database' => ['driver'    => 'mysql','host'      => env('DB_HOST','127.0.0.1'),'database'  => env('DB_DATABASE','park_new'),'username'  => env('DB_USERNAME','root'),'password'  => env('DB_PASSWORD','123456'),'charset'   => 'utf8','collation' => 'utf8_general_ci','prefix'    => ''],'redis' => ['master' => ['host' => env('REDIS_MASTER_HOST','127.0.0.1'),'port' => env('REDIS_MASTER_PORT',6379),'password' => env('REDIS_MASTER_PASSWORD',''),],'slave' => ['host' => env('REDIS_SLAVE_HOST','127.0.0.1'),'port' => env('REDIS_SLAVE_PORT',6379),'password' => env('REDIS_SLAVE_PASSWORD',''),],],
];

当然不是一定要放在这里,只需保证在swoole启动时能加载到.env配置,并在后面mysql,redis等读取配置时使用到它即可。

3.在根目录增加.env配置
和laravel的.env配置一样,比如

REDIS_MASTER_HOST=172.16.88.101
REDIS_MASTER_PASSWORD=888999
REDIS_MASTER_PORT=6379REDIS_SLAVE_HOST=172.16.88.102
REDIS_SLAVE_PASSWORD=888999
REDIS_SLAVE_PORT=6379

4.在EasySwooleEvent的frameInitialize中加载配置,内容如下

// 载入项目 Conf 文件夹中所有的配置文件
// 载入env配置
$dotenv = new \Dotenv\Dotenv('./');
$dotenv->load();$files = File::scanDir('./Config');
if($files){foreach ($files as $file) {$fileNameArr= explode('.',$file);$fileSuffix = end($fileNameArr);// 目前只支持php结尾的配置文件if($fileSuffix !='php'){continue;}if (!is_file($file)) {continue;}$confData = require_once $file;if (is_array($confData) && !empty($confData)) {foreach ($confData as $key=>$datum){Config::getInstance()->setConf($key,$datum);}}}
}

5.tips
假如使用git开发,一般都会排除vendor目录,但在使用easyswoole的过程中,可能会需要去修改下源码。此时我们需要保留vendor中的easyswoole目录,排除其他目录,可在.gitignore中做如下配置:

vendor/*
!vendor/easyswoole/

ORM封装

之前使用laravel比较多,习惯了illuminate/database
1.安装illuminate/database

composer require illuminate/database

2.加载illuminate/database
在 \EasySwoole\EasySwooleEvent 的 框架初始化完成 事件中初始化数据库类配置

use Illuminate\Database\Capsule\Manager as Capsule;//如果你不喜欢这个名称,as DB;就好
// 初始化完成
function static frameInitialize()
{// 初始化数据库$dbConf = Config::getInstance()->getConf('database');$capsule = new Capsule;// 创建链接$capsule->addConnection($dbConf);// 设置全局静态可访问$capsule->setAsGlobal(); // 启动Eloquent$capsule->bootEloquent();
}

3.增加Model配置
在App目录下增加一个Models目录,用于model层,定义下表这些,方便使用。比如增加一个订单信息表OrderInfo.php,内容如下:

<?phpnamespace App\Models;use  Illuminate\Database\Eloquent\Model;class OrderInfo extends Model
{protected $table = 'order_info';
}

4.愉快的使用
做好这些工作后,就可以方便的操作数据库了,如增加一个订单:

use App\Models\OrderInfo;$order = new OrderInfo();
$order->order_sn = date("YmdHis", time()) . $car->user_id . rand(000, 999);
$order->user_id = $car->user_id;
$order->car_number = $data['carID'];
$order->save();

redis封装

本次使用predis/predis
1.安装

composer require predis/predis

2.在App目录下创建Libs\Redis目录,在里面增加redis封装RedisTool.php,内容如下:

namespace App\Libs\Redis;use EasySwoole\Config;class RedisTool
{const REDIS_MAIN = 'master';const REDIS_SLAVE = 'slave';private static $ins = null;public static function getInstance($redisType=self::REDIS_MAIN, $extras=[]){// 获取配置$redisConf = Config::getInstance()->getConf('redis');$redisConf = array_merge($redisConf[$redisType], $extras);if(is_null(self::$ins)){self::$ins = new self($redisConf);}return self::$ins;}/**  构造函数**/private function __construct($config){$redis = new \Predis\Client($config);$this->ser = $redis;}/**  结束时关闭连接*/private function __destruct(){$this->ser->disconnect();}public function produce($key, array $data){return $this->ser->lpush($key, $data);}public function lpush($key, $data){if (is_string($data)) {$data = (array)$data;}return $this->ser->lpush($key, $data);}

3.使用redis

use App\Libs\Redis\RedisTool;RedisTool::getInstance()->lpush('CAR_OUT',$carOut->order_sn);

增加基础工具

一般项目中都会有些小函数,小方法,这里我统一把它们放到App\Libs\Base目录下(默认没这个目录,需手动创建)。如BaseService.php:

class BaseService
{public static function withResult($state, $message = '', $data = null){return ['state' => $state,'message' => $message,'data' => $data];}public static function withJson(string $retuslt,Response $response){$response->withHeader('Content-type','application/json; charset=utf-8');$response->write($retuslt);$response->end();}public static function withHtml(string $retuslt,Response $response){$response->withHeader('Content-type','text/html; charset=utf-8');$response->write($retuslt);$response->end();}
}

这些准备完成后,就可以愉快的撸代码了。最终我的整个项目规划如下:

APP|---- HttpController:默认的http控制器,里面写路由等|---- Libs:基础方法的封装,自定义的SDK等|---- Models:model层|---- Services:各种服务的封装,业务逻辑的处理等|---- Tasks:easyswoole的异步任务(很好用,很方便)|---- Utility:easyswoole的封装,如redis连接池,mysql连接池

我用easyswoole v2做了一个http服务相关推荐

  1. 090613 今天做了一个软件没搞定的RAID5

    今天做了一个RAID5 ,之前一个人用<**恢复大师>.<r-studio>以及<RAID Reconstructor>反正能用的软件都用过了,最后的结果是恢复出来 ...

  2. c语言写的跳转心理测试,求各位大神赐教!我做了一个“心理测试的答题卷”编程,总共有1...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求各位大神赐教!我做了一个"心理测试的答题卷"编程,总共有10道题,每道题有3个供选择的答案,每个答案得分从小到大是8分.5分和3分, ...

  3. 基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器——《干饭聊天室》

    基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器--<干饭聊天室> 在这里首先感谢前端小伙伴飞鸟 前端技术请看一款基于React.C++,使用TCP/HTTP协 ...

  4. 最近做了一个博客 玩玩而已 运城搜搜 www.lenovoyh.com

    最近做了一个博客 玩玩而已 运城搜搜 www.lenovoyh.com  用了以前一个没用的域名做的  现在还没排名 等待吧 呵呵 转载于:https://www.cnblogs.com/kiah/a ...

  5. 用c语言编写心里测试,求各位大神赐教!我做了一个“心理测试的答题卷”编程,总共有1...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求各位大神赐教!我做了一个"心理测试的答题卷"编程,总共有10道题,每道题有3个供选择的答案,每个答案得分从小到大是8分.5分和3分, ...

  6. 做了一个系列的Android开发教程列表

    做了一个系列的Android开发教程列表.花了半天多的专题 里面包含了 4个系列的教程. 也包含了很多Android开发资料. 喜欢的人可以收藏哦:http://dev.apkbus.com/

  7. 06年做的一个配置,从net130转过来的

    06年在2821xm上做的一个配置,包括封BT.策略路由.基于时间的访问控制列表和adsl拨号的配置.硬件配置是: 2821路由器+wic-1adsl模块 配置如下: Current configur ...

  8. 【发现】ASP.NET DEVELOPMENT SERVER 未能开始侦听端口xxxxx以一种访问权限不允许的方式做了一个访问套接字的尝试——解决方法...

    在调试ASP.NET的时候常出现如下错误 错误消息框:   ASP.NET   DEVELOPMENT   SERVER   未能开始侦听端口xxxxx以一种访问权限不允许的方式做了一个访问套接字的尝 ...

  9. 【Android】最近做的一个Android平台下时间统计工具

    最近在完成实验室的项目之后花了一点时间弄了一个小应用.因为自己也算是手机重度手机依赖患者,平时虽然玩手机时间不长,但是很频繁,所以一直想要知道自己每天打开手机多少次,用了哪些应用,以及每个应用花了多少 ...

最新文章

  1. C# 写Windows服务
  2. 历时数十载,20 位顶级大咖带你践行大数据与 AI(具体议程出炉)
  3. 使用Github(Github Issues)
  4. 利用Helm简化Kubernetes应用部署(1)
  5. layui绑定json_认识定制:JSON绑定概述系列
  6. JavaScript基础(五分钟让你了解js全貌)
  7. 一道头条算法题,一种不为人知的解法!
  8. swift5 修改Accessibility order读取的顺序
  9. svm 10折交叉验证 matlab,怎么用10折交叉验证程序?
  10. 谷歌地球专业版 for mac
  11. 软件工程课程实验报告:实验五
  12. 华为云官网前端的技术演进与低代码实践
  13. 磁盘配额超出 linux,Linux磁盘配额应用
  14. PHP输出星座,php 通过日期推算星座的方法
  15. 第三阶段应用层——1.2 数码相册—字符编码
  16. 解决七彩虹断剑C.A320M-K PRO V14在Win11下前置面板音频接口无法使用的问题
  17. 毕业论文完成,感谢帮助过我的人
  18. JAVA中文本字符反写
  19. 倒立摆系统分析及控制
  20. 月薪40k+测试·开发同步认可的FastAPI:Python 世界里最受欢迎的异步框架

热门文章

  1. stdlib函数编译linux,stdlib.h:没有这样的文件或目录
  2. 将数据生成带图表的pdf,并下载
  3. c语言晚安_晚安黄蜂
  4. 黄蜂女1.0:超小型无人机抵达现实世界
  5. 如何在Vue中实现过渡效果
  6. Discuz仿传奇MA游戏官网社区论坛模板源码
  7. 有了钉钉智能前台 美女前台可能要失业了
  8. 校园转转二手市场源码
  9. 微信小游戏帧同步demo(minigame-lockstep-demo)学习笔记
  10. android华为手机虚拟键,华为手机为何“固执”地保留屏内虚拟按键?答案揭秘!...