php - 从 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;
}
fgets
为了解决这个问题,我们必须在尝试使用or函数从它读取之前检查命令流是否为空fread
,我尝试使用foef
但不起作用(仅适用于数据流,请参见此处),我真的努力寻找解决方案,所以任何帮助将不胜感激。提前致谢!
解决方案
我不会在内部不发送任何命令的情况下调用此方法,库用户可能会调用该
receive
方法两次或在发送任何命令之前调用该方法,这将触发无限循环并导致其他副作用。
那是图书馆用户的问题,而不是您的问题。清楚地记录在什么情况下可以调用该函数。您无法确定服务器是否不会发送任何响应,或者响应是否尚未到达。
推荐阅读
- ios - 为什么我在 Swift 4 中解析 JSON 后得到一个空白的 UITableView?
- javascript - Javascript 在 html 标记中返回未定义但在开发者控制台中显示结果
- python-3.x - 如果另一列中的值等于 Python pandas 中的特定值,是否可以计算 2 个或更多列的最大值/最小值?
- mysql - 计算一个表中与另一表中的条件匹配的记录
- python - 服务器和客户端问题:socket.gaierror: [Erno 11001] getaddrinfo failed
- java - 是否可以在java中交换两个数组索引的值?
- c++ - 我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以
- python - 如何求两个的最大幂
- java - 类型参数可以是Java中的引用吗?
- django - LTE 连接上的 Chrome err_connection_reset