どもです。
FTPS上にアップされたCSVをDBに落とすプログラムを作成していたのですが、このときにファイル名は問わないという縛りがあり、では何を基準に複数ファイルがあったときの処理順を定めるべきか。
普通に考えたらファイルの更新日時かアップロード日時ですな。
ファイル更新日時の昇順といたしましょう。
さて、どうすればそれが適うのか。
Menu
ローカルのファイルの日時を取得するなら…
filemtimeですな。
使い方はこちらのサイト様がとてもわかりやすい。
しかし、今回はFTPなので、絶対パスで指定するfilemtimeではない。さて。
ftp_nlistって引数lsコマンド使えるのか→できないな…、何故だ。
// 接続を確立する
$conn_id = ftp_connect($ftp_server);
// ユーザー名とパスワードでログインする
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// カレントディレクトリの内容を得る
$contents = ftp_nlist($conn_id, "-lt /dir");
これで良し。
と思ったのですが、いざ出力してみると、どうにもソートができていないよう。
色々試してみましたが、コマンドが無効化されてしまっています。サーバーのせい?参ったな_(:3」∠)_
ftp_mdtmで一度取得したCSVを並び替えてみるか→レファレンスとちょっと違うことになったけど…
アプローチを変えてみましょ。ftp_mdtmを使います。
これだとファイルひとつひとつでFTP接続するので重そうな気はしますが、今回は大量のファイルを捌くわけでないので良しとしましょう。
ftp_nlistで取得した配列をなんやかんやして、ファイル名を獲得しまして…、
$fileList = array();
foreach($contents as $file_name){
$tmp = ftp_mdtm($conn_id, $file_name);
if(isset($fileList[$buff])){
//同日時ファイルが複数あった場合の回避
$i = 0;
do{
$i++;
$tmp = $buff.'_'.$i;
}while(isset($fileList[$tmp]));
$buff = $tmp;
}
$fileList[$tmp] = $remotePath;
}
ksort($fileList);
これで良し。
と思ったのですが、これだとftp_mdtmでエラー、返り値が-1になってしまうよう。
色々試してみたところ、$file_nameをフルパスにしたら正しい値を返してくれました。
よって、今回はこちらを採用。
FTPSだから?それともサーバー依存?
いちおう解決したものの、ことごとくレファレンス通りにいかないのが腑に落ちなく。_(:3」∠)_
FTPでなくFTPSだからか、PHPのバージョンが古めだからか、それともサーバー由来の問題があるのか。
おいおい追及するとして、まぁ今回は、こーいった事例もあったよということでひとつ。