为什么我的 ftp 连接在 php laravel 中不起作用,但在 FileZilla 中起作用?

Why is my ftp connection not working in php laravel but is working in FileZilla?

我有一个 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)。我一直无法通过这一步 - 它 returns 错误(所以从来没有进入我的登录逻辑)。

$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:无法使用用户名登录:###,主机:### in...

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

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

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

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

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

隐含的 TLS/SSL 被 Laravel 使用 not supported by the PHP built-in FTP implementation. Neither is 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。