zhanshop / framework
张启全开发的PHP框架
Requires
- php: >=8.2
This package is not auto-updated.
Last update: 2024-09-25 02:19:09 UTC
README
简介
zhanshop-php 是一个基于swoole高性能轻量级框架,全程非阻塞。凭借swoole底层将php阻塞函数重写进行协程非阻塞化和php自身低开销特点,爆发强劲的性能。性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性。一键快速生成业务逻辑层代码骨架,只需要编写业务逻辑代码即可。根据注释配置即可生成api文档,对PDO 和 redis连接池进行了封装,同一连接内事务支持,不同连接和不同数据库服务器之前的分布式事务等功能,全程APP容器化管理,数据库操作类和缓存操作类和thinkphp类似,简单易用。
完整项目
https://github.com/zhangqiquan/zhanshop-php
服务器组成
- 业务层(包含控制器、service、model)
- crontab(定时任务进程,可将任务丢给task执行,自带提供的定时有监听代码变化热更新server)
- task(task任务)
Server事件通知
config/sns.php robot 支持 钉钉、企业微信、飞书 群机器人,将服务器的启动、重启、重载 Server发生异常错误进行及时消息提醒
日志收集
config/log.php
type 目前支持3种收集类型
1:File 写入到本地,再结合阿里云/腾讯云日志收集工具将日志收集到阿里云/腾讯云日志服务(推荐)
2:Es 将日志批量写入到Elasticsearch 依赖 composer require elasticsearch/elasticsearch 需要手动安装
3: 写入到数据库中
关于附件
目前附件是只传七牛云的,依赖 composer require qiniu/php-sdk 并修改 config/sns.php 相应配置
环境要求
php8.2 以上版本,需要redis扩展的支持,pdo mysql 扩展的支持,swoole5 以上的扩展支持
关于热更新
非vendor, runtime, public目录下的php文件只要发生了变更就会触发更新。注意修改了 .dev.*的配置文件和修改了 config目录下的 app.php 请手动进行重新启动。注:热更新建议仅在开发环境和本地环境中使用,热更新会额外增加CPU的负担
示例 php cmd.php server start false
提供测试数据
在项目目录下有一个 zhanshop.sql 文件,想把后台管理系统跑起来,需要把zhanshop.sql导入到 mysql数据库中,建议mysql使用8.0以上版本
性能表现(供参考和对比)
- 本框架http服务器,在我的(本机12核,32G ubuntu22 设备上)使用ab压力测试工具吞吐量可达28万多/s,在开启日志写入功能后吞吐量任然在25万多/s
- swoole 提供的空的http 服务器代码demo 在我的(本机12核,32G 设备上)使用ab压力测试工具吞吐量达到30万多,性能损耗主要在框架代码、路由、task、crontab上
- 和nginx静态访问和自己研发的C++服务器对比 nginx在开启日志访问的情况下吞吐量25万多/s,自己基于C++开发的没有业务逻辑的http服务器吞吐量可达32万/s,可见swoole php对比c/c++语言的损耗大致10%左右。
- 对比PHP-FPM 进程池 仅输出一个 echo 1; 在我的(本机12核,32G ubuntu22 设备上)使用ab压力测试工具吞吐量最多能达到2.8万/s
- 对比其他框架 thinkphp 控制器上简单返回 在我的(本机12核,32G ubuntu22 设备上)使用ab压力测试工具吞吐量最多能达到2千多/s,laravel就会更差。
目录结构
├─app 应用目录
│ ├─api
│ │ ├─admin 后台管理系统
│ │ ├─index api/前端页面
│ │ └─..... 其他
│ ├─console 应用层控制台程序
│ ├─constant 常量类的定义
│ ├─exception 协议异常自定义接收处理
│ ├─helper 助手函数类的目录
│ ├─library 第三方的composer.phar包(项目架构上规定第三方的包一般进行打包成phar包进行载入这样vendor目录不至于那么混乱)
│ ├─schema 数据表字段配置(常用于后台智能表单智能列表的生成配置)
│ ├─process 自定义进程
│ ├─script 独立运行的php脚本文件
│ ├─crontab 定时任务目录
│ ├─model 模型目录
│ └─task task任务目录
│
├─config 配置目录
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─console.php 控制台配置
│ ├─database.php 数据库配置
│ ├─elasticsearch.php elasticsearch配置
│ ├─middleware.php 中间件的配置 仅http协议下生效
│ ├─share.php 多进程共享表字段配置
│ ├─server.php server服务器配置
│ ├─sns.php 对接第三方系统配置参数
│ ├─ini.php ini配置
│ └─log.php 日志配置
├─route 路由定义目录
│ ├─index 路由定义文件
│ │ └─v1.php 注册的目录版本配置文件
│ ├─admin 路由定义文件
│ │ └─v1.php 注册的目录版本配置文件
│ └─ ...
│
├─public WEB前端访问目录
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor Composer类库目录
│ ├─Container.php 单例容器类
│ ├─App.php APP管理器
│ ├─Config.php 配置参数管理
│ ├─Console.php 控制台程序入口
│ ├─Cache.php redis缓存管理类
│ ├─Database.php 数据库操作管理入口类
│ ├─Helper.php 帮助函数
│ ├─Log.php 日志类
│ ├─Middleware.php 控制器中间件管理
│ ├─RequestCache.php 请求缓存【相当于nginx的程序内部缓存】
│ ├─Route.php 路由管理类
│ ├─Service.php service单例管理
│ ├─Task.php task任务管理
│ ├─Validate.php 请求参数验证
│ ├─console 控制台程序目录(包含http服务器,后台管理系统等程序)
│ └─ ...
├─.env.dev 本地开发环境变量示例文件
├─.env.test 测试环境变量示例文件
├─.env.production 生产环境变量示例文件
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─cmd.php 命令行入口文件
框架安装
composer require zhanshop/framework
控制台使用方法
php cmd.php
欢迎使用zhanshop控制台系统
用法: cmd 指令 --参数 参数信息
可用命令:
help 帮助 - 显示命令的帮助
server 启动服务器 - 使用该命令可以创建一个服务器
phar phar打包 - 将vendor项目目录打包成phar并存放在项目中
api:route api注解生成路由 - 一键生成基于控制器配置的注解路由
software:scan:ports 端口扫描 - 对指定IP进行端口扫描
software:dns:check dns检查 - 对指定域名进行DNS检查
配置开机启动脚本
#举例
vim /etc/systemd/system/zhanshop_server.service
[Unit]
Description=zhanshop-http - high performance web server
After=network.target
[Service]
Type=forking
ExecStart=php 项目路径/cmd.php server start
ExecReload=php 项目路径/cmd.php server reload
ExecStop=php 项目路径/cmd.php server stop
Execenable=php 项目路径/cmd.php server start
[Install]
WantedBy=multi-user.target
保存后
systemctl enable zhanshop_server.service
演习地址
后台管理系统:
http://demo.qiyawang.com:6201/admin/
账号: admin
密码: admin123
接口服务:
http://demo.qiyawang.com:6201/apiDoc
使用方法
1.数据模型
<?php
namespace app\model;
use zhanshop\database\Model;
class Abc extends Model
{
// 设置当前模型的对应数据表
protected $table = '对应的表名';
// 设置当前模型的数据库连接
protected $connection = '连接配置名称';
}
2.数据库模型使用案例
App::database()->model('表名')->where(['id' => 123])->find(); // 查询单个数据
App::database()->model('表名')->where(['a' => 123])->finder(); // 分页查询
App::database()->model('表名')->save([...]); // 新增数据
App::database()->model('表名')->where(['id' => 123])->delete(); // 删除
事务 当闭包中的代码发生异常会自动回滚
App::database()->transaction(function($pdo){
Test::insert([
'a' => '1',
'b' => '2',
'c' => '3'
], $pdo);
Test::insert([
'a1' => '1',
'b' => '2',
'c' => '3'
], $pdo);
});
分布式事务【在数据库开启分布式事务后才可以正常使用】
App::database()->transactionXa(function($pdos){
Test::insert([
'a' => '1',
'b' => '2',
'c' => '3'
], $pdo[0]);
Test1::insert([
'a' => '1',
'b' => '2',
'c' => '3'
], $pdo[1]);
});
3.缓存使用
App::cache()->get(...);
App::cache()->set(...);
更多方法详见 https://blog.csdn.net/demored/article/details/123842206 以及 php官方文档
等等....
交流群
由于微信群无法直接加入,故可先加下方二维码好友,并声明目的,再拉您入群。
微信号: eee7798