当前位置:首页>php>PHP 数据库事务实战(避免数据不一致,防坑指南)

PHP 数据库事务实战(避免数据不一致,防坑指南)

  • 2026-03-27 16:05:46
PHP 数据库事务实战(避免数据不一致,防坑指南)
大家好,我是专注 PHP 实战干货的博主。

做PHP业务开发,只要涉及多表操作或多步数据修改,几乎都会遇到一个致命问题:数据不一致。最典型的场景:用户下单时,订单表创建成功,但库存表扣减失败,导致超卖;用户注册时,用户表插入成功,但积分表赠送失败,导致业务异常;多表关联更新时,部分表更新成功、部分失败,后续无法回滚,造成数据混乱。

新手常犯的错:不使用事务,直接分步执行SQL;知道用事务,但忽略异常捕获,导致失败后无法回滚;滥用嵌套事务,引发锁表或回滚异常;遇到并发更新,不知道如何避免冲突。今天分享一套 PHP 数据库事务实战方案,基于PDO实现,极简易用,覆盖高频业务场景,附带避坑指南和并发解决方案,新手也能轻松上手,彻底避免数据不一致。

一、核心痛点(每个PHP开发者都踩过)

  • 多表/多步操作时,部分成功、部分失败,导致数据不一致(如订单创建成功、库存未扣);

  • 不捕获SQL异常,事务执行失败后无法回滚,遗留脏数据;

  • 滥用嵌套事务,导致事务无法正常提交或回滚,引发锁表;

  • 并发更新时(如多用户同时下单扣库存),出现超卖、库存负数等冲突;

  • 事务使用不规范,忽略事务隔离级别,引发脏读、不可重复读等问题。

二、核心方案:MySQL事务极简用法(PDO实现)

PHP操作MySQL事务,优先使用PDO实现(原生MySQLi也可,但PDO兼容性更强、写法更简洁),核心只有3步:开启事务→执行SQL→提交/回滚,一步到位,无需复杂配置。

先封装一个极简PDO连接(直接复制到项目,修改配置即可使用),避免重复写连接代码:

<?php/** * 极简PDO连接封装(适配事务操作) * @return PDO */functiongetPdo(): PDO{    $dsn 'mysql:host=localhost;dbname=your_db;charset=utf8mb4'// 替换为你的数据库信息    $username 'root'// 数据库用户名    $password '123456'// 数据库密码    try {        $pdo new PDO($dsn$username$password);        // 关键:设置错误模式为异常模式,事务才能捕获异常并回滚        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);        return $pdo;    } catch(PDOException $e) {        // 连接失败,抛出异常(实际项目可结合日志记录)        die("数据库连接失败:" . $e->getMessage());    }}?>

事务核心流程(极简版)

无论多复杂的业务,事务核心流程不变,记住这3个关键方法:

  1. beginTransaction():开启事务(暂停自动提交);

  2. commit():所有SQL执行成功后,提交事务(永久生效);

  3. rollBack():任意一步SQL失败,回滚事务(恢复到开启前状态)。

极简示例(核心模板,所有场景可套用):

<?phprequire_once 'db.php'// 引入上面的PDO连接封装$pdo getPdo();try {    // 1. 开启事务    $pdo->beginTransaction();    // 2. 执行多步SQL(示例:两步操作,可扩展为多步)    // 步骤1:执行SQL1(如创建订单)    $sql1 "INSERT INTO orders (user_id, goods_id, amount) VALUES (1, 1001, 99.9)";    $pdo->exec($sql1);    // 步骤2:执行SQL2(如扣减库存)    $sql2 "UPDATE goods SET stock = stock - 1 WHERE id = 1001 AND stock > 0";    $pdo->exec($sql2);    // 3. 所有SQL执行成功,提交事务    $pdo->commit();    echo "事务执行成功,数据提交完成!";catch(PDOException $e) {    // 4. 任意一步失败,回滚事务(关键:避免数据不一致)    $pdo->rollBack();    echo "事务执行失败,已回滚:" . $e->getMessage();}?>

三、高频场景实战示例(直接套用)

以下3个场景是PHP项目中最常用的事务场景,复制代码,替换表名、字段名即可直接使用,包含异常处理和边界校验,避免踩坑。

示例1:订单创建+库存扣减(最常用场景)

核心需求:用户下单时,必须保证「订单创建成功」和「库存扣减成功」同时生效,任意一步失败,全部回滚,避免超卖或订单异常。

<?phprequire_once 'db.php';$pdo getPdo();// 模拟前端传参(实际项目从$_POST获取)$userId 1// 用户ID$goodsId 1001// 商品ID$amount 99.9// 订单金额$buyNum 1// 购买数量try {    $pdo->beginTransaction();    // 1. 校验库存(避免库存不足导致扣减失败,提前拦截)    $checkStockSql "SELECT stock FROM goods WHERE id = ?";    $stmt $pdo->prepare($checkStockSql);    $stmt->execute([$goodsId]);    $goods $stmt->fetch(PDO::FETCH_ASSOC);    if(!$goods || $goods['stock'] < $buyNum) {        throw new PDOException("库存不足,无法下单");    }    // 2. 创建订单(获取订单ID,用于后续关联)    $createOrderSql "INSERT INTO orders (user_id, goods_id, amount, num, status)                       VALUES (?, ?, ?, ?, 1)"; // status=1表示待支付    $stmt $pdo->prepare($createOrderSql);    $stmt->execute([$userId$goodsId$amount$buyNum]);    $orderId $pdo->lastInsertId(); // 获取新增订单ID    // 3. 扣减商品库存    $reduceStockSql "UPDATE goods SET stock = stock - ?, update_time = NOW()                       WHERE id = ?";    $stmt $pdo->prepare($reduceStockSql);    $stmt->execute([$buyNum$goodsId]);    // 4. (可选)记录订单日志    $logSql "INSERT INTO order_log (order_id, user_id, content)               VALUES (?, ?, '订单创建成功,库存扣减完成')";    $stmt $pdo->prepare($logSql);    $stmt->execute([$orderId$userId]);    // 提交事务    $pdo->commit();    echo json_encode([        'code' => 200,        'msg' => '下单成功',        'data' => ['order_id' => $orderId]    ], JSON_UNESCAPED_UNICODE);catch(PDOException $e) {    // 回滚事务    $pdo->rollBack();    echo json_encode([        'code' => 400,        'msg' => '下单失败:' . $e->getMessage(),        'data' => []    ], JSON_UNESCAPED_UNICODE);}?>

示例2:用户注册+积分赠送

核心需求:用户注册成功后,自动赠送初始积分(如100积分),必须保证「用户创建」和「积分添加」同时成功,避免用户注册成功但无积分。

<?phprequire_once 'db.php';$pdo getPdo();// 模拟注册参数$username 'php_test';$password password_hash('123456', PASSWORD_DEFAULT); // 密码加密$phone '13800138000';$initScore 100// 初始赠送积分try {    $pdo->beginTransaction();    // 1. 校验手机号是否已注册(提前拦截,避免重复注册)    $checkPhoneSql "SELECT id FROM users WHERE phone = ?";    $stmt $pdo->prepare($checkPhoneSql);    $stmt->execute([$phone]);    if($stmt->fetch(PDO::FETCH_ASSOC)) {        throw new PDOException("该手机号已注册");    }    // 2. 创建用户    $createUserSql "INSERT INTO users (username, password, phone, create_time)                       VALUES (?, ?, ?, NOW())";    $stmt $pdo->prepare($createUserSql);    $stmt->execute([$username$password$phone]);    $userId $pdo->lastInsertId();    // 3. 赠送初始积分    $addScoreSql "INSERT INTO user_score (user_id, score, type, content, create_time)                    VALUES (?, ?, 1, '注册赠送积分', NOW())"; // type=1表示注册赠送    $stmt $pdo->prepare($addScoreSql);    $stmt->execute([$userId$initScore]);    // 提交事务    $pdo->commit();    echo json_encode([        'code' => 200,        'msg' => '注册成功,已赠送100积分',        'data' => ['user_id' => $userId]    ], JSON_UNESCAPED_UNICODE);catch(PDOException $e) {    $pdo->rollBack();    echo json_encode([        'code' => 400,        'msg' => '注册失败:' . $e->getMessage(),        'data' => []    ], JSON_UNESCAPED_UNICODE);}?>

示例3:多表关联更新(如订单状态修改+库存恢复)

核心需求:用户取消订单时,需要同时修改「订单状态」、「恢复商品库存」、「记录日志」,三步必须同时生效,避免订单取消但库存未恢复。

<?phprequire_once 'db.php';$pdo getPdo();// 模拟取消订单参数$orderId 10001// 要取消的订单ID$userId 1// 订单所属用户try {    $pdo->beginTransaction();    // 1. 校验订单状态(只能取消待支付订单)    $checkOrderSql "SELECT goods_id, num FROM orders WHERE id = ? AND user_id = ? AND status = 1";    $stmt $pdo->prepare($checkOrderSql);    $stmt->execute([$orderId$userId]);    $order $stmt->fetch(PDO::FETCH_ASSOC);    if(!$order) {        throw new PDOException("订单不存在或无法取消");    }    $goodsId $order['goods_id'];    $buyNum $order['num'];    // 2. 修改订单状态为“已取消”    $updateOrderSql "UPDATE orders SET status = 3, cancel_time = NOW() WHERE id = ?";    $stmt $pdo->prepare($updateOrderSql);    $stmt->execute([$orderId]);    // 3. 恢复商品库存    $restoreStockSql "UPDATE goods SET stock = stock + ?, update_time = NOW() WHERE id = ?";    $stmt $pdo->prepare($restoreStockSql);    $stmt->execute([$buyNum$goodsId]);    // 4. 记录取消日志    $logSql "INSERT INTO order_log (order_id, user_id, content)               VALUES (?, ?, '用户取消订单,库存已恢复')";    $stmt $pdo->prepare($logSql);    $stmt->execute([$orderId$userId]);    $pdo->commit();    echo json_encode([        'code' => 200,        'msg' => '订单取消成功,库存已恢复',        'data' => []    ], JSON_UNESCAPED_UNICODE);catch(PDOException $e) {    $pdo->rollBack();    echo json_encode([        'code' => 400,        'msg' => '订单取消失败:' . $e->getMessage(),        'data' => []    ], JSON_UNESCAPED_UNICODE);}?>

四、事务必看避坑点(生产环境防踩雷)

事务看似简单,但忽略以下4个避坑点,很容易导致数据不一致、锁表、性能问题,尤其是高并发场景,一定要记牢!

  • 避坑1:不要嵌套事务
    MySQL本身不支持真正的嵌套事务(即使使用`savepoint`,也不是完整嵌套),嵌套事务会导致提交/回滚异常,比如内层事务提交后,外层事务回滚失效。解决方案:拆分为多个独立事务,或用逻辑判断替代嵌套。
  • 避坑2:不要忽略异常回滚
    必须将所有SQL执行代码放在`try-catch`块中,一旦出现SQL错误(如语法错误、约束冲突),立即执行`rollBack()`。新手常忘写catch块,导致SQL失败后事务无法回滚,遗留脏数据。
  • 避坑3:长事务拆分,避免锁表
    事务执行时间越长,占用的数据库锁越多,容易导致其他请求阻塞(如长时间未提交的订单事务,会锁住库存表)。解决方案:拆分长事务,将非核心操作(如日志记录)移出事务;避免在事务中执行耗时操作(如文件上传、第三方接口调用)。
  • 避坑4:不要滥用事务
    单步SQL操作(如单纯查询、单表插入)无需开启事务,开启事务会增加数据库开销。只有多表/多步操作,需要保证数据一致性时,才使用事务。

五、补充:乐观锁/悲观锁用法(解决并发更新冲突)

事务只能保证“多步操作的一致性”,但无法解决「并发更新冲突」(如多用户同时下单扣减同一商品库存),此时需要用乐观锁或悲观锁,根据业务场景选择。

1. 乐观锁(推荐,无锁机制,性能高)

核心原理:不主动加锁,通过版本号(version)或时间戳,判断数据是否被修改,适合并发量高、冲突少的场景(如电商库存扣减)。

实战示例(库存扣减,避免并发超卖):

<?phprequire_once 'db.php';$pdo getPdo();$goodsId 1001;$buyNum 1;try {    $pdo->beginTransaction();    // 1. 查询商品时,获取版本号(version)    $sql "SELECT stock, version FROM goods WHERE id = ?";    $stmt $pdo->prepare($sql);    $stmt->execute([$goodsId]);    $goods $stmt->fetch(PDO::FETCH_ASSOC);    if(!$goods || $goods['stock'] < $buyNum) {        throw new PDOException("库存不足");    }    // 2. 更新时,带上版本号,只有版本号匹配才更新(避免并发修改)    $updateSql "UPDATE goods SET stock = stock - ?, version = version + 1, update_time = NOW()                   WHERE id = ? AND version = ?";    $stmt $pdo->prepare($updateSql);    $stmt->execute([$buyNum$goodsId$goods['version']]);    // 3. 判断更新影响行数,若为0,说明数据已被其他请求修改    if($stmt->rowCount() === 0) {        throw new PDOException("并发冲突,请重试");    }    $pdo->commit();    echo "库存扣减成功";catch(PDOException $e) {    $pdo->rollBack();    echo "操作失败:" . $e->getMessage();}?>

2. 悲观锁(适合并发冲突多、数据一致性要求高的场景)

核心原理:查询数据时主动加锁,阻止其他请求修改该数据,直到事务结束,适合并发量低、冲突频繁的场景(如转账)。

实战示例(转账场景,避免并发转账冲突):

<?phprequire_once 'db.php';$pdo getPdo();$fromUserId 1// 转出用户$toUserId 2// 转入用户$money 50// 转账金额try {    $pdo->beginTransaction();    // 1. 悲观锁:查询转出用户余额时,加行锁(for update)    $fromSql "SELECT balance FROM user_account WHERE user_id = ? FOR UPDATE";    $stmt $pdo->prepare($fromSql);    $stmt->execute([$fromUserId]);    $fromAccount $stmt->fetch(PDO::FETCH_ASSOC);    if(!$fromAccount || $fromAccount['balance'] < $money) {        throw new PDOException("余额不足");    }    // 2. 查询转入用户账户(可选加锁,确保数据一致)    $toSql "SELECT balance FROM user_account WHERE user_id = ? FOR UPDATE";    $stmt $pdo->prepare($toSql);    $stmt->execute([$toUserId]);    $toAccount $stmt->fetch(PDO::FETCH_ASSOC);    if(!$toAccount) {        throw new PDOException("转入用户不存在");    }    // 3. 转出用户扣减余额    $pdo->exec("UPDATE user_account SET balance = balance - $money WHERE user_id = $fromUserId");    // 4. 转入用户增加余额    $pdo->exec("UPDATE user_account SET balance = balance + $money WHERE user_id = $toUserId");    $pdo->commit();    echo "转账成功";catch(PDOException $e) {    $pdo->rollBack();    echo "转账失败:" . $e->getMessage();}?>

六、核心价值与落地步骤

核心价值

  1. 保证数据一致性:彻底解决多表/多步操作“部分成功、部分失败”的问题,避免业务异常;

  2. 降低维护成本:极简用法,新手也能快速上手,无需复杂配置,代码可直接复制套用;

  3. 解决并发冲突:通过乐观锁/悲观锁,避免超卖、余额异常等并发问题;

  4. 减少脏数据:异常回滚机制,确保SQL执行失败后,数据恢复到初始状态,无遗留脏数据。

落地步骤(1分钟搞定)

  1. 复制上面的「PDO连接封装」,创建db.php 文件,修改数据库配置;

  2. 根据业务场景,复制对应实战示例,替换表名、字段名和业务逻辑;

  3. 确保所有SQL操作放在 try-catch 块中,异常时执行 rollBack()

  4. 并发场景下,根据冲突频率,选择乐观锁(高并发)或悲观锁(高冲突)。

总结

PHP数据库事务,核心是“保证数据一致性”,关键在于「开启事务→异常捕获→提交/回滚」的规范用法。本文的方案基于PDO实现,极简易用,覆盖订单、注册、多表更新等高频场景,附带避坑指南和并发解决方案,新手也能正确使用。

记住:事务不是万能的,无需滥用,只有多步操作需要保证一致性时才使用;并发冲突需结合乐观锁/悲观锁,才能彻底避免数据异常。

关注我,后续继续分享PHP实战干货,每天3分钟,提升开发效率。

欢迎在留言区告诉我:你项目中遇到过哪些事务相关的坑?比如并发超卖、事务回滚失效等,我们一起交流解决方案!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 22:36:10 HTTP/2.0 GET : https://f.mffb.com.cn/a/483335.html
  2. 运行时间 : 0.218903s [ 吞吐率:4.57req/s ] 内存消耗:4,635.99kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=aa71b98144a73b814f4a4e7f38952329
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001337s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.002025s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001134s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000754s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001738s ]
  6. SELECT * FROM `set` [ RunTime:0.000560s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001821s ]
  8. SELECT * FROM `article` WHERE `id` = 483335 LIMIT 1 [ RunTime:0.003668s ]
  9. UPDATE `article` SET `lasttime` = 1774622170 WHERE `id` = 483335 [ RunTime:0.007067s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000735s ]
  11. SELECT * FROM `article` WHERE `id` < 483335 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001271s ]
  12. SELECT * FROM `article` WHERE `id` > 483335 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001108s ]
  13. SELECT * FROM `article` WHERE `id` < 483335 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002507s ]
  14. SELECT * FROM `article` WHERE `id` < 483335 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003170s ]
  15. SELECT * FROM `article` WHERE `id` < 483335 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.018239s ]
0.224908s