如何解决在php中通过多个http调用保持套接字连接 背景工作方法
我目前正在处理这个项目 (php),我必须使用套接字将我的 php 后端连接到远程服务器。我正在使用此代码创建连接并且它工作正常:
$key=base64_encode(openssl_random_pseudo_bytes(16));
$head = "GET / HTTP/1.1"."\r\n".
"Upgrade: WebSocket"."\r\n".
"Pragma: no-cache"."\r\n".
"Accept-Encoding: gzip,deflate"."\r\n".
"Connection: Upgrade"."\r\n".
"Origin: http://$host"."\r\n".
"Host: $host"."\r\n".
"Sec-WebSocket-Version: 13"."\r\n".
"Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits"."\r\n".
"Sec-WebSocket-Protocol: b_xmlproc"."\r\n".
"Cache-Control: no-cache"."\r\n".
"Sec-WebSocket-Key: $key"."\r\n".
"Content-Length: 0\r\n"."\r\n";
$sock = pfsockopen($host,$port,$errno,$errstr,2);
fwrite($sock,$head ) or die('error:'.$errno.':'.$errstr);
我通过 HTTP 调用触发此代码,并试图避免创建多个套接字。目前,每次我触发这个端点时,都会创建一个新的套接字。但是,如果已经创建了一个套接字而不是一个新的套接字,我想使用预先存在的套接字。这是我迄今为止尝试过的方法,但没有成功。
- 我尝试使用全局变量
$GLOBALS = array('globalsocket' => null);
,但每次触发新请求时都会重新创建该变量。 - 我创建了一个文件,我试图在其中序列化套接字并反序列化它,但没有成功;反序列化套接字没有用
- 我尝试过类变量,但当然每次都会重新创建
- 我阅读了文档,但几乎所有方法首先都需要套接字的实例,这正是我想要检索的...
- 我还查看了 apc,但它没有在服务器上启用(我无法更改)
如果有人知道如何做到这一点,我将不胜感激!谢谢。
PS:我必须注意,我习惯于 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.js 那样是一个长时间运行的进程。仅给定您提供的部分代码,PHP 进程将启动、打开套接字、写入和退出。每当您向该 PHP 脚本发出请求时,这个过程当然会重复。
要制作一个长时间运行的充当服务器的 PHP 脚本,您需要 1) 需要从 CLI 运行它(这是绕过最大执行时间的唯一方法,默认情况下为 30 秒),并且2) 你需要一个 while 循环或类似的来让它无限期地打开(或直到满足某个条件)。
也许您会更喜欢为此目的使用 PHP 库。
需要考虑的一些事项:
http://socketo.me/ - PHP websocket 服务器
https://github.com/ratchetphp/Pawl - PHP websocket 客户端
,背景
PHP 就像 HTTP 一样工作,基本上无状态会在每次收到新请求时启动执行。我们有时可能需要运行需要使用 crontab 或类似调度程序的后台作业和进程。
注意: PHP 进程正在阻塞 IO,因此您可以在服务器上使用 cli 并保持其运行来满足您的所有请求,但这将重新发明轮子。
工作方法
我建议使用:http://socketo.me/docs/hello-world
来自上面链接的示例
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
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
并且您可以使用任何自定义脚本来检查并在中断时保持运行,就像您使用 pm2 或管理节点一样。
如果这对您有用,请尝试更新我们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。