订单列表打开很快,点击某个订单详情却等待十几秒,通常说明详情页面的额外 Block、Plugin 或外部接口在阻塞。优化前先回答两个问题:所有订单都慢,还是只有特定订单慢;服务器耗时,还是浏览器加载资源耗时。

把一次请求拆成四段时间

curl -k -o /dev/null -s -w \
'dns=%{time_namelookup} connect=%{time_connect} ttfb=%{time_starttransfer} total=%{time_total}\n' \
'https://admin.example.com/admin/sales/order/view/order_id/123/'

后台 URL 需要有效会话,curl 仅用于你已有安全测试方式;不要把管理员 Cookie 写入共享脚本。浏览器 Network 里若主文档 TTFB 很高,查 PHP/MySQL;主文档快而某个 XHR 慢,直接定位该接口。

对比快订单与慢订单

选择同一天、相近商品数的一快一慢订单,比较订单项数量、评论历史、发票/发货数、地址、自定义字段和支付方式。只有含某支付方式的订单慢,通常是模块在页面加载时实时调用网关。

在受控时间窗捕获慢查询

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW FULL PROCESSLIST;
SHOW ENGINE INNODB STATUS\G

不要在高峰期随意把 long_query_time 调成 0。使用现有慢日志按订单请求时段过滤,再对具体 SQL 执行 EXPLAIN。常见问题是自定义表按 order_id 查询却没有索引,或每个订单项执行一次查询形成 N+1。

EXPLAIN SELECT * FROM vendor_order_extra WHERE order_id=123;
SHOW INDEX FROM vendor_order_extra;

按布局和插件二分

grep -R --line-number 'sales_order_view' app/code app/design vendor/vendorname 2>/dev/null
grep -R --line-number --include='di.xml' \
  'Magento\\Sales\\Block\\Adminhtml\\Order\\View' app/code vendor/vendorname 2>/dev/null

在预发布环境禁用最近增加的订单 Block 或模块,重新编译后比较同一订单 TTFB。不要在生产直接改 XML 注释。若模块从 ERP、物流或支付平台读取状态,页面渲染应使用本地缓存数据,实时刷新改成显式按钮或异步请求,并设置连接与读取超时。

PHP-FPM 侧确认是否等待外部资源

开启受限的 slowlog,设置合理的 request_slowlog_timeout,复现一次后立即读取堆栈。若堆栈停在 curl/HTTP client,处理外部超时;停在 collection load,检查查询字段与索引;停在模板循环,避免在循环里加载 repository。

修复验收要取至少 10 个订单,记录 P50/P95 的主文档 TTFB,而不是只打开一个页面感觉变快。还要确认订单操作按钮、评论、发票和退款功能没有因为删除 Block 而丢失。