在php中保存多个http调用的套接字连接



我目前正在这个项目(php)中工作,我必须使用套接字将我的php后端连接到远程服务器。我使用以下代码创建连接,它工作正常:

$key=base64_encode(openssl_random_pseudo_bytes(16));
$head = "GET / HTTP/1.1"."rn".
"Upgrade: WebSocket"."rn".
"Pragma: no-cache"."rn".
"Accept-Encoding: gzip, deflate"."rn".
"Connection: Upgrade"."rn".
"Origin: http://$host"."rn".
"Host: $host"."rn".
"Sec-WebSocket-Version: 13"."rn".
"Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits"."rn".
"Sec-WebSocket-Protocol: b_xmlproc"."rn".
"Cache-Control: no-cache"."rn".
"Sec-WebSocket-Key: $key"."rn".
"Content-Length: 0rn"."rn";
$sock = pfsockopen($host, $port, $errno, $errstr, 2);
fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);

我通过HTTP调用触发此代码,我试图避免创建多个套接字。目前,每次触发这个端点时,都会创建一个新的套接字。然而,我想使用预先存在的套接字,如果一个已经创建,而不是一个新的。以下是我到目前为止尝试过的,但没有成功。

  • 我尝试使用全局变量$GLOBALS = array('globalsocket' => null);,但每次触发新请求时都会重新创建变量
  • 我创建了一个文件,我试图序列化和反序列化套接字,但它没有工作;未序列化的套接字没有使用
  • 我尝试过类变量,但每次都要重新创建
  • 我阅读了文档,但几乎所有的方法都需要套接字的实例放在首位,这就是我试图检索…
  • 我也看了一下apc,但它没有在服务器上启用(我不能改变)

如果有人有关于如何做到这一点的线索,我将非常感激!谢谢。

p:我必须注意到,我已经习惯了nodejs而不是php,这可能是我很难弄清楚它的原因

PPS:我没有任何可以存储它的数据库

这是我如何做我想我nodejs


var net = require("net");
const http = require("http");
let client = new net.Socket();
let connected = false;
const requestListener = function (req, res) {
console.log("status", client.listening);
if (!connected) {
client.connect("port", "ip", function () {
console.log("Connected");
connected = true;

});
}
res.writeHead(200);
res.end("Hello, World!");
};
const server = http.createServer(requestListener);
client.on("data", function (data) {
console.log("Received: " + data);
client.destroy(); // kill client after server's response
});
client.on("close", function () {
connected = false;
console.log("Connection closed");
});
client.on("end", function(){
console.log("Connection end");
connected = false;
client.destroy()
})
client.on('error', function(){
console.log("Connection end");
connected = false;
client.destroy()
})
server.listen("xxx");

PHP不像Node那样是一个长时间运行的进程。仅给定您提供的部分代码,PHP进程将启动、打开套接字、写入并退出。当然,无论何时向该PHP脚本发出请求,这个过程都会重复。

要制作一个长时间运行的PHP脚本作为服务器,您需要1)需要从CLI运行它(这是绕过最大执行时间的唯一方法,默认情况下为30秒),并且2)您需要一个while循环或类似的东西来无限期地保持它打开(或直到满足某些条件)。

也许使用PHP库会更方便。

一些需要考虑的事情:

http://socketo。PHP websocket server

https://github.com/ratchetphp/Pawl - PHP websocket客户端

Background

PHP的工作原理就像HTTP,基本上是无状态的,每次收到新请求都会启动执行。我们有时可能需要运行后台作业和进程,我们需要使用crontab或类似的调度器。

注意:PHP进程阻塞IO,所以你可以在服务器上使用cli,让它运行来处理你所有的请求,但这将是重新发明轮子。

工作方法我建议使用:http://socketo.me/docs/hello-world

从上面的例子链接

<?php
namespace MyApp;
use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
class Chat 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) {
}
}

你可以继续使用这4个功能来实现一切。但是,您可能需要自定义逻辑来阻止会话或验证数据。

这也使用了一个后台进程,你需要在服务器上执行。

php bin/chat-server.php

,您可以使用任何自定义脚本来检查并在中断时保持运行,就像您为node使用pm2或supervisor一样。

如果这对你有效,请尝试更新我们。

相关内容

  • 没有找到相关文章

最新更新