我正在编写一个连接服务器,发送请求,读取响应和发送其他命令的工具。
问题是服务器发送的响应在行数方面会有所不同(它总是至少有一行,但可以是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
答案 0 :(得分:2)
您正在使用TCP连接。除非其中一个通信伙伴明确关闭,否则TCP连接将保持打开状态。
这意味着
while(!feof($fp)) {
fgets($fp);
}
除非服务器在传输后关闭连接,否则将永久挂起。 (似乎远程服务器不)。这同样适用于while(fgets($fp, 1024)) {}
。
另一个选项是客户端(您的PHP脚本)关闭连接。只有当客户端知道消息的大小并且可以决定何时发送所有字节时,才能安全地完成此操作。
实现这是一个协议功能,在HTTP中,例如使用内容长度标头。
如果您连接到端口25,我假设您正在与SMTP服务器通话。 SMTP将消息长度作为协议功能进行管理。您需要实施SMTP协议。
关于:
$message = fgets($fp, 4096);
只有在确定消息永远不会超过4096字节时,才能“工作”。新行仍然在结果中,您只需要
$lines = explode("\n", $message);