読者です 読者をやめる 読者になる 読者になる

ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

PHPでFTP送信する際には転送先パスの指定にご注意

 仕事でどハマりしたのでメモメモ。


 PHPFTP送信するときには以下のような書き方をします。

// 1.FTP接続
// 引数:IPアドレス, ポート番号, タイムアウト秒
$connId = ftp_connect('127.0.0.1', 21, 90);
if (" $connId) {
	throw new Exception("FTP接続に失敗しました");
}
// 2.FTPログイン
// 引数:接続ID,FTPユーザーID,FTPユーザーパスワード
$ret = ftp_login($connId, 'ftp_user', 'password');
if (!$ret) {
	throw new Exception("FTPログインに失敗しました");
}
// 3.パッシブモードをONにする
ftp_pasv($connId, true);
// 4.ファイル転送を行う
// 引数:接続ID,送信先パス(※),転送ファイルパス, 転送タイプ
$ret2 = ftp_put($connId, 'ftp_cache', $file_path_from, FTP_BINARY);

// 5.FTP接続の切断
// 引数:接続ID
$ret3 = ftp_close($connId);
if (!$ret2) {
	throw new Exception("ファイルのアップロードに失敗しました");
}

if (!$ret3) {
	throw new Exception("FTP接続の切断に失敗しました");
}


 今回オレがどハマりしたのが上記4のファイル転送。FTPログインをすると、そのユーザーのホームディレクトリにアクセスするんですが、ftp_put()で指定する転送先パスは、必ず相対パスを指定して下さい。絶対パスを指定すると「Could not create file.」というエラーを出力します。


 例えば上記の場合、FTPユーザーが「ftp_user」だったら、「/home/ftp_user」とかがFTP接続時のホームディレクトリになるわけです。が、転送先を「/home/ftp_user/ftp_cache」とかを指定してしまうとアウト、実際には「/home/ftp_user/home/ftp_user/ftp_cache」に転送しようとしていることになります。ちゃんと「/home/ftp_user/ftp_cache」に転送したければ、相対パスで「ftp_cache」と指定しなくてはなりません。


 ちなみに、この「Could not create file.」ってエラーがやっかいで、似たようなエラーで「553:Could not create file.」というのがあります。これはパーミッションエラーを指しており、chmod 777 とかでアクセス権限を与えてやると解決します。ところが今回オレが出会った事例はその方法では解決せず、ググってみても「権限エラーの疑いが……」とかしか出てこないので、エラく悩みました。実際には単に転送先をフルパスで指定していたから「そんなディレクトリ無えよ!」と怒られてただけだったわけです。分かってみれば実にくだらない……。


 PHPFTP転送するような必要性が今巷にどの程度あるのか分かりませんが、試される方はくれぐれもご注意ください。