【问题标题】:Using PHP with Socket.io将 PHP 与 Socket.io 一起使用
【发布时间】:2011-09-17 22:32:12
【问题描述】:

是否可以在客户端使用 Sockets.io 并与服务器上基于 PHP 的应用程序通信? PHP 是否甚至支持这种“长期连接”的代码编写方式?

我为 socket.io 找到的所有示例代码似乎都适用于服务器端的 node.js,所以那里没有帮助。

【问题讨论】:

标签: php socket.io


【解决方案1】:

回答这个问题可能有点晚了,但这是我发现的。

我不想争论节点是否比 php 做得更好,这不是重点。

解决方案是:我还没有找到任何用于 PHP 的 socket.io 实现。

但是有一些方法可以实现WebSocketsthis jQuery plugin 允许您在使用 Websockets 的同时优雅地为不支持的浏览器降级。在 PHP 方面,this class 似乎是 PHP WS 服务器使用最广泛的。

【讨论】:

  • 如果你想要一个 php websocket 服务器实现,那么 phpwebsocket 类确实是要走的路。但是,这与问题无关。 OP 已经实现了一个 WS 服务器 (socket.io),并询问了与 php 应用程序通信的方法。
【解决方案2】:

如果您想将 socket.io 与 php 一起使用,这可能是您的答案!

项目网站:

elephant.io

他们也在 github 上:

https://github.com/wisembly/elephant.io

Elephant.io 提供了一个完全用 PHP 编写的 socket.io 客户端,应该可以在您项目的任何地方使用。

这是一个轻量级且易于使用的库,旨在通过 socket.io 和 websockets 为 PHP 应用程序带来一些实时功能,以实现在完整的 javascript 中无法完成的操作。

项目网站示例(通过php与websocket服务器通信)

php 服务器

use ElephantIO\Client as Elephant;

$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

socket io 服务器

var io = require('socket.io').listen(8000);

io.sockets.on('connection', function (socket) {
  console.log('user connected!');

  socket.on('foo', function (data) {
    console.log('here we are in action event and data is: ' + data);
  });
});

【讨论】:

  • 我会在这里给你一个 +1,但看起来这距离在生产环境中可用还有一点距离。
  • 我看过这个,但有一件事让我很困惑。让 PHP 实现 sockets.io 服务器不是重点吗?相反,Elepant.io 似乎是 sockets.io 客户端的 PHP 实现,您可以连接到其他一些 sockets.io 服务器(意思是,lephant.io 没有监听来自您的 sockets.io 客户端的连接,连接给他们并为他们服务)?
  • 正是我来找的,可惜长连接处于早期开发阶段。
  • 大家好。 Elephant.io 的目标只是将事件从 PHP 触发到 socket.io 服务器。不要打开一个持久的连接。但要能够快速连接和发送事件/消息。我们在生产中使用它,它就像一个魅力。
  • 这个库不再维护,对我们有一些问题
【解决方案3】:

更新:2014 年 8 月当前的 socket.io v1.0 站点有一个 PHP 示例:- https://github.com/rase-/socket.io-php-emitter

【讨论】:

    【解决方案4】:

    如果你真的想使用 PHP 作为 socket.io 的后端,这里是我找到的。 两个socket.io php服务器端替代。

    https://github.com/walkor/phpsocket.io

    https://github.com/RickySu/phpsocket.io

    这样的第一个存储库的示例代码。

    use PHPSocketIO\SocketIO;
    
    // listen port 2021 for socket.io client
    $io = new SocketIO(2021);
    $io->on('connection', function($socket)use($io){
      $socket->on('chat message', function($msg)use($io){
        $io->emit('chat message', $msg);
      });
    });
    

    【讨论】:

    • 这应该是投票答案
    【解决方案5】:

    我知道奋斗的人!但我最近几乎和 Workerman 一起工作。 如果您还没有偶然发现这个 php 框架,那么您最好检查一下!

    嗯,Workerman 是一个异步事件驱动的 PHP 框架,用于轻松构建快速、可扩展的网络应用程序。 (我只是从他们的网站上复制粘贴的哈哈哈http://www.workerman.net/en/

    解释这一点的简单方法是,当涉及到 Web 套接字编程时,您真正需要的是在您的服务器或本地服务器(无论您在哪里工作)中拥有 2 个文件。

    1. server.php(响应所有客户端请求的源代码)

    2. client.php/client.html(执行请求的源代码)

    所以基本上,你首先在 server.php 上修改代码并启动服务器。通常,由于我使用的是增加了更多困难的 Windows,因此我通过此命令运行服务器 --> php server.php start

    如果您使用的是 xampp。这是一种方法。转到您要放置文件的任何位置。在我们的例子中,我们将把文件放入

    C:/xampp/htdocs/websocket/server.php

    C:/xampp/htdocs/websocket/client.php 或 client.html

    假设您的本地服务器中已经有这些文件。打开您的 Git Bash 或命令行或终端或您正在使用的任何一个并在此处下载 php 库。

    https://github.com/walkor/Workerman

    https://github.com/walkor/phpsocket.io

    我通常通过 composer 下载它,然后在我的 php 脚本中自动加载这些文件。

    还要检查这个。这真的重要!您需要此 javascript 库,以便您在运行 client.php 或 client.html 时与 server.php 进行通信。

    https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

    我只是将 socket.io-client 文件夹复制并粘贴到与我的 server.php 和 client.php 相同的级别

    这里是server.php源代码

    <?php
    require __DIR__ . '/vendor/autoload.php';
    
    use Workerman\Worker;
    use PHPSocketIO\SocketIO;
    
    // listen port 2021 for socket.io client
    $io = new SocketIO(2021);
    $io->on('connection', function($socket)use($io){
        $socket->on('send message', function($msg)use($io){
            $io->emit('new message', $msg);
        });
    });
    
    Worker::runAll();
    

    这里是 client.phpclient.html 源代码

    <!DOCTYPE html>
    <html>
        <head>
            <title>Chat</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">        
        </head>
        <body>
            <div id="chat-messages" style="overflow-y: scroll; height: 100px; "></div>        
            <input type="text" class="message">
        </body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>    
        <script src="socket.io-client/socket.io.js"></script>  
        <script>
                var socket = io.connect("ws://127.0.0.1:2021");
    
                $('.message').on('change', function(){
                    socket.emit('send message', $(this).val());
                    $(this).val('');
                });
    
                socket.on('new message', function(data){
                    $('#chat-messages').append('<p>' + data +'</p>');
                });
        </script>
    </html>
    

    再次打开命令行或 git bash 或终端,将 server.php 文件放置在其中。所以在我们的例子中,即 C:/xampp/htdocs/websocket/ 并输入 php server.php start 并按回车键。

    然后转到您的浏览器并输入 http://localhost/websocket/client.php 以访问您的网站。然后只需在该文本框中输入任何内容,您就会在旅途中看到一个基本的 php websocket!

    你只需要记住。在 web socket 编程中,它只需要一个服务器和一个客户端。首先运行服务器代码,然后打开客户端代码。你有它!希望这会有所帮助!

    【讨论】:

    • 确实,这个网站必须想办法摆脱过时的旧答案
    【解决方案6】:

    对于您提到的“长期连接”,您可以使用 Ratchet for PHP。它是一个基于 PHP 从 PHP 5 开始支持的 Stream Socket 函数构建的库。

    对于客户端,您需要使用 HTML5 支持的 WebSocket 而不是 Socket.io(因为您知道,socket.io 仅适用于 node.js)。

    如果你仍然想使用 Socket.io,你可以试试这个方法: - 查找并获取 socket.io.js 供客户端使用 - 使用 Ratchet 模拟 socket.io 在服务器上的工作方式

    希望这会有所帮助!

    【讨论】:

    • 那么你如何模拟socket.io如何与Ratchet一起工作?因为如果你只是与 Ratchet 建立正常连接,由于缺少元数据,它不会被 socket-io 客户端识别。
    【解决方案7】:

    呃,你为什么要这么做?让 PHP 留在后端,让 NodeJS/Sockets 来做它的非阻塞工作。

    以下是帮助您入门的内容:http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

    就我个人而言,我有一个快速运行的端点,该端点专门监听来自 PHP 的交互。

    例如,如果我向用户发送了一封电子邮件,我希望 socket.io 向用户显示实时通知。

    想要从 socket.io 到 php 的交互,你可以这样做:

    var http = require('http'),
                host = WWW_HOST,
                clen = 'userid=' + userid,
                site = http.createClient(80, host),
                request = site.request("POST", "/modules/nodeim/includes/signonuser.inc.php",  
                    {'host':host,'Content-Length':clen.length,'Content-Type':'application/x-www-form-urlencoded'});                     
    
    request.write('userid=' + userid);      
    request.end();  
    

    说真的,PHP 非常适合做服务器端的事情,让它与现在在这个域中没有位置的连接一起使用。当你有 websockets 或 flashsockets 时,为什么要进行长轮询。

    【讨论】:

    • 因为我们有些人只能买到便宜的主机,只能让你使用php和mysql。
    • 因为我们中的一些人必须使用依赖于 PHP 的现有框架。例如,我们开发和销售一个 PHP 脚本,但想通过使用 websockets 来改进 IM,我们不想编写 socket.io 已经实现的所有后备,但我们不能要求客户提供 NodeJS。
    • @PaulM:我尝试了几个 非常很慢,当某些东西被破坏时,支持很糟糕等等。另一方面,在芬兰,获得体面质量的网络托管(但仅使用 php/mysql/static 文件)并不少见adsl 订阅,无需支付任何额外费用。所以不,能够以 5 美元购买蹩脚的 VPS 绝对不是解决方案。
    • 对于
    • 我不同意。我认为这样的答案非常相关。有人告诉你“你用错了”可能比帮助你用错的人更有价值。
    【解决方案8】:

    【讨论】:

    • 这样做可以让您使用 socket.io(及其所有支持的传输和浏览器)。还是非得用php-websocket自带的客户端?
    【解决方案9】:

    这个怎么样? PHPSocketio ??它是一个 socket.io php 服务器端替代方案。事件循环基于 pecl 事件扩展。虽然直到现在还没有自己尝试过。

    【讨论】:

      【解决方案10】:

      我还没有尝试过,但你应该可以使用ReactPHP 和这个socket component 来做到这一点。看起来就像 Node,但在 PHP 中。

      【讨论】:

        【解决方案11】:

        在这个库中查找 php http://phptrends.com/category/70。 或者使用来自 php http://www.php.net/manual/en/book.sockets.php 的本机。

        【讨论】:

          【解决方案12】:

          我一直在寻找一种非常简单的方法来让 PHP 向客户端发送 socket.io 消息。

          这不需要任何额外的 PHP 库 - 它只使用套接字。

          不要像许多其他解决方案那样尝试连接到 websocket 接口,只需连接到 node.js 服务器并使用.on('data') 接收消息。

          然后,socket.io 可以将其转发给客户。

          在 Node.js 中检测来自 PHP 服务器的连接,如下所示:

          //You might have something like this - just included to show object setup
          var app = express();
          var server = http.createServer(app);
          var io = require('socket.io').listen(server);
          
          server.on("connection", function(s) {
              //If connection is from our server (localhost)
              if(s.remoteAddress == "::ffff:127.0.0.1") {
                  s.on('data', function(buf) {
                      var js = JSON.parse(buf);
                      io.emit(js.msg,js.data); //Send the msg to socket.io clients
                  });
              }
          });
          

          这是非常简单的 php 代码——我将它封装在一个函数中——你可能会想出更好的东西。

          请注意,8080 是我的 Node.js 服务器的端口 - 您可能需要更改。

          function sio_message($message, $data) {
              $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
              $result = socket_connect($socket, '127.0.0.1', 8080);
              if(!$result) {
                  die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
              }
              $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
              socket_close($socket);
          }
          

          你可以这样使用它:

          sio_message("chat message","Hello from PHP!");

          您还可以发送转换为 json 并传递给客户端的数组。

          sio_message("DataUpdate",Array("Data1" =&gt; "something", "Data2" =&gt; "something else"));

          这是一种“信任”您的客户端从服务器获取合法消息的有用方法。

          您还可以让 PHP 传递数据库更新,而无需数百个客户端查询数据库。

          我希望我能早点找到这个 - 希望这会有所帮助! ?

          【讨论】:

          • 好主意,我正在寻找一种跳过 redis 的方法(如果这是个好主意)!第一个代码中有一个错字,s.remoteAddress; 后面的分号。但是,我没有让它工作。我在节点中获得了连接,它检测到连接,远程地址是正确的,但s.on('data') 从未发生过,但什么也没有发生。我也试过s.on('msg')。我正在使用您的确切 PHP 代码。我在节点服务器上使用 https,但这不重要吗?
          • @Niclas 嘿,抱歉打错了 - 不敢相信一直存在。您的节点服务器是否在端口8080 上运行?如果不是,则需要更改端口。如果是这样,请检查返回的Remote Address - 确保它是环回/本地地址 - 它可能与您的服务器设置不同。为了测试,您可以删除行if(s.remoteAddress == "::ffff:127.0.0.1")
          • 感谢您的快速回复!我确实成功了 console.log 一路,即使 remoteaddress 是正确的,它只是没有进入 s.on('data') 部分。有没有办法测试发送了什么消息?请重新阅读我的评论,看看我是否遗漏了什么。我可能会将此作为发布代码的新问题开始,但它几乎与您的完全一样。
          • 我将此作为一个新问题开始,以便更容易详细讨论:stackoverflow.com/questions/53689391/…
          猜你喜欢
          • 2017-01-24
          • 2017-08-23
          • 2012-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          • 2012-01-13
          • 2015-09-28
          相关资源
          最近更新 更多