如何使用 WebSocket 从 PHP 发送数据/文本进行处理?

How can I send data/text from PHP using WebSocket to process?(如何使用 WebSocket 从 PHP 发送数据/文本进行处理?)
本文介绍了如何使用 WebSocket 从 PHP 发送数据/文本进行处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我在充当 WebSocket 服务器的服务器上有进程(不是用 Ratchet 编写的).我希望能够使用 PHP(作为客户端)向该进程发送数据.

I have process on server which acts as WebSocket server (not written in Ratchet). I want to be able to send data to this process using PHP (as client).

我发现了很多像这样作为 TCP 发送的示例:

I found a lot of examples to send as TCP like this:

<?php
  $addr = gethostbyname("localhost");

  $client = stream_socket_client("tcp://$addr:8887", $errno, $errorMessage);

  if ($client === false) {
      throw new UnexpectedValueException("Failed to connect: $errorMessage");
  }

  fwrite($client, "GET / HTTP/1.0
Host: localhost
Accept: */*

");
  echo stream_get_contents($client);
?>

我只需要向进程发送消息并关闭连接即可.我期望的结果是 webSocket 的结果稍后会打印或回显"到 PHP 页面.

All I need I to send message to the process and close the connection. The result that I expect is the result from the webSocket will be later printed or "echo" to the PHP page.

有没有办法让它在 php 中与 curl 一起工作?

Is there a way to make it work with curl in php?

推荐答案

我在 github 上找到了这段代码,(我找不到我从哪里得到它的确切 repo,因为我已经查看并尝试了很多)

I have found this code on github, (I can't find the exact repo where I got it from because I have looked and tried a lot of them)

<?php
class WebsocketClient {

    private $_Socket = null;

    public function __construct($host, $port) {
        $this->_connect($host, $port);
    }

    public function __destruct() {
        $this->_disconnect();
    }

    public function sendData($data) {
        // send actual data:
        fwrite($this->_Socket, "x00" . $data . "xff") or die('Error:' . $errno . ':' . $errstr);
        $wsData = fread($this->_Socket, 2000);
        $retData = trim($wsData, "x00xff");
        return $retData;
    }

    private function _connect($host, $port) {
        $key1 = $this->_generateRandomString(32);
        $key2 = $this->_generateRandomString(32);
        $key3 = $this->_generateRandomString(8, false, true);

        $header = "GET /echo HTTP/1.1
";
        $header.= "Upgrade: WebSocket
";
        $header.= "Connection: Upgrade
";
        $header.= "Host: " . $host . ":" . $port . "
";
        $header.= "Origin: http://localhost
";
        $header.= "Sec-WebSocket-Key1: " . $key1 . "
";
        $header.= "Sec-WebSocket-Key2: " . $key2 . "
";
        $header.= "
";
        $header.= $key3;


        $this->_Socket = fsockopen($host, $port, $errno, $errstr, 2);
        fwrite($this->_Socket, $header) or die('Error: ' . $errno . ':' . $errstr);
        $response = fread($this->_Socket, 2000);

        /**
         * @todo: check response here. Currently not implemented cause "2 key handshake" is already deprecated.
         * See: http://en.wikipedia.org/wiki/WebSocket#WebSocket_Protocol_Handshake
         */
        return true;
    }

    private function _disconnect() {
        fclose($this->_Socket);
    }

    private function _generateRandomString($length = 10, $addSpaces = true, $addNumbers = true) {
        $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}';
        $useChars = array();
        // select some random chars:    
        for ($i = 0; $i < $length; $i++) {
            $useChars[] = $characters[mt_rand(0, strlen($characters) - 1)];
        }
        // add spaces and numbers:
        if ($addSpaces === true) {
            array_push($useChars, ' ', ' ', ' ', ' ', ' ', ' ');
        }
        if ($addNumbers === true) {
            array_push($useChars, rand(0, 9), rand(0, 9), rand(0, 9));
        }
        shuffle($useChars);
        $randomString = trim(implode('', $useChars));
        $randomString = substr($randomString, 0, $length);
        return $randomString;
    }

}

$WebSocketClient = new WebsocketClient('localhost', 8887);
echo $WebSocketClient->sendData("MyUserNameFromPHP");
unset($WebSocketClient);
?>

在我尝试过的 7 个 php websocket 客户端中,这是我唯一能够使用的客户端.它不需要任何外部文件或框架.这是执行不需要持久连接到 webSocket 服务器的短命令的简单实现.

Out of 7 php websocket clients that I tried, this is the only one that I was able to work with. It doesn't requires any external files or frameworks. This is simple implementation for executing short command that doesn't require persistent connection to webSocket server.

希望能帮到你们,省时省力!!!

I hope it helps you guys , and you will save some time !!!

这篇关于如何使用 WebSocket 从 PHP 发送数据/文本进行处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)