Laravel中SFTP disconnect()方法无法生效的问题求助
解决Laravel 9 + league/flysystem-sftp-v3手动断开SFTP连接的问题
在league/flysystem-sftp-v3中,SFTP客户端的获取路径和旧版本不同,你之前的调用方式都没命中正确的方法,试试下面的方案:
首先确认你的$sftp是Flysystem的Filesystem实例(比如通过Laravel的Storage::disk('sftp')获取的),然后用以下代码断开连接:
// 获取SFTP适配器 $adapter = $sftp->getAdapter(); // 确保是phpseclib v3的SFTP适配器 if ($adapter instanceof \League\Flysystem\PhpseclibV3\SftpAdapter) { // 获取底层SFTP客户端并断开连接 $client = $adapter->getClient(); $client->disconnect(); }
为什么之前的方法报错?
$sftp->disconnect():Filesystem实例本身没有disconnect方法,直接调用肯定报错。$sftp->getDriver()->getAdapter()->disconnect():Flysystem v3已经移除了getDriver()方法,直接用getAdapter()即可;而且适配器本身也没有disconnect方法,必须拿到底层的SFTP客户端才能调用断开方法。- 第三种调用路径里的
getFilesystem()是多余的($sftp本身就是Filesystem实例),且v3适配器获取客户端的方法是getClient(),旧路径不适用。
另外提一句:如果是在Laravel的Job中,一般不需要手动断开连接,任务结束后连接会自动被回收,但如果业务上确实需要主动断开,用上面的代码就可以。
内容的提问来源于stack exchange,提问作者Tarikul Islam
相关产品推荐
相关产品推荐

