【问题标题】:Why is my ftp connection not working in php laravel but is working in FileZilla?为什么我的 ftp 连接在 php laravel 中不起作用,但在 FileZilla 中起作用?
【发布时间】:2021-07-13 21:40:40
【问题描述】:

我有一个 PHP Laravel (5.6) 系统,我需要连接到 FTP 服务器来上传单个文件。我要连接的 FTP 服务器通过 ip 地址限制访问,使用端口 990,除此之外还有一个看似简单的配置。在我的本地机器上(如果有帮助,我在 Linux Ubuntu 上运行)我能够很好地连接到 FileZilla 中的 ftp 服务器,FileZilla 似乎确实自动选择了 ftps。我也可以 ping 这个服务器。

现在这个 PHP Laravel (5.6) 应用程序正在 NGINX 上运行(已经运行了一段时间,服务器方面的其他一切似乎都很好)。到目前为止,我只是想让它在本地工作,尽管必须将它推送到生产服务器上(尽管配置几乎相同)。

我开始尝试使用内置的 PHP 函数 ftp_connect 和 ftp_ssl_connect - 两者都使用与 FileZilla 中相同的主机和端口号 (990)。我一直无法通过这一步 - 它返回 false(因此甚至无法访问我的登录逻辑)。

$ftp = ftp_connect(env('FTP_HOST'),env('FTP_PORT')); // returns FALSE
$ftp = ftp_ssl_connect(env('FTP_HOST'),env('FTP_PORT')): // returns FALSE

搜索了一段时间后,我决定尝试 Laravel 的文件系统,看看是否会更容易,这些是我在 config/filesystems.php 中的设置:

'ftp' => [
            'driver' => 'ftp',
            'host' => env('FTP_HOST'),
            'username' => env('FTP_USER'),
            'password' => env('FTP_PASSWORD'),
            'port' => env('FTP_PORT'),
            'ssl' => true,
            'timeout' => 60,
        ],

'sftp' => [
            'driver' => 'sftp',
            'host' => env('FTP_HOST'),
            'username' => env('FTP_USER'),
            'password' => env('FTP_PASSWORD'),
            'port' => env('FTP_PORT'),
            'timeout' => 60,
        ],

我想我会在这里尝试 ftp 和 sftp,然后我尝试了以下方法:

Storage::disk('ftp')->put('test.csv', $file);

和

Storage::disk('sftp')->put('test.csv', $file);

第一个刚刚超时,第二个给了我消息:League\Flysystem\Sftp\ConnectionErrorException: Could not login with username: ###, host: ### in...

任何关于这可能是什么或我可以采取的后续步骤来进行故障排除的任何想法都将不胜感激,我觉得我只是不知道如何尝试更好地了解这里的问题。谢谢!

编辑: 我意识到以前我一直为此使用 FileZilla 中的快速连接功能。我进一步调查并确认加密必须是基于 TLS 的隐式 FTP - 所以我想知道是否有我遗漏的设置。

【问题讨论】:

  • SFTP 不是 FTP/FTPS。
  • 我知道,我只是在尝试一切。

标签: php laravel ftp


【解决方案1】:

端口 990 用于隐式 TLS/SSL,正如您最终发现的那样。

隐式 TLS/SSL 是 not supported by the PHP built-in FTP implementation。 Laravel 也没有使用implicit TLS/SSL supported by flysystem(它可能在内部使用 PHP 内置的 FTP)。

隐式 TLS/SSL 是 90 年代的一种临时破解,允许旧版 FTP 软件无需修改即可使用加密连接。它从来都不是应该长期使用的东西,绝对不是30年后!隐式 FTP 甚至从未成为 FTP 标准的一部分。只有显式 TLS/SSL 在 2005 年由 RFC 4217 标准化。从那时起,任何人都不应该使用隐式 TLS/SSL。

修复您的 FTP 服务器以使用显式 TLS/SSL。

【讨论】:

  • 谢谢!在我意识到这是怎么回事后,我联系了 FTP 服务器的管理员让他们更改它,但这个简洁的答案有助于巩固我认为我发现的内容。
【解决方案2】:

查看您可以添加到filesystem.php 的其他设置 (https://flysystem.thephpleague.com/v2/docs/adapter/ftp/) 以用于您的 ftp 设置。将它们与您的 FileZilla 设置相匹配,看看是否有帮助。

Laravel 下面使用 flysystem 适配器连接到不同的存储类型,您可以参考上述 URL 中的设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多