経緯
Laravel の Storage ファサードを使ってFTP操作をしようとした際に以下のようなエラーが出た。
>>> Storage::disk('ftp')->files()
PHP Warning: ftp_rawlist(): php_connect_nonb() failed: No error (0) in /*****/vendor/league/flysystem/src/Adapter/Ftp.php on line 570
この記事を参考にして調べたところ、自分が接続しようとしている環境でも ftp_set_option()
で FTP_USEPASVADDRESS
を false
にすれば正常に動作する事が分かった。
Laravel での設定方法
Laravel 公式ドキュメントの設定例 にはそれらしいオプションは見当たらなかったが、ソースを追ったところ設定している箇所を発見し、ignorePassiveAddress
というオプションがある事が分かった。
これを config/filesystems.php
に設定してやると FTP_USEPASVADDRESS
が設定され、FTP操作ができるようになった。
'ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'your-username',
'password' => 'your-password',
'passive' => true,
'ssl' => true,
'ignorePassiveAddress' => true, // FTP_USEPASVADDRESS を false にするには true を指定する
],
おまけ
後から知ったが、League\Flysystem のドキュメント のサンプルコードには ignorePassiveAddress
の記述があった。
その他設定可能なオプションを調べたい場合は \League\Flysystem\Adapter\Ftp::$configurable
を参照すると良い。
protected $configurable = [
'host',
'port',
'username',
'password',
'ssl',
'timeout',
'root',
'permPrivate',
'permPublic',
'passive',
'transferMode',
'systemType',
'ignorePassiveAddress',
'recurseManually',
'utf8',
'enableTimestampsOnUnixListings',
];