首页 > 文章列表 > PHP实现Websocket编程及应用

PHP实现Websocket编程及应用

php websocket 应用
102 2023-06-23

随着互联网的发展,Websocket编程已经逐渐成为一种流行的网络编程方式。借助Websocket技术,我们可以实现实时双向通讯,解决Ajax轮询效率低下、长轮询占用资源等问题。而在Websocket编程中,PHP已经成为了一种非常受欢迎的编程语言。在本文中,我们将介绍如何使用PHP实现Websocket编程及应用。

一、Websocket的介绍

Websocket是一种全新的HTML5协议,提供了一种在单个TCP连接上进行全双工通信的能力。它允许服务器和客户端之间进行实时交互,可以轻松实现消息推送、多人在线游戏、在线聊天、信息定制等场景。相比传统的Ajax轮询和长轮询,Websocket具有更高的通信效率、更少的网络流量、更低的延迟等优点。

Websocket工作方式如下:

  1. 客户端向服务器发起连接请求。
  2. 服务器接收客户端连接请求,并进行确认。
  3. 连接建立后,客户端和服务器之间通过这个连接进行相互通信。
  4. 连接关闭时,服务器和客户端都必须进行关闭。

值得注意的是,Websocket通信是基于TCP协议的。因此,在网络环境不稳定时,可能会出现丢包、堵塞等问题。为了确保数据传输的可靠性,我们需要采取一些策略来保障网络连接的稳定性。

二、PHP实现Websocket

PHP实现Websocket编程的过程中,主要依靠swoole和workerman两个第三方库,它们可以帮助我们轻松创建一个轻量级的Websocket服务器。本文重点介绍workerman的实现方式。

  1. 安装workerman

首先,我们需要通过composer来安装workerman,具体步骤如下:

(1)安装composer

composer是一种用于PHP依赖管理的工具,我们可以在官方网站(https://getcomposer.org/)中进行下载安装。

(2)创建composer.json文件

在Websocket服务器项目的根目录下,创建一个composer.json文件,并在其中添加以下内容。注意:在添加前,请确保PHP版本大于等于7.0。

{
    "require": {
        "workerman/workerman": "~4.0"
    },
    "autoload": {
        "psr-4": {
            "App": "App/"
        }
    }
}

(3)安装workerman

在项目根目录下打开终端,运行以下命令:

composer install

安装完成后,在vendor目录下会出现workerman的相关文件。

  1. 创建Websocket服务器

在完成workerman安装后,我们可以开始创建一个Websocket服务器。

(1)创建Server.php文件

在项目根目录下创建一个Server.php文件,包含以下内容:

<?php
use WorkermanWorker;
use WorkermanLibTimer;
use WorkermanConnectionTcpConnection;

require_once __DIR__ . '/vendor/autoload.php';

$ws_worker = new Worker("websocket://0.0.0.0:8080");

$ws_worker->onConnect = function($connection)
{
    echo "New connection from ip " . $connection->getRemoteIp() . "
";
};

$ws_worker->onMessage = function($connection, $data)
{
    echo "Get Message: $data
";
    $connection->send("Received!");
};

$ws_worker->onClose = function($connection)
{
    echo "Connection closed
";
};

Worker::runAll();

(2)运行Websocket服务器

在项目根目录下打开终端,运行以下命令:

php Server.php start

这时,Websocket服务器将在0.0.0.0:8080端口监听并等待客户端连接。连接成功后,将打印连接成功的提示语,并可以进行实时通讯。

三、Websocket应用

Websocket应用场景非常广泛,包括消息推送、多人在线游戏、在线聊天、信息定制等。下面,我们将通过一个简单的在线聊天室应用来介绍Websocket的应用。

  1. 创建HTML页面

在项目根目录下创建一个index.html文件,并添加以下内容:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>WEB SOCKET</title>
</head>
<body>
    <div class="chat">
        <div class="chat-content"></div>
        <div class="chat-input">
            <input type="text" name="message" id="message">
            <button type="submit" id="submit">Send</button>
        </div>
    </div>

    <script>
        var socket = new WebSocket("ws://127.0.0.1:8080");

        socket.onopen = function(e) {
            console.log("Connection established!");
        };

        socket.onmessage = function(event) {
            var data = event.data;
            console.log("Received: " + data);
            var content = document.querySelector(".chat-content");
            content.innerHTML += "<div>" + data + "</div>";
        };

        var submit = document.getElementById("submit");
        submit.addEventListener("click", function() {
            var message = document.getElementById("message").value;
            console.log("Send: " + message);
            socket.send(message);
        });
    </script>
</body>
</html>
  1. 修改Websocket服务器

在Server.php中,添加以下代码:

$connections = array();

$ws_worker->onConnect = function ($connection) use(&$connections) {
    $id = $connection->id = uniqid();
    $connections[$id] = $connection;
};

$ws_worker->onClose = function ($connection) use(&$connections) {
    unset($connections[$connection->id]);
};

$ws_worker->onMessage = function($connection, $data) use(&$connections) {
    foreach($connections as $client)
    {
        if ($connection != $client)
        $client->send($connection->getRemoteIp() . ":" . $data);
    }
};

在用户链接建立时,我们将用户的唯一标识符存放在数组中;在用户链接断开时,从数组中移除唯一标识符。当有用户向服务器发送消息时,我们将消息发送给所有连接的客户端。

  1. 运行应用

在index.html文件所在目录下,运行以下命令:

php -S localhost:8000

然后在浏览器中打开http://localhost:8000/index.html,即可进入在线聊天室。

四、总结

通过本文的介绍,相信读者已经掌握了PHP实现Websocket编程及应用的方法。Websocket技术在实时通讯、在线游戏等方面具有巨大的优势,值得我们深入学习和应用。在未来的Web开发中,Websocket技术的应用将会越来越广泛。