php 实现阻塞
在 PHP 中实现阻塞操作通常涉及多种方法,具体取决于应用场景(如 I/O 阻塞、同步执行等)。以下是几种常见实现方式:
使用 sleep() 函数
sleep() 函数可让脚本暂停执行指定秒数,期间阻塞当前进程:
sleep(5); // 阻塞 5 秒
echo "继续执行";
文件锁实现阻塞
通过 flock() 对文件加锁,实现进程间阻塞:
$fp = fopen("lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
// 临界区代码
flock($fp, LOCK_UN); // 释放锁
}
fclose($fp);
同步网络请求
使用同步的 cURL 请求阻塞执行:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch); // 阻塞直到请求完成
curl_close($ch);
数据库查询阻塞
某些数据库操作(如事务锁)可导致阻塞:
$pdo->beginTransaction();
$stmt = $pdo->query("SELECT * FROM table FOR UPDATE");
// 其他进程对此表的操作会被阻塞
$pdo->commit();
信号量扩展
通过 sem_* 函数实现信号量阻塞:
$sem = sem_get(1234);
sem_acquire($sem); // 阻塞直到获取信号量
// 临界区代码
sem_release($sem);
多进程阻塞
pcntl_fork() 结合进程控制:
$pid = pcntl_fork();
if ($pid == -1) {
die("fork 失败");
} elseif ($pid) {
pcntl_wait($status); // 父进程阻塞等待子进程
} else {
// 子进程代码
exit(0);
}
注意事项
- Web 环境中长时间阻塞可能导致请求超时(需调整
max_execution_time)。 - 阻塞操作可能影响并发性能,需评估替代方案(如事件驱动)。
- 文件锁和信号量需注意死锁问题。







