php如何实现阻塞
PHP 实现阻塞的方法
PHP 本身是单线程同步执行的脚本语言,但可以通过一些方法实现阻塞效果,以下是几种常见的方式:
使用 sleep() 函数
sleep() 函数可以让当前脚本暂停执行指定的秒数:
echo "开始执行\n";
sleep(5); // 阻塞 5 秒
echo "5 秒后继续执行\n";
使用 usleep() 函数
usleep() 函数与 sleep() 类似,但以微秒为单位:

echo "开始执行\n";
usleep(1000000); // 阻塞 1 秒(1000000 微秒)
echo "1 秒后继续执行\n";
使用 time_nanosleep() 函数
time_nanosleep() 提供了更高精度的阻塞控制:
echo "开始执行\n";
time_nanosleep(2, 500000000); // 阻塞 2.5 秒
echo "2.5 秒后继续执行\n";
使用文件锁实现阻塞
通过 flock() 可以实现文件锁阻塞,常用于进程间同步:

$file = fopen("lock.txt", "w+");
if (flock($file, LOCK_EX)) { // 获取独占锁,阻塞直到获取成功
echo "获取锁成功\n";
sleep(3); // 模拟处理
flock($file, LOCK_UN); // 释放锁
}
fclose($file);
使用 Socket 实现阻塞
通过 stream_socket_client() 或 socket_connect() 可以实现网络阻塞:
$socket = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$socket) {
echo "$errstr ($errno)\n";
} else {
echo "连接成功,开始阻塞\n";
fwrite($socket, "GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n");
while (!feof($socket)) {
echo fgets($socket, 128); // 阻塞读取数据
}
fclose($socket);
}
使用 pcntl_fork() 和多进程
在 CLI 模式下,可以通过 pcntl_fork() 创建子进程实现阻塞效果:
$pid = pcntl_fork();
if ($pid == -1) {
die("无法创建子进程");
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 阻塞等待子进程结束
echo "子进程已结束\n";
} else {
// 子进程
sleep(3);
exit();
}
使用 Swoole 扩展
Swoole 提供了协程级别的阻塞控制:
Swoole\Runtime::enableCoroutine();
go(function () {
echo "协程开始\n";
Co::sleep(2); // 协程阻塞 2 秒
echo "2 秒后继续执行\n";
});
选择哪种方法取决于具体应用场景。对于简单的延迟,使用 sleep() 系列函数即可;对于进程间同步,文件锁更合适;高性能场景则可以考虑 Swoole 等扩展。






