php长连接实现
PHP 长连接实现方法
使用 set_time_limit 和循环保持连接
通过设置脚本执行时间限制为0,并使用循环保持连接不中断。适合简单的长连接需求。
set_time_limit(0);
while (true) {
// 业务逻辑处理
echo "Connection alive\n";
ob_flush();
flush();
sleep(1);
}
结合 ignore_user_abort 实现后台持续运行
当浏览器关闭后脚本仍继续执行,适用于后台任务处理。
ignore_user_abort(true);
set_time_limit(0);
while (!connection_aborted()) {
// 执行定时任务
file_put_contents('log.txt', date('Y-m-d H:i:s')."\n", FILE_APPEND);
sleep(5);
}
WebSocket 服务实现
使用 Ratchet 等库构建真正的全双工长连接。需要安装依赖:
composer require cboden/ratchet
服务端实现示例:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class MyWebSocket implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
// 新连接处理
}
public function onMessage(ConnectionInterface $from, $msg) {
// 消息处理
}
public function onClose(ConnectionInterface $conn) {
// 连接关闭
}
public function onError(ConnectionInterface $conn, \Exception $e) {
// 错误处理
}
}
$server = new \Ratchet\App('localhost', 8080);
$server->route('/ws', new MyWebSocket());
$server->run();
Swoole 扩展高性能方案
使用 PHP 的 Swoole 扩展实现高性能长连接服务:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
echo "connection open: {$request->fd}\n";
});
$server->on('message', function ($server, $frame) {
$server->push($frame->fd, "Received: {$frame->data}");
});
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
长轮询 (Comet) 技术
实现服务器推送效果,适合不支持 WebSocket 的环境:
// 服务端
function waitForChange() {
$lastUpdate = $_SESSION['lastUpdate'] ?? 0;
while (true) {
if (checkDataChanged($lastUpdate)) {
return getNewData();
}
usleep(100000); // 100ms
session_write_close();
session_start();
}
}
// 客户端通过AJAX持续请求
连接保持注意事项
- Nginx 配置需要调整超时时间:
proxy_read_timeout 600s; proxy_send_timeout 600s; - PHP.ini 配置建议:
max_execution_time = 0 default_socket_timeout = -1 - 内存管理要谨慎,长时间运行的脚本需定期释放资源
- 需要实现心跳机制检测连接状态
- 考虑使用 supervisor 等工具监控进程状态
选择具体方案时需根据应用场景决定,WebSocket/Swoole 适合实时性要求高的场景,而简单轮询适合兼容性要求高的环境。







