php 阻塞实现
PHP 阻塞实现方法
在 PHP 中实现阻塞操作通常用于需要等待某个条件满足或任务完成后再继续执行的场景。以下是几种常见的阻塞实现方式:
sleep() 函数
使用 sleep() 函数可以让当前脚本暂停执行指定的秒数:
echo "开始执行\n";
sleep(5); // 阻塞5秒
echo "5秒后继续执行\n";
usleep() 函数
对于需要更精确的时间控制(微秒级),可以使用 usleep():
echo "开始微秒级阻塞\n";
usleep(1000000); // 阻塞1秒(1000000微秒)
echo "1秒后继续执行\n";
文件锁阻塞
通过 flock() 实现文件锁阻塞,常用于进程同步:
$fp = fopen("lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁(阻塞)
echo "获得锁,执行关键代码\n";
sleep(3); // 模拟耗时操作
flock($fp, LOCK_UN); // 释放锁
} else {
echo "无法获取锁\n";
}
fclose($fp);
socket_select() 阻塞
在网络编程中,socket_select() 可以用于实现I/O多路复用和阻塞等待:
$read = array($socket);
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) { // 阻塞最多5秒
echo "有数据可读\n";
}
循环检查条件
通过循环检查特定条件实现阻塞,适用于需要等待异步任务完成的场景:
$start = time();
while (!file_exists('done.flag')) {
if (time() - $start > 10) { // 超时10秒
break;
}
usleep(100000); // 每次检查间隔100毫秒
}
pcntl_fork() 和多进程
在CLI模式下,可以使用进程控制函数实现阻塞等待子进程完成:
$pid = pcntl_fork();
if ($pid == -1) {
die("无法fork进程");
} elseif ($pid) { // 父进程
pcntl_wait($status); // 阻塞等待子进程结束
echo "子进程已完成\n";
} else { // 子进程
sleep(2);
exit(0);
}
注意事项
- 在Web环境中长时间阻塞会导致请求超时,通常需要调整
max_execution_time - 阻塞操作可能影响服务器性能,应考虑使用异步方案替代
- 文件锁和进程控制函数在Windows系统上可能表现不同
- 对于高性能场景,建议使用事件循环库如ReactPHP或Swoole替代原生阻塞实现







