如何使用 WebSocket 从 PHP 发送数据/文本进行处理?
Posted
技术标签:
【中文标题】如何使用 WebSocket 从 PHP 发送数据/文本进行处理?【英文标题】:How can I send data/text from PHP using WebSocket to process? 【发布时间】:2016-10-02 09:51:31 【问题描述】:我在服务器上有一个进程,它充当 WebSocket 服务器(不是用 Ratchet 编写的)。我希望能够使用 php(作为客户端)向该进程发送数据。
我发现了很多这样的 TCP 发送示例:
<?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\r\nHost: localhost\r\nAccept: */*\r\n\r\n");
echo stream_get_contents($client);
?>
我只需要向进程发送消息并关闭连接。我期望的结果是 webSocket 的结果稍后将被打印或“回显”到 PHP 页面。
有没有办法让它与 php 中的 curl 一起工作?
【问题讨论】:
你的代码的结果是什么? 可以下载php库使用吗?如果是,您可以使用其中之一来制作 websocket 客户端。如果没有,您很可能需要为客户端编写一些 javascript 代码。 我期望的结果是来自 webSocket 的结果稍后将被打印或“回显”到 php 页面。 @jgr208 - 我可以下载 php 库,但在这种特定情况下,php 页面是客户端,所以我为什么需要添加 JS? @PiniCheyni 我的意思是如果你不能下载它们那么你将不得不使用纯js,因为你可以不需要使用纯js并且可以使用php。 【参考方案1】:我在 github 上找到了这段代码,(我找不到确切的代码库,因为我已经查看并尝试了很多代码)
<?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, "\x00\xff");
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\r\n";
$header.= "Upgrade: WebSocket\r\n";
$header.= "Connection: Upgrade\r\n";
$header.= "Host: " . $host . ":" . $port . "\r\n";
$header.= "Origin: http://localhost\r\n";
$header.= "Sec-WebSocket-Key1: " . $key1 . "\r\n";
$header.= "Sec-WebSocket-Key2: " . $key2 . "\r\n";
$header.= "\r\n";
$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 服务器的短命令的简单实现。
希望对大家有帮助,也可以节省一些时间!!!
【讨论】:
这个解决方案似乎有效。您能否将您的问题标记为已解决? 上面提供的代码位于github.com/edtsz/PHP-WebSocket/blob/master/client.php 它与 C# 应用程序完美配合,因此我可以为它制作一个 Web 客户端 @pini-cheyni 我无法使用sendData
函数发送数据。我在 Django 上的套接字服务器上没有显示任何响应。谁能帮帮我?
@AMANSHARMA 祝你好运,我也处于类似情况,我尝试了很多,但似乎没有成功。我使用棘轮作为套接字服务器,反应 js 作为客户端,它工作正常,但是当我尝试使用 php 作为 cient 它只是不起作用。我的目的是在收到新的 webhook 时更新 react-webpage。以上是关于如何使用 WebSocket 从 PHP 发送数据/文本进行处理?的主要内容,如果未能解决你的问题,请参考以下文章
php使用WebSocket详细教程之对接收数据解包及发送数据包装
如何使用 STOMP 从 Spring WebSocket 服务器向 WebSocket 客户端发送消息?
使用 php 在 android 中使用 websocket 实现聊天