基于swoole引擎的多进程&协程&常驻内存式PHP框架,结构清晰,部署简单,使用方便。可以灵活应对HTTP/Websocket服务,内置子进程通信,可以灵活处理各类复杂业务。
- 目前主流的PHP框架都已经composer化,但作者坚持没有将Simoole框架composer化,目的是为了能保持本框架极简属性,以更好的适应docker部署和私有化部署等场景。
- 框架体积很小,常驻内存不必担心过多消耗。
- 如果需要实时更新框架,可以使用
./simoole update:latest
命令。
git clone https://gitee.com/dean_lee/Simoole.git
cd Simoole
docker build -t simoole .
docker run --name project -p 9200:9200 -d simoole
curl http://127.0.0.1:9200
./simoole start //开启实例
./simoole stop //关闭实例
./simoole reload //热更新(重启worker进程,公共内存无影响)
./simoole restart //重启实例
./simoole cleanup //清空内存表
./simoole update:版本号 //更新框架,可以使用latest
|- app --应用目录 |- |- common --公共目录 |- |- controller --默认模块目录 |- |- |- index.class.php --默认控制器文件 |- |- model --模块目录 |- |- websocket --websocket目录 |- |- |- index.class.php --默认websocket文件 |- log --日志目录 |- tmp --临时文件目录 |- config --配置文件目录 |- |- system --系统配置目录 |- |- |- server.ini.php --实例综合配置 |- |- |- database.ini.php --数据库配置 |- |- |- map.ini.php --加载模式配置 |- |- |- mtable.ini.php --内存表配置 |- |- |- process.ini.php --子进程配置 |- |- |- redis.ini.php --REDIS配置 |- |- extend --扩展配置目录 |- |- |- config.ini.php --用户自定义配置 |- |- route.ini.php --路由配置 |- core --框架核心类库目录 |- Dockerfile --用于快速生成docker镜像 |- index.php --CLI启动文件
李俊杰(Dean.Lee),毕业于解放军信息工程大学
Simoole由作者独立研发,版权归属个人,与任何组织无关。未经作者授权,谢绝任何人或组织对本开源程序进行篡改转载。
Simoole为开发者提供了许多简单便捷的全局函数。开发者也可以自行添加自定义函数库,函数库文件需以[.fun.php]结尾命名,系统则会自动检测并加载函数库中函数到常驻内存中,如tool.fun.php。
- 如果配置了 MAP_TYPE 为 2,系统是不会自动加载该函数库文件的,需手动配置待加载项。
- $tableName 去掉前缀配置的数据表名称
- $dbConfName 数据库配置的键名,默认DB_CONF
- 返回Model实例
//...[示例:带分页的用户列表]
public function getUserList()
{
//从GET方式中获取分页页码,如果没有传递则默认赋值第一页
$page = I('get.page', 1);
//设置每页显示行数
$pagecount = 10;
//获取会话用户的权限ID
$auth_id = session('user.auth');
//从ucenter配置库的users表中查询数据
$rs = M('users U', 'ucenter')
//选择users表中需要输出的字段
->field(['id', 'username', 'sex'], 'U')
//选择pictures表中将要输出的字段,并为path设置输出别名headpic
->field(['path' => 'headpic'], 'P')
//左联方式关联ucenter配置库中的pictures表
->join('pictures P', ['U.pic_id' => 'P.id'], 'left')
//查询筛选
->where(['U.is_exist' => 1, 'U.type' => ['in', [1,2,3]]])
//可以多次调用查询筛选,最终会以and方式自动合并
->where(['U.auth' => [['like', $auth_id . ',%'], ['like', '%,' . $auth_id], ['like', '%,'. $auth_id .',%'], 'or']])
//以users表中的id字段的倒序排列
->order('U.id', 'desc')
//分页
->limit(($page-1)*$pagecount, $pagecount)
//最终查询
->select();
//将数据输出到页面的$userlist变量中
$this->jsonReturn(['userlist' => $rs]);
}
//...
- $tableName 自定义模型名称或去掉前缀配置的数据表名称
- $dbConfName 数据库配置的键名,默认DB_CONF
- 返回Model实例
与M()最大的区别是可以加载自定义数据模型。
//示例:用户数据模型[app/model/city.class.php]
<?php
namespace App\Model;
use Core\Base\Model;
class SiteModel extends Model
{
private $provinces = [];
private $citys = [];
private $areas = [];
public function __construct(string $dbname = null)
{
parent::__construct($dbname);
$this->provinces = $this->table('SiteProvince')->select();
$this->citys = $this->table('SiteCity')->select();
$this->areas = $this->table('SiteArea')->select();
}
/**
* 获取省份列表
* @return array
*/
public function getProvinceList() : array
{
return $this->provinces;
}
/**
* 获取市列表
* @param int $province_id
* @return array
*/
public function getCityList(int $province_id) : array
{
$data = [];
foreach ($this->citys as $city){
if($city['province_id'] == $province_id)$data[] = $city;
}
return $data;
}
/**
* 获取区列表
* @param int $city_id
* @return array
*/
public function getAreaList(int $city_id) : array
{
$data = [];
foreach ($this->areas as $area){
if($area['city_id'] == $city_id)$data[] = $area;
}
return $data;
}
}
//在实例中的使用方式
//...
$res = D('Site')->getAreaList(11);
//...
- $name 要采集的输入索引
- $default 如果不存在则赋予的默认值
- 反馈采集到的输入数据
允许采集8种输入数据:
索 引 | 注 解 |
---|---|
get.* | 采集以GET方式传递的数据,相当于 $_GET |
post.* | 采集以POST方式传递的数据,相当于 $_POST |
cookie.* | 采集以COOKIE形式传递的数据,相当于 $_COOKIE |
server.* | 采集服务器信息和请求的头部数据,相当于 $_SERVER |
files.* | 采集以FILES传递的数据,相当于 $_FILES |
header.* | 采集请求的头部数据 |
request.* | 采集以GET/POST方式传递的数据,相当于 $_REQUEST |
input | 采集原始的POST包体,用于非application/x-www-form-urlencoded格式的Http POST请求。 |
//示例
$username = I('post.username', 'admin');
$password = I('post.password');
$type = I('get.type', 1);
$sessid = I('cookie.phpsessid'); //请求的键名是忽略大小写的
$files = I('files.'); //以名值对形式返回所有$_FILES
$ip = I('server.remote_addr', '127.0.0.1');
- $key 配置索引键名
- $val 为某键赋值
- 返回获取到的配置数据
//示例`注意大小写`
$sess_count = C('MEMORY_TABLE.__SESSION.__total');
- $key string-session键名|[START]-开启session|[ID]-获取sessionid|[HAS]-判断KEY值是否存在|[CLEAR]-清空session
- $val [NULL]-获取session值|string-赋予字符串值|array-赋予数组值
- 返回对应的session数据|null-删除对应session
session()只能用于会话期,会话结束session()将失效,谨慎使用$_SESSION全局变量,多协程下此变量取值会异常
//JWT示例 配置为手动开启session,默认是自动开启
$token = I('get.token');
//判断token是否有效
if (!empty($token)) {
if (!session('[HAS]', $token)) {
$this->error('TOKEN不存在!!!!');
return false;
}
//使用token开启session
session('[START]', $token);
} else {
$this->getToken();
return false;
}
//判断是否登录
if(session('?user'))$user = session('user');
- $key string-cookie键名
- $val [NULL]-获取cookie值|string-赋予字符串值|array-赋予数组值
- $expire int-过期时间|null-默认会话期
- 返回对应的cookie数据|null-删除对应cookie
session()只能用于会话期,会话结束session()将失效,谨慎使用$_SESSION全局变量,多协程下此变量取值会异常
//示例自动登录失败删除cookie
if(!$this->login(cookie('username'), cookie('passkey'))){
cookie('username', null);
cookie('passkey', null);
}
- $msg 要记录的日志,如非字符串则自动加上var_export($msg, true)
- $prefix 日志文件前缀
- $dirname 日志文件保存的目录(日志文件统一保存在app/runtime/log/下)
//示例
$class = new myClass();
L($class, 'class', 'ext');
更多WIKI请跳转:https://gitee.com/dean_lee/Simoole/wikis