HerokuからPHPでFTPにファイルをアップしてみる
herokuのPHPから、FTPプロトコルで接続し、
同じディレクトリにあるファイルをアップロードしてみた。
ftp_put
を使用するば、接続後にアップロードが出来るよう。
http://php.net/manual/ja/function.ftp-put.php
以下のPHPを書いて、herokuにアップしてみた。
ini_set( 'display_errors', 1 );
$ftp_server = 'ホスト名';
$ftp_user_name = 'ユーザー名';
$ftp_user_pass = 'パスワード';
$file = 'somefile.txt';
$remote_file = '/ディレクトリ/readme.txt';
// 接続を確立する
$conn_id = ftp_connect($ftp_server);
// ユーザー名とパスワードでログインする
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
//パッシブモードをオンにする
ftp_pasv($conn_id, true);
// ファイルをアップロードする
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
echo "successfully uploaded $file\n";
} else {
echo "There was a problem while uploading $file\n";
}
// 接続を閉じる
ftp_close($conn_id);
ローカルではこれで動いていたのだが、herokuにアップすると、以下のエラーが出て動作しなかった。
Fatal error: Call to undefined function ftp_connect() in /app/index.php on line 17
phpinfo
で確認してみると、FTP support
がなかったので、これでエラーが出ていたよう。
http://d.hatena.ne.jp/kasahi/20090206/1234198797
追記
FTP support
は、composerの設定で後から追加できた。
composert.json
に以下を記述してdeployするとFTPサポートが追加される。
{
"require": {
"ext-ftp":"*"
}
}
composerで追加できるオプションは以下にある。
https://devcenter.heroku.com/articles/php-support#extensions
追加した上で、1つ目のPHPを試してみると、無事、アップロードできました。
他に方法がないか探してみると、どうやら、CURL
でも出来る、とのこと。
PHPでPASV(passiveモード)なFTP
以下を書いてherokuにアップしてみたところ、無事、アップロードされた。
$remote_file = 'ftp://ユーザー:パスワード@ホスト名/ディレクトリ/readme.txt';
$local_file = 'somefile.txt';
try{
$fp = fopen($local_file, "r");
$ch = curl_init();
curl_setopt($ch, CURLOPT_FTP_USE_EPSV, false);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_URL, $remote_file);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($local_file));
curl_exec($ch);
curl_close($ch);
echo 'success';
} catch (Exception $e) {
var_dump($e);
}
参考URL
ライブラリもあったけど、未検証
FTP for PHP