承接 xiaououo/xuophp 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

xiaououo/xuophp

Composer 安装命令:

composer create-project xiaououo/xuophp

包简介

XiaoPHP 1.4 - 轻量级PHP开发框架

README 文档

README

作者:是小新呀
版本:1.4.0
简介:基于 PHP 的轻量级 MVC 框架,适合小型项目快速开发

目录

一、环境要求

组件 要求
PHP >= 7.4
扩展 opensslcurlpdo_mysqljson
可选扩展 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);
}

这些函数在控制器和视图中均可直接使用。

十六、注意事项

  1. 命名空间:自定义配置类(config/ 目录下)需要使用 web\config 命名空间,且类名必须与文件名一致(不含 .php)。

  2. 控制器命名:控制器文件名与类名必须一致,放在 app/ 目录下。方法名必须加 func_ 前缀(如 func_indexfunc_login)。

  3. 模板文件:模板文件放在 view/ 目录下,使用 .html 扩展名。show() 方法中不需要加 .html 后缀。

  4. 数据库安全update()delete() 操作必须带 WHERE 条件,否则会抛出错误,防止误操作。

  5. Redis 容错:如果 Redis 服务不可用,RedisTools 不会抛出异常,所有操作静默忽略。可通过 isAvailable() 方法检查连接状态。

  6. 临时目录权限:确保 temp/logs/ 目录及其子目录对 PHP 进程可写(Linux 下通常需要 chmod 755chmod 777)。

  7. 生产环境:上线前务必设置 DEBUG_MODEfalse,关闭调试模式。

  8. Composer:如需使用第三方库,在项目根目录创建 composer.json 并执行 composer installvendor/autoload.php 会被自动加载。

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-07-07

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固