Simoole
simoole.com
基于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
CLI命令
./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),毕业于解放军信息工程大学
邮箱:dean7410@163.com
声明
Simoole由作者独立研发,版权归属个人,与任何组织无关。未经作者授权,谢绝任何人或组织对本开源程序进行篡改转载。
函数说明
Simoole为开发者提供了许多简单便捷的全局函数。开发者也可以自行添加自定义函数库,函数库文件需以[.fun.php]结尾命名,系统则会自动检测并加载函数库中函数到常驻内存中,如tool.fun.php。
如果配置了 MAP_TYPE 为 2,系统是不会自动加载该函数库文件的,需手动配置待加载项。1. M(string $tableName, [string $dbConfName]) 数据模型函数
$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]); } //...
2. D(string $tableName, [string $dbConfName]) 自定义数据模型函数
$tableName 自定义模型名称或去掉前缀配置的数据表名称 $dbConfName 数据库配置的键名,默认DB_CONF 返回Model实例与M()最大的区别是可以加载自定义数据模型。
//示例:用户数据模型[app/model/city.class.php] <?php namespace AppModel; use CoreBaseModel; 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); //...
3. I(string $name, [$default = false]) 通用输入函数
$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');
4. C(string $key, [$val = null]) 获取配置数据
$key 配置索引键名 $val 为某键赋值 返回获取到的配置数据//示例`注意大小写` $sess_count = C('MEMORY_TABLE.__SESSION.__total');
5. session(string $key, [$val = [NULL]]) SESSION处理函数
$key string-session键名|[START]-开启session|[ID]-获取sessionid|[HAS]-判断KEY值是否存在|[CLEAR]-清空session $val [NULL]-获取session值|string-赋予字符串值|array-赋予数组值 返回对应的session数据|null-删除对应sessionsession()只能用于会话期,会话结束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');
6. cookie(string $key, string $val = '[NULL]', int $expire = null) COOKIE处理函数
$key string-cookie键名 $val [NULL]-获取cookie值|string-赋予字符串值|array-赋予数组值 $expire int-过期时间|null-默认会话期 返回对应的cookie数据|null-删除对应cookiesession()只能用于会话期,会话结束session()将失效,谨慎使用$_SESSION全局变量,多协程下此变量取值会异常
//示例自动登录失败删除cookie if(!$this->login(cookie('username'), cookie('passkey'))){ cookie('username', null); cookie('passkey', null); }
7. L($msg, $prefix = 'user', $dirname = 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
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。