EasySwoole
1、查询被占用端口
netstat -ntlp
2、杀死进程,被占用端口
kill 端口 //这个无法杀死时,使用下面这个
killall php //杀死所有php进程
kill -9 PID //PID端口
3、框架安装
composer require easyswoole/easyswoole=3.5.x
php vendor/easyswoole/easyswoole/bin/easyswoole install
更新命名空间
composer dump-autoload
启动
php easyswoole server start
守护模式启动
php easyswoole server start -d
守护模式启动的时候停止服务
php easyswoole server stop
4、其他
查看easyswoole安装的配置,如安装的mysqli等等
composer info | grep easyswoole
查看swoole版本
php --ri swoole
卸载mysqli
composer remove easyswoole/mysqli
安装orm,orm自带mysqli,如果安装了mysqli,在执行下面安装orm会报错
composer require easyswoole/orm
不能运行
删掉vendor和easyswoole还有composer.lock
重新安装
安装excel
composer require phpoffice/phpexcel
redis安装和配置
安装redis
composer require easyswoole/redis
安装redis连接池
composer require easyswoole/redis-pool
配置,在(根目录EasySwooleEvent.php的initialize方法加入)
//redis连接池注册(config默认为127.0.0.1,端口6379)
$redis = RedisPool::getInstance()->register(new \EasySwoole\Redis\Config\RedisConfig(
[
'host' => '127.0.0.1',
'port' => '6379',
'auth' => '123456',//密码,没有就留空
]
));
//配置连接池连接数
$redis->setMinObjectNum(5);
$redis->setMaxObjectNum(20);
在控制器中使用
引入
use EasySwoole\RedisPool\RedisPool;
使用
$redis = RedisPool::defer();
//key,数据,时间(秒)
$redis->set('name',1,10);
$name = $redis->get('name');
//获取连接池对象(返回bool(true))
$redisPool = RedisPool::getInstance()->getPool();
$redis = $redisPool->getObj();
$redisPool->recycleObj($redis);
新环境不能运行
删掉vendor和easyswoole还有composer.lock
composer require easyswoole/easyswoole=3.5.x
php vendor/easyswoole/easyswoole/bin/easyswoole install
安装mysql
composer require easyswoole/orm
安装redis
composer require easyswoole/redis
安装redis连接池
composer require easyswoole/redis-pool
测试工具
安装ab工具
yum -y install httpd-tools
查看安装目录
which ab
查看版本
ab -V
使用,发起1000个请求(请求1000次),并发100(同时100个用户请求)
ab -n 1000 -c 100 https://baidu.com/
ab -n 1000 -c 100 http://47.99.53.108:9501/User/dade
测试数据说明(服务器1核1G),请求5万,并发100
Benchmarking 47.99.53.108 (be patient) //基准47.99.53.108(耐心等待)
Completed 5000 requests //已完成5000个请求
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests
Server Software: EasySwoole //服务器软件:EasySwoole
Server Hostname: 47.99.53.108 //服务器主机名:127.0.0.1
Server Port: 9501 //服务器端口:9501
Document Path: /User/dade //文档路径:/User/dade
Document Length: 28 bytes //文件长度:28字节
Concurrency Level: 100 //并发级别:100
Time taken for tests: 66.061 seconds //测试所用时间:66.061秒
Complete requests: 50000 //完成申请:50000
Failed requests: 0 //失败的请求:0
Write errors: 0 //写入错误:0
Total transferred: 9450000 bytes //传输总量:9450000字节
HTML transferred: 1400000 bytes //传输的HTML:1400000字节
Requests per second: 756.88 [#/sec] (mean) //每秒请求数:756.88[#秒](平均值)
Time per request: 132.122 [ms] (mean) //每次请求的时间:132.122[ms](平均值)
Time per request: 1.321 [ms] (mean, across all concurrent requests) //每个请求的时间:1.321[ms](所有并发请求的平均时间)
Transfer rate: 139.70 [Kbytes/sec] received //传输速率:接收到139.70[千字节/秒]
Connection Times (ms) //连接时间(毫秒)
min mean[+/-sd] median max //最小平均值[+/-sd]最大中值
Connect: 3 79 279.8 4 4081 //连接:379279.844081
Processing: 6 49 148.2 15 5102 //处理:649148.215102
Waiting: 6 45 145.1 15 5102 //等候电话:645145.115102
Total: 9 128 326.6 20 7115 //总数:9128326.6207115
Percentage of the requests served within a certain time (ms) //在特定时间内服务的请求百分比(毫秒)
50% 20 //50% 20
66% 32
75% 43
80% 56
90% 245
95% 1023
98% 1048
99% 1235
100% 7115 (longest request) //100% 7115(最长请求)
控制器
控制器正常创建
App/HttpController/ 目录下创建,文件名首字母大写,控制器名首字母大写
根据创建目录和控制器访问,方法小写
安装orm操作数据库(配置,创建模型,使用模型查询)
安装,如果报错看上面的报错
composer require easyswoole/orm
可以在框架 initialize 主服务创建事件中注册连接
主方法在根目录的EasySwooleEvent.php文件
1、配置mysql连接(在根目录EasySwooleEvent.php)
public static function initialize()
{
$config = new Config();
$config->setDatabase('easyswoole_orm');//数据库
$config->setUser('easyswoole_orm');//用户名
$config->setPassword('iaPrA78EmEx6kAEC');//密码
$config->setHost('127.0.0.1');
$config->setPort(3306);
$config->setCharset('utf8mb4');
$config->setTimeout(15); // 超时时间
//连接池配置
$config->setGetObjectTimeout(3.0); //设置获取连接池对象超时时间
$config->setIntervalCheckTime(30*1000); //设置检测连接存活执行回收和创建的周期
$config->setMaxIdleTime(15); //连接池对象最大闲置时间(秒)
$config->setMinObjectNum(5); //设置最小连接池存在连接对象数量
$config->setMaxObjectNum(20); //设置最大连接池存在连接对象数量
$config->setAutoPing(5); //设置自动ping客户端链接的间隔
DbManager::getInstance()->addConnection(new Connection($config));
}
2、创建模型(开始都是没有文件的,自己创建)
在App\HttpController\Models中创建
创建User.php模型
<?php
namespace App\HttpController\Models;
use EasySwoole\ORM\AbstractModel;
class User extends AbstractModel
{
/**
* @var string
*/
protected $tableName = 'dade_user';
}
3、使用(在控制器User中使用)
引入模型
use App\HttpController\Models\User as users;
使用查询并返回
$res = users::create()->get(1);
$this->writeJson(200,$res,"success");
原生sql查询
引入
use EasySwoole\Mysqli\QueryBuilder;
use EasySwoole\ORM\DbManager;
代码
$queryBuild = new QueryBuilder();//new一个执行查询原生
$queryBuild->raw("select * from dade_user where id= 1");//sql
$data = DbManager::getInstance()->query($queryBuild, true, 'default')->toArray();//升级版,执行sql语子
$this->jsonData(200,$data['result']);//返回,这个是我自己编写的,你们请使用官网上的$this->writeJson(200,['name'=>'大得']);
模型新增
新增一条
$user['name'] = '大得';
$user['phone'] = '1336677';
users::create($user)->save();
批量新增,dade_user是表名
users::create()->func(function ( QueryBuilder $builder){
$builder->insertAll('dade_user', [
[
'name' => '大得1',
'phone' => 1336677,
],
[
'name' => '大得2',
'phone' => 1336677,
],
]);
});
模型修改
$datas['name'] = "大得6669999";
$user = users::create()->where("id",1)->update($datas);
原生更新法
$datas['name'] = "大得6669999";
$user = users::create()->where("id=2")->update($datas);
模型删除
删除全表数据,清空
users: : create ( ) - > destroy ( null , true ) ;
删除
users: : create ( ) - > where ( 'id' , 1 ) - > destroy ( ) ;
users: : create ( ) - > destroy ( [ 'id' = > 1 ] ) ;
获得域名后面的链接做token登录
//全局中间件判断登录,获得$request->getServerParams()
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
$cookie = $request->getCookieParams('user_cookie');
// 对 cookie 进行判断,比如在数据库或者是 redis 缓存中,存在该 cookie 信息,说明用户登录成功
$isLogin = false;
if ($isLogin) {
// 返回 true 表示继续往下执行控制器 action
return true;
} else {
// 这一步可以给前端响应数据,告知前端未登录
$data = Array(
"code" => 200,
"result" => $request->getServerParams(),
"msg" => '请先登录'
);
$response->withHeader('Content-Type', 'application/json;charset=utf-8');
$response->withStatus(200);
$response->write(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
// 返回 false 表示不继续往下执行控制器 action
return false;
}
});
跨域(跨域和效验登录是一起的)
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response): bool {
###### 处理请求的跨域问题 ######
$response->withHeader('Access-Control-Allow-Origin', '*');
$response->withHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
$response->withHeader('Access-Control-Allow-Credentials', 'true');
$response->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
if ($request->getMethod() === 'OPTIONS') {
$response->withStatus(\EasySwoole\Http\Message\Status::CODE_OK);
return false;
}
return true;
});