You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel通过22端口连接FTP存储服务器无响应,如何排查?

排查Laravel FTP/SFTP连接无限循环问题

兄弟,我一眼就注意到你配置里的一个核心矛盾——你用的是ftp驱动,但端口设成了22,这可是SFTP(SSH文件传输协议)的默认端口啊!FileZilla能正常连接,大概率是因为它自动检测并切换到了SFTP模式,但Laravel的ftp驱动是基于标准FTP协议的,默认端口是21,这几乎肯定是导致命令无限循环(连接超时)的原因。咱们一步步来排查解决:

1. 先确认驱动与端口的匹配性

首先分两种情况处理:

情况A:你的服务器是标准FTP服务

  • 把端口改成21,同时添加被动模式和超时配置(大部分FTP服务器需要被动模式才能正常工作):
'ftp' => [
    'driver' => 'ftp',
    'host' => '11.11.11.11',
    'port' => 21, // 修正为FTP默认端口
    'username' => 'username',
    'password' => 'password',
    'root' => '/var/www',
    'passive' => true, // 开启被动模式
    'timeout' => 30, // 设置超时时间,避免无限等待
]

情况B:你的服务器是SFTP服务(端口22)

  • 切换到sftp驱动,Laravel需要额外依赖支持,先安装包:
composer require league/flysystem-sftp-v3
  • 然后修改filesystems.php配置:
'sftp' => [
    'driver' => 'sftp',
    'host' => '11.11.11.11',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'root' => '/var/www',
    'timeout' => 30,
]
  • 命令里也要改成Storage::disk('sftp')

2. 给命令加异常捕获,看具体错误

无限循环大概率是连接超时或者未捕获的异常,给你的Artisan命令加try-catch,直接输出错误信息:

public function handle() {
    try {
        // 根据实际驱动修改disk名称
        $disk = Storage::disk('ftp'); // 或 'sftp'
        $disk->makeDirectory('test');
        dd('连接成功!目录已创建', $disk);
    } catch (\Exception $e) {
        dd('错误信息:', $e->getMessage(), '错误堆栈:', $e->getTraceAsString());
    }
}

执行命令后就能看到具体的错误,比如认证失败、端口不可达、权限不足等。

3. 验证网络与服务器权限

  • 在Laravel所在服务器的命令行,直接测试连接:
    • FTP测试:ftp 11.11.11.11 21,输入用户名密码,看能不能正常操作
    • SFTP测试:sftp username@11.11.11.11 -p22,看能不能登录并创建目录
  • 检查Laravel服务器的防火墙,是否允许出站访问目标服务器的21/22端口
  • 确认目标服务器的/var/www目录有写入权限给你的FTP/SFTP用户

4. 查看Laravel日志

如果try-catch没捕获到异常,去storage/logs/laravel.log里找相关日志,Laravel会把未捕获的异常记录在这里,能帮你定位更隐蔽的问题。

内容的提问来源于stack exchange,提问作者Emmanuel-Ab

火山引擎 最新活动