我目前正在这个项目(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一样。
如果这对你有效,请尝试更新我们。