xiaououo/xuophp
Composer 安装命令:
composer create-project xiaououo/xuophp
包简介
XiaoPHP 1.4 - 轻量级PHP开发框架
README 文档
README
作者:是小新呀
版本:1.4.0
简介:基于 PHP 的轻量级 MVC 框架,适合小型项目快速开发
目录
- 一、环境要求
- 二、项目部署
- 三、目录结构
- 四、配置说明
- 五、路由与控制器
- 六、视图引擎
- 七、数据库操作
- 八、Redis 缓存
- 九、加密工具
- 十、阿里云 DNS 管理
- 十一、HTTP 请求工具
- 十二、调试模式
- 十三、错误处理
- 十四、请求日志
- 十五、自定义函数
- 十六、注意事项
一、环境要求
| 组件 | 要求 |
|---|---|
| PHP | >= 7.4 |
| 扩展 | openssl、curl、pdo_mysql、json |
| 可选扩展 | redis(用于 Redis 功能) |
| Composer | 可选(用于加载第三方依赖) |
二、项目部署
将项目放置到 Web 服务器的根目录,入口目录为 public/。
2.1 Apache 部署
确保 Apache 开启 mod_rewrite 模块,在 public/ 目录下创建 .htaccess 文件:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
2.2 Nginx 部署
在 Nginx 配置文件中添加以下规则(已内置在 public/nginx.htaccess 中):
location / { try_files $uri $uri/ /index.php?$args; }
2.3 PHP 内置服务器
开发时可直接使用 PHP 内置服务器,项目已自带 router.php 处理静态资源:
cd public
php -S localhost:8000 router.php
三、目录结构
XiaoPHP1.4/
├── app/ # 控制器目录,存放所有控制器文件
├── config/ # 业务配置文件目录
│ ├── aliyundns.php # 阿里云 DNS 配置
│ ├── cookie.php # Cookie 配置
│ └── logs.php # 日志开关配置
├── func/ # 自定义函数目录(.php 文件会自动加载)
├── logs/ # 日志存储目录
│ ├── error/ # 失败请求日志
│ └── success/ # 成功请求日志
├── public/ # Web 入口目录(网站根目录)
│ ├── index.php # 入口文件
│ ├── router.php # PHP 内置服务器路由
│ └── nginx.htaccess # Nginx 伪静态参考
├── temp/ # 临时文件目录
│ ├── c_session/ # Cookie 存储的 Session 文件
│ └── s_cookie/ # cURL Cookie 持久化文件
├── view/ # 视图模板目录
│ └── index/
│ └── index.html # 默认首页模板
├── xuophp/ # 框架核心目录
│ ├── Error/ # 错误处理
│ │ ├── 404.html # 404 错误页面模板
│ │ └── error.php # 错误处理函数
│ ├── tools/ # 系统工具
│ │ ├── systools.php # 基础工具类
│ │ └── app/ # 应用工具类
│ │ ├── AesTools.php
│ │ ├── AliyunDns.php
│ │ ├── MysqlTools.php
│ │ ├── RedisTools.php
│ │ ├── RSATools.php
│ │ └── view.php
│ ├── conf.php # 框架默认配置
│ ├── console.php # 框架引导文件
│ ├── debug.php # 调试信息展示
│ └── routing.php # 路由分发
└── config.php # 用户主配置文件
四、配置说明
4.1 主配置文件
编辑项目根目录下的 config.php:
<?php namespace xuophp\config; use xuophp\tools\systools; class siteconf extends systools { function config() { $conf = [ "error" => $this->sysconf("error", "html"), // 错误页面类型:html | json "debug" => $this->sysconf("DEBUG_MODE", "true"), // 调试模式:true | false "getweb" => $this->sysconf("ssl", "true"), // cURL 请求 SSL 验证 "redis" => $this->sysconf("redis", "127.0.0.1:6379"), // Redis 地址 "redispass" => $this->sysconf("redispass", ""), // Redis 密码 "dbhost" => $this->sysconf("dbhost", "127.0.0.1:3306"), // 数据库地址 "dbname" => $this->sysconf("dbname", ""), // 数据库名 "dbpass" => $this->sysconf("dbpass", ""), // 数据库密码 "dbuser" => $this->sysconf("dbuser", ""), // 数据库用户名 ]; return $conf; } }
4.2 环境变量配置
sysconf() 方法采用环境变量优先策略。你可以通过设置环境变量来覆盖默认值,不同环境无需修改代码:
| 环境变量 | 对应配置 | 默认值 |
|---|---|---|
error |
错误页面类型 | html |
DEBUG_MODE |
调试模式 | true |
ssl |
cURL SSL 验证 | true |
redis |
Redis 地址 | 127.0.0.1:6379 |
redispass |
Redis 密码 | 空 |
dbhost |
MySQL 主机 | 127.0.0.1:3306 |
dbname |
数据库名 | 空 |
dbpass |
数据库密码 | 空 |
dbuser |
数据库用户名 | 空 |
Nginx 设置环境变量示例:
location ~ \.php$ { fastcgi_param DEBUG_MODE "false"; fastcgi_param dbhost "192.168.1.100:3306"; fastcgi_param dbname "my_database"; fastcgi_param dbuser "admin"; fastcgi_param dbpass "secret"; include fastcgi_params; }
4.3 日志配置
编辑 config/logs.php:
<?php namespace web\config; class logs { public static function config() { return array( "success" => true, // true=记录成功请求日志, false=关闭 "error" => true, // true=记录失败请求日志, false=关闭 ); } }
4.4 Cookie 配置
编辑 config/cookie.php:
<?php namespace web\config; class cookie { public static function config() { return array( "conf" => [ "time" => 60 * 10, // 过期时间(秒) "sessionkey" => "214B364C501", // Cookie 加密密钥 "prefix" => "xiaophp" // Cookie 前缀 ] ); } }
4.5 阿里云 DNS 配置
编辑 config/aliyundns.php:
<?php namespace web\config; class aliyundns { public static function alidnsconf() { return array( "accessKeyId" => "你的AccessKeyId", "accessKeySecret" => "你的AccessKeySecret" ); } }
五、路由与控制器
5.1 路由规则
框架采用自动路由,URL 格式为:
http://你的域名/控制器名/方法名
| URL | 对应控制器 | 对应方法 |
|---|---|---|
/ |
app/Index.php |
func_index() |
/index |
app/Index.php |
func_index() |
/user |
app/User.php |
func_index() |
/user/login |
app/User.php |
func_login() |
/user/edit/123 |
app/User.php |
func_edit() |
规则:第一段路径为控制器名(不区分大小写),第二段为方法名(自动加
func_前缀并转为小写)。
5.2 创建控制器
在 app/ 目录下创建 PHP 文件,文件名与类名一致:
<?php // app/User.php use xuophp\tools\app\view; use xuophp\tools\app\MysqlTools; class User { // 默认方法:func_index public function func_index() { $view = new view(); $view->set(["title" => "用户列表"], "user")->show("index"); } // 访问 /user/login public function func_login() { $view = new view(); $view->set(["title" => "用户登录"], "user")->show("login"); } // 访问 /user/list public function func_list() { $db = new MysqlTools(); $users = $db->table("users") ->where("status", "1") ->limit(10) ->get(); $tools = new \xuophp\tools\systools(); $tools->json(["code" => 200, "data" => $users]); } }
5.3 默认控制器
app/Index.php 是默认控制器,根路径 / 访问时自动调用其 func_index() 方法:
<?php use xuophp\tools\app\view; class Index { public function func_index() { $view = new view(); $json = ["title" => "你好世界!", "h1" => "Hello World"]; $view->set($json, "index")->show("index"); } }
六、视图引擎
6.1 模板语法
模板文件放在 view/ 目录下,使用 .html 扩展名。支持以下模板语法:
| 语法 | 说明 | 示例 |
|---|---|---|
{{$变量名}} |
输出普通变量 | {{$title}} |
{{$变量.子属性}} |
输出数组/对象属性 | {{$user.name}} |
模板示例:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>{{$title}}</title> </head> <body> <h1>{{$title}}</h1> <p>欢迎你,{{$user.name}}</p> <p>邮箱:{{$user.email}}</p> </body> </html>
6.2 基本用法
use xuophp\tools\app\view; $view = new view(); // 方式一:链式调用 $view->set(["title" => "首页", "content" => "欢迎"], "index")->show("index"); // 方式二:分步调用 $view->set(["title" => "首页"]); $view->set(["content" => "欢迎"]); $view->show("index");
注意:
set()方法支持多次调用,数据会累积合并。show()方法会渲染模板并输出。
6.3 子目录模板
如果模板在子目录中,使用 set() 的第二个参数指定路径:
// 渲染 view/user/login.html $view->set(["title" => "登录"], "user")->show("login"); // 渲染 view/admin/user/list.html $view->set(["title" => "用户管理"], "admin/user")->show("list");
安全机制:视图引擎会自动过滤 .. 和 . 路径,防止目录穿越攻击。同时使用 realpath() 确保模板文件在 view/ 目录内。
七、数据库操作
7.1 连接配置
在 config.php 中配置数据库连接信息:
"dbhost" => $this->sysconf("dbhost", "127.0.0.1:3306"), "dbname" => $this->sysconf("dbname", "my_database"), "dbpass" => $this->sysconf("dbpass", "your_password"), "dbuser" => $this->sysconf("dbuser", "root"),
7.2 查询构造器
use xuophp\tools\app\MysqlTools; $db = new MysqlTools(); // 查询所有 $users = $db->table("users")->get(); // 条件查询 $user = $db->table("users")->where("id", "1")->first(); // 链式查询 $list = $db->table("users") ->where("status", "1") ->where("age", ">= 18") ->limit(10) ->offset(0) ->get();
7.3 查询方法详解
where() - 条件查询
// 等于(默认) $db->table("users")->where("id", "1"); // 大于等于 $db->table("users")->where("age", ">= 18"); // 小于 $db->table("users")->where("price", "< 100"); // 不等于 $db->table("users")->where("status", "!= 0"); // IN 查询 $db->table("users")->where("id", [1, 2, 3, 5, 8]);
whereLike() - 模糊查询
// 两端模糊匹配:%keyword% $db->table("users")->whereLike("name", "张三"); // 左模糊:%keyword $db->table("users")->whereLike("name", "张三", "left"); // 右模糊:keyword% $db->table("users")->whereLike("name", "张三", "right");
whereMultiLike() - 多列模糊搜索
// 在多个列中搜索同一关键词(OR 关系) $db->table("users") ->whereMultiLike(["name", "email", "phone"], "张三"); // 生成:WHERE (name LIKE '%张三%' OR email LIKE '%张三%' OR phone LIKE '%张三%')
whereFullLike() - 全表模糊搜索
// 自动获取表的所有列,在所有列中搜索 $db->table("users")->whereFullLike("关键词");
getMinMaxId() - 获取 ID 范围
$range = $db->table("users")->getMinMaxId(); // 返回:["min_id" => 1, "max_id" => 1000]
insert() - 插入数据
$id = $db->table("users")->insert([ "name" => "张三", "email" => "zhangsan@example.com", "status" => 1, ]); // 返回:新插入记录的自增 ID
update() - 更新数据
// 必须带 WHERE 条件,否则会抛出错误 $affected = $db->table("users") ->where("id", "1") ->update([ "name" => "李四", "status" => 0, ]); // 返回:受影响的行数
delete() - 删除数据
// 必须带 WHERE 条件,否则会抛出错误 $affected = $db->table("users")->where("id", "1")->delete(); // 返回:受影响的行数
first() - 获取单条记录
$user = $db->table("users")->where("id", "1")->first(); // 返回:单条关联数组,未找到返回 false
limit() 和 offset() - 分页
$page = 1; $size = 10; $list = $db->table("users") ->limit($size) ->offset(($page - 1) * $size) ->get();
7.4 辅助函数
框架提供了一个全局辅助函数 db():
// 使用辅助函数,无需手动 new $users = db()->table("users")->where("status", "1")->get();
八、Redis 缓存
8.1 连接配置
在 config.php 中配置 Redis 连接:
"redis" => $this->sysconf("redis", "127.0.0.1:6379"), "redispass" => $this->sysconf("redispass", ""),
注意:需要安装 PHP Redis 扩展(
php-redis)。
8.2 基本使用
use xuophp\tools\app\RedisTools; $redis = new RedisTools(); // 设置缓存 $redis->set("key1", "value1"); $redis->setex("key2", 3600, "value2"); // 带过期时间 // 获取缓存 $value = $redis->get("key1"); // 删除缓存 $redis->del("key1"); // 检查键是否存在 if ($redis->exists("key1")) { // ... } // 哈希操作 $redis->hset("user:1", "name", "张三"); $redis->hset("user:1", "email", "zhangsan@example.com"); $user = $redis->hgetall("user:1"); // 列表操作 $redis->lpush("queue", "task1", "task2"); $task = $redis->rpop("queue");
8.3 Pipeline 批量操作
$redis = new RedisTools(); // 开启 Pipeline 模式 $redis->pipeline() ->set("key1", "value1") ->set("key2", "value2") ->set("key3", "value3") ->exec(); // 一次性批量执行 // 返回数组,包含每个命令的结果
容错机制:如果 Redis 连接失败,所有方法调用会静默返回
$this,不会抛出异常。
九、加密工具
9.1 AES 加密
use xuophp\tools\app\AesTools; $key = "my_secret_key"; $data = "需要加密的数据"; // 加密(默认 AES-128-ECB) $encrypted = AesTools::encode($data, $key); // 解密 $decrypted = AesTools::decode($encrypted, $key); // 使用 AES-256-CBC 模式(需要提供 IV) $iv = "1234567890123456"; // 16 字节 $encrypted = AesTools::encode($data, $key, 'AES-256-CBC', $iv); $decrypted = AesTools::decode($encrypted, $key, 'AES-256-CBC', $iv);
9.2 RSA 加密
use xuophp\tools\app\RSATool; $rsa = new RSATool(); // 公钥加密 $publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A..."; $encrypted = $rsa->encode("敏感数据", $publicKey); // 私钥解密 $privateKey = "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"; $decrypted = $rsa->decode($encrypted, $privateKey);
注意:RSA 加密使用 OAEP 填充(
OPENSSL_PKCS1_OAEP_PADDING),公钥支持纯字符串格式,类会自动格式化 PEM 格式。
十、阿里云 DNS 管理
10.1 配置 AccessKey
首先在 config/aliyundns.php 中配置阿里云 AccessKey:
return array( "accessKeyId" => "你的AccessKeyId", "accessKeySecret" => "你的AccessKeySecret" );
获取 AccessKey:登录阿里云控制台 → RAM 访问控制 → 用户 → 创建 AccessKey。
10.2 API 方法
use xuophp\tools\app\AliyunDns; $dns = new AliyunDns(); // 获取域名列表 $domains = $dns->domains(); // 获取指定域名的解析记录 $records = $dns->list("example.com"); // 查询特定解析记录 $record = $dns->get([ "domain" => "example.com", "rr" => "www", "type" => "A", ]); // 添加解析记录 $result = $dns->add([ "domain" => "example.com", "rr" => "api", "type" => "A", "value" => "192.168.1.100", "ttl" => 600, ]); // 更新解析记录 $dns->update([ "recordId" => "123456789", "rr" => "www", "value" => "10.0.0.1", "ttl" => 300, ]); // 删除解析记录(方式一:通过 recordId) $dns->del(["recordId" => "123456789"]); // 删除解析记录(方式二:通过 domain + rr) $dns->del([ "domain" => "example.com", "rr" => "api", ]); // 启用/禁用解析记录 $dns->setStatus(["recordId" => "123456789", "status" => "disable"]); // 更新解析记录备注 $dns->remark(["recordId" => "123456789", "remark" => "这是备注"]);
参数兼容:所有方法同时支持驼峰命名(
recordId)和下划线命名(record_id)。
十一、HTTP 请求工具
getweb() 方法封装了 cURL,用于发起 HTTP 请求:
use xuophp\tools\systools; $tools = new systools(); // GET 请求 $response = $tools->getweb("https://api.example.com/data"); // POST 请求(JSON) $response = $tools->getweb( "https://api.example.com/login", "POST", ["Content-Type: application/json"], json_encode(["username" => "admin", "password" => "123456"]) ); // POST 请求(表单) $response = $tools->getweb( "https://api.example.com/submit", "POST", [], http_build_query(["field1" => "value1", "field2" => "value2"]) ); // 自定义 Headers $response = $tools->getweb( "https://api.example.com/data", "GET", [ "Authorization: Bearer your_token_here", "Accept: application/json", "User-Agent: MyApp/1.0", ] );
功能特性:
- 自动管理 Cookie(按域名持久化到
temp/s_cookie/目录) - 支持设置 SSL 验证开关(通过
getweb配置项或ssl环境变量控制) - 自动跟随重定向
- 30 秒超时
- 默认 User-Agent 为 Chrome 浏览器标识
十二、调试模式
调试模式通过 DEBUG_MODE 环境变量控制,在主配置文件中设置:
"debug" => $this->sysconf("DEBUG_MODE", "true"),
| 模式 | 效果 |
|---|---|
true(开发) |
显示详细的错误页面,包含堆栈跟踪、请求上下文、服务器信息 |
false(生产) |
返回简洁的 "系统繁忙,请稍后再试" 提示,错误信息写入日志 |
生产环境设置(Nginx):
fastcgi_param DEBUG_MODE "false";
十三、错误处理
框架内置了三层错误捕获机制:
| 层级 | 说明 |
|---|---|
set_error_handler |
将 PHP 错误转为异常抛出 |
set_exception_handler |
捕获未处理的异常 |
register_shutdown_function |
捕获致命错误(E_ERROR 等) |
所有错误最终由 displayDebugInfo() 函数处理。
错误页面类型配置(error 配置项):
// 返回 HTML 错误页面(默认) "error" => $this->sysconf("error", "html"), // 返回 JSON 格式错误 "error" => $this->sysconf("error", "json"),
JSON 格式错误响应示例:
{
"code": 404,
"date": "2026-07-07 12:00:00",
"data": {
"msg": "控制器未找到"
}
}
十四、请求日志
框架自动记录每个 HTTP 请求的日志,由 systools::logs() 方法实现。
日志开关:在 config/logs.php 中配置:
"success" => true, // 记录成功请求 "error" => true, // 记录失败请求
日志格式:
success 2026-07-07 12:00:00--[127.0.0.1]:/user/login-code:200
error 2026-07-07 12:00:01--[127.0.0.1]:/user/nonexist-code:404
日志文件位置:
logs/
├── error/ # 失败请求日志(含 404、500 等)
│ └── 2026-07-07.logs
└── success/ # 成功请求日志
└── 2026-07-07.logs
日志按天自动分文件,文件名格式为
Y-m-d.logs。
十五、自定义函数
你可以在 func/ 目录下创建 .php 文件,框架启动时会自动加载(通过 glob(__DIR__ . "/../func/*.php") 实现)。
示例:创建 func/helpers.php
<?php // 自定义全局函数 function format_date($timestamp, $format = 'Y-m-d H:i:s') { return date($format, strtotime($timestamp)); } function is_mobile($phone) { return preg_match('/^1[3-9]\d{9}$/', $phone); }
这些函数在控制器和视图中均可直接使用。
十六、注意事项
-
命名空间:自定义配置类(
config/目录下)需要使用web\config命名空间,且类名必须与文件名一致(不含.php)。 -
控制器命名:控制器文件名与类名必须一致,放在
app/目录下。方法名必须加func_前缀(如func_index、func_login)。 -
模板文件:模板文件放在
view/目录下,使用.html扩展名。show()方法中不需要加.html后缀。 -
数据库安全:
update()和delete()操作必须带WHERE条件,否则会抛出错误,防止误操作。 -
Redis 容错:如果 Redis 服务不可用,
RedisTools不会抛出异常,所有操作静默忽略。可通过isAvailable()方法检查连接状态。 -
临时目录权限:确保
temp/和logs/目录及其子目录对 PHP 进程可写(Linux 下通常需要chmod 755或chmod 777)。 -
生产环境:上线前务必设置
DEBUG_MODE为false,关闭调试模式。 -
Composer:如需使用第三方库,在项目根目录创建
composer.json并执行composer install,vendor/autoload.php会被自动加载。
统计信息
- 总下载量: 0
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-07-07