導出微博喜歡列表
2025/12/28 19:41:25
“PHP 脚本的 CPU 执行时间” 是理解 PHP 性能、超时机制、资源消耗的核心概念。它不等于脚本总运行时间,而是仅统计 CPU 实际工作的时间(用户态 + 内核态),排除 I/O 等待、睡眠等挂起时间。
malloc、write)消耗的 CPU。file_get_contents等网络响应);sleep());📌类比:
- 总时间= 做饭总耗时(洗菜 5min + 等水烧开 10min + 炒菜 3min);
- CPU 时间= 仅“动手操作”时间(洗菜 5min + 炒菜 3min = 8min)。
getrusage()(最精准)// 开始$ru_start=getrusage();// 执行代码for($i=0;$i<1000000;$i++){sqrt($i);}// 结束$ru_end=getrusage();// 计算 CPU 时间(秒)$user_time=($ru_end['ru_utime.tv_sec']-$ru_start['ru_utime.tv_sec'])+($ru_end['ru_utime.tv_usec']-$ru_start['ru_utime.tv_usec'])/1000000;$sys_time=($ru_end['ru_stime.tv_sec']-$ru_start['ru_stime.tv_sec'])+($ru_end['ru_stime.tv_usec']-$ru_start['ru_stime.tv_usec'])/1000000;echo"CPU 时间: ".($user_time+$sys_time)."s\n";microtime(true)vs CPU 时间$start_wall=microtime(true);// 总时间(wall-clock)$start_cpu=getrusage();// CPU 时间sleep(2);// 挂起 2 秒$end_wall=microtime(true);$end_cpu=getrusage();echo"总时间: ".($end_wall-$start_wall)."s\n";// ≈2secho"CPU 时间: ".cpu_time_diff($start_cpu,$end_cpu)."s\n";// ≈0s✅结论:
sleep()增加总时间,但不增加 CPU 时间。
| 操作 | 总时间 | CPU 时间 |
|---|---|---|
for ($i=0; $i<1e7; $i++) {} | ≈0.3s | ≈0.3s |
sleep(1) | ≈1.0s | ≈0.0s |
file_get_contents('https://slow-api.com') | ≈5.0s | ≈0.05s(仅解析+拷贝) |
mysqli_query("SELECT SLEEP(2)") | ≈2.0s | ≈0.01s(仅发送+接收) |
🔑核心:
I/O 操作的“等待时间”不计入 CPU 时间。
// O(n²) 操作for($i=0;$i<1000;$i++){for($j=0;$j<1000;$j++){$arr[]=$i*$j;}}new对象、大数组 → 触发malloc/GC → 增加内核态时间。preg_match('/(a+)+b/', str_repeat('a', 30))可能卡死。max_execution_time的真实作用sleep(60)不会超时,但for循环 31 秒会超时。// cpu_test.php$start=getrusage();for($i=0;$i<5000000;$i++){md5($i);}$end=getrusage();echo"CPU 时间: ".($end['ru_utime.tv_sec']-$start['ru_utime.tv_sec'])."s\n";timephp cpu_test.php# 输出: CPU 时间: 2s# real 0m2.100s (总时间)# user 0m2.000s (CPU 用户态)# sys 0m0.100s (CPU 内核态)// io_test.php$start=getrusage();file_get_contents('https://httpbin.org/delay/2');// 等待 2 秒$end=getrusage();echo"CPU 时间: ".($end['ru_utime.tv_sec']-$start['ru_utime.tv_sec'])."s\n";timephp io_test.php# 输出: CPU 时间: 0s# real 0m2.100s# user 0m0.050s# sys 0m0.010s| 概念 | CPU 执行时间 | 总运行时间 |
|---|---|---|
| 定义 | 进程占用 CPU 的时间 | 从开始到结束的钟表时间 |
| 包含 | 用户态 + 内核态代码 | CPU 时间 + I/O 等待 + 睡眠 |
| 影响 | max_execution_time、计费 | 用户感知延迟、超时 |
| 优化 | 算法、内置函数、减少内存分配 | 异步、缓存、连接池 |
✅对 PHP 程序员的终极启示:
性能问题分两类:
- CPU 瓶颈→ 优化代码;
- I/O 瓶颈→ 优化架构。
只有理解 CPU 时间,
才能精准定位瓶颈,
避免“用缓存优化 CPU 问题”的无效劳动。