php实现阻塞
PHP 实现阻塞的方法
在 PHP 中实现阻塞操作可以通过多种方式完成,具体取决于应用场景和需求。以下是几种常见的方法:
sleep() 函数
使用 sleep() 函数可以让当前脚本暂停执行指定的秒数。这是一种简单的阻塞方式。
echo "Start\n";
sleep(5); // 阻塞 5 秒
echo "End\n";
usleep() 函数
如果需要更精确的时间控制,可以使用 usleep() 函数,它以微秒为单位进行阻塞。
echo "Start\n";
usleep(1000000); // 阻塞 1 秒(1000000 微秒)
echo "End\n";
文件锁(flock)
通过文件锁可以实现进程间的阻塞。flock() 函数可以在文件上设置共享锁或独占锁。
$file = fopen("lock.txt", "w+");
if (flock($file, LOCK_EX)) { // 获取独占锁(阻塞直到获取锁)
echo "Lock acquired\n";
sleep(5); // 模拟阻塞操作
flock($file, LOCK_UN); // 释放锁
} else {
echo "Could not acquire lock\n";
}
fclose($file);
循环等待
通过循环检查某个条件是否满足来实现阻塞。例如,等待某个文件存在:
echo "Waiting for file...\n";
while (!file_exists("target.txt")) {
usleep(100000); // 每次等待 0.1 秒
}
echo "File found\n";
信号量(Semaphore)
使用信号量可以实现更复杂的阻塞逻辑。PHP 的 sem_acquire() 函数会阻塞直到获取信号量。
$key = ftok(__FILE__, 'a');
$sem = sem_get($key);
if (sem_acquire($sem)) { // 阻塞直到获取信号量
echo "Semaphore acquired\n";
sleep(3); // 模拟阻塞操作
sem_release($sem); // 释放信号量
}
数据库锁
在数据库操作中,可以通过事务或行锁实现阻塞。例如,MySQL 的 SELECT ... FOR UPDATE 会阻塞其他事务对同一行的修改。
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = 1 FOR UPDATE");
$stmt->execute(); // 如果其他事务已锁定该行,此处会阻塞
// 执行其他操作
$pdo->commit();
多进程阻塞
在 PHP 的多进程编程中,可以使用 pcntl_wait() 阻塞父进程,直到子进程退出。

$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) { // 父进程
pcntl_wait($status); // 阻塞直到子进程退出
echo "Child process exited\n";
} else { // 子进程
sleep(2);
exit(0);
}
注意事项
- 阻塞操作会占用系统资源,长时间阻塞可能导致性能问题。
- 在 Web 环境中,阻塞操作可能导致请求超时,需谨慎使用。
- 某些阻塞方法(如文件锁)在多服务器环境中可能无效,需使用分布式锁替代。






