かなり特殊事例のため、主に自分用メモ。
PHPからFTPSで接続してデータ転送をするとき、コネクションは確立できるもののput時に下記エラーが出て転送できないときの対応。
ftp_put(): php_connect_nonb() failed: Operation in progress (115)
エラーパターン
ftp_conn_ng.php
$ftpInfo = [
"ftpServer" => aaa.bbb.com,
"ftpPort" => 21,
"ftpUser" => user,
"ftpPass" => pass
];
$data = [
"local" => "localdir/file.txt",
"remote" => "remotedir"
];
$connection = ftp_ssl_connect($ftpInfo['ftpServer'],$ftpInfo['ftpPort']);
$login_result = ftp_login(
$connection,
$ftpInfo['ftpUser'],
$ftpInfo['ftpPass']
);
if($login_result){
ftp_pasv($connection, true);
$result = ftp_put($connection, $data["remote"]."/".basename($data["local"]), $data["local"], FTP_BINARY);
}
ftp_close($connection);
修正版
ftp_set_optionでFTP_USEPASVADDRESSの値をfalseに変更
ftp_conn_ok.php
$ftpInfo = [
"ftpServer" => aaa.bbb.com,
"ftpPort" => 21,
"ftpUser" => user,
"ftpPass" => pass
];
$data = [
"local" => "localdir/file.txt",
"remote" => "remotedir"
];
$connection = ftp_ssl_connect($ftpInfo['ftpServer'],$ftpInfo['ftpPort']);
$login_result = ftp_login(
$connection,
$ftpInfo['ftpUser'],
$ftpInfo['ftpPass']
);
if($login_result){
ftp_set_option($connection, FTP_USEPASVADDRESS, false); // ← 追加
ftp_pasv($connection, true);
$result = ftp_put($connection, $data["remote"]."/".basename($data["local"]), $data["local"], FTP_BINARY);
}
ftp_close($connection);
とりあえずこれで動くようにはなったものの、FTP_USEPASVADDRESSの意味がいまいち分からず。。
誰かご存知の方いましたら教えてください。