gpt4 book ai didi

php - 越过服务器,如何读取直到当前传输结束?

转载 作者:行者123 更新时间:2023-12-03 11:53:12 25 4
gpt4 key购买 nike

我正在编写一个连接到服务器、发送请求、读取响应和发送其他命令的工具。

问题是服务器发送的响应可能因行而异(总是至少一行,但可以是 3、5 行),他可以发送一行,等待几秒钟,然后发送其他行。

有没有办法读取所有传入的数据,直到它们停止?
也许我必须更改 sockets ?

这是我的尝试:

$fp = fsockopen("www.example.com", 25, $errno, $errstr, 30);

-
while(fgets($fp, 1024)) {} // hangs

-
fgets($fp, 4096); // works, but doesn't get the multiple lines

-
while(!feof($fp)){
fgets($fp, 1024);
}
// hangs

-
while(($c = fgetc($fp))!==false) {
var_dump($c);
}
// hangs

最佳答案

您正在使用 TCP 连接。除非通信伙伴之一明确关闭它,否则 TCP 连接将保持打开状态。

这表示

while(!feof($fp)) {
fgets($fp);
}

除非服务器在传输后关闭连接,否则将永远挂起。 (似乎远程服务器没有)。这适用于 while(fgets($fp, 1024)) {}也是。

另一种选择是客户端(您的 PHP 脚本)关闭连接。只有当客户端知道消息的大小并且可以决定何时发送所有字节时,才能安全地完成此操作。

实现这是一个协议(protocol)特性,例如在 HTTP 中使用 content-length header 。

连接到端口 25 后,我假设您正在与 SMTP 服务器通话。 SMTP 将消息长度作为协议(protocol)功能进行管理。您需要实现 SMTP 协议(protocol)。

关于:
$message = fgets($fp, 4096);

只有在确定消息永远不会超过 4096 字节时,它才会“工作”。换行符仍在结果中,您只需要
$lines = explode("\n", $message);

关于php - 越过服务器,如何读取直到当前传输结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com