# 系统 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文档