从FTP套接字流中读取会触发一个无限循环



我目前正在开发一个PHP库,该库允许按照RFC959标准在较低级别实现FTP函数,因此您可以使用它来创建调整后的FTP函数,特别是满足您的需求,或者您可以在不需要FTP扩展的情况下开发整个FTP客户端库。

几个小时以来,我一直在为一个问题头疼,我有一个方法FtpCommandStream::receive(),它可以用来在用FtpCommandStream::send()方法发送FTP命令后接收FTP回复字符串表示,问题是如果我在没有发送任何命令的情况下调用receive方法,或者控制流为空,那么将触发一个无限循环。

如果不在内部发送任何命令,我不会调用此方法。库用户可能会调用receive方法两次或在发送任何命令之前,这将触发无限循环并导致其他副作用。

receive()方法代码:

/**
* @inheritDoc
*/
public function receive()
{
$response = '';

// Check first if the command stream is empty or not!!
while (true) {
$line     = fgets($this->stream);
$response .= $line;
/**
* To distinguish the end of an FTP reply, the RFC959 indicates that the last line of
* a the reply must be on a special format, it must be begin with 3 digits followed
* by a space.
*
* @link https://www.rfc-editor.org/rfc/rfc959#section-4
*/
if (preg_match('/d{3}+ /', $line) !== 0) {
break;
}
}
$this->log($response);
return $response;
}

为了解决这个问题,我们必须在尝试使用fgetsfread函数读取命令流之前检查命令流是否为空,我尝试过使用foef,但不起作用(仅适用于数据流,请参阅此处(,我真的很难找到解决方案,因此非常感谢您的帮助。提前感谢!

如果不在内部发送任何命令,我不会调用此方法。库用户可能会调用receive方法两次或在发送任何命令之前,这将触发无限循环并导致其他副作用。

这是库用户的问题,而不是你的问题。清楚地记录在什么情况下可以调用函数。你无法确定服务器是否不会发送任何响应,或者响应是否还没有到达。

相关内容

最新更新