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

PHP の cURL を使って FTP を行う。

ライブラリもあったけど、未検証
FTP for PHP

   このエントリーをはてなブックマークに追加