首页 > 解决方案 > 从 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但不起作用(仅适用于数据流,请参见此处),我真的努力寻找解决方案,所以任何帮助将不胜感激。提前致谢!

标签: phpsocketsftp

解决方案


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

那是图书馆用户的问题,而不是您的问题。清楚地记录在什么情况下可以调用该函数。您无法确定服务器是否不会发送任何响应,或者响应是否尚未到达。


推荐阅读