WEBプログラミング入門

PHPでローカルファイルをサーバーにアップロード

定期的にCSVファイルなどをサーバーにアップロードする方法

アップロードするファイルがあるローカルマシンにPHPをインストールする

  1. PHPを動作させるにはVisual C++が必要なので予めインストールしておく。
    公式ダウロードサイト
    その他のツールとフレームワーク > Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ
  2. PHP公式ページのDownloadsをクリック
  3. DownloadsのWindows downloadsをクリック
  4. Windows downloadsのx64のインストールしたいVerのZipをクリック
  5. Zipファイルを任意の場所に展開 例)Dドライブルートに配置("d:\php")
  6. pathを通さない場合は、"d:/php/php.exe"でプログラム実行

インストール後の確認

  1. テスト用にPHPファイルを任意の場所に作成 例D:/phpsource/test.php
  2. Shift押しながら右クリックでメニューに「パスのコピー」がでる
  3. またはファイルを直接VScodeのターミナルにドラッグするとパスが入力される
  4. test.phpに適当にphpコードを書く
  5. d:/php/php.exe d:/phpsource/test.php でtest.phpの内容が表示されればOK
  6. pathを通していれば、php d:/phpsource/test.phpでOK

タスクスケジューラにd:/phpsource/test.phpを登録

  1. タスクスケジューラを開く
  2. 基本タスクの設定を開く
  3. 作成ウィザードが開くので名前と説明を入力
  4. トリガーで実行間隔を設定(ここでは1日単位しか選べないが後で時間単位に変更できる)
  5. 開始時間と繰り返し回数を指定
  6. プログラムの開始を選択
  7. プログラム/スクリプトでPHP実行ファイルのフルパス入力 D:\php\php.exe
  8. 引数の追加(オプション) 実行したいPHPファイル -f test.php

    ※-fオプションは後ろのファイルをパースして実行する。詳しくは公式マニュアル参照

  9. 開始(オプション) PHPファイルがあるフォルダ D:\phpsource
  10. 完了

実際の設定画面

時間間隔を5分単位にする場合

  1. 登録したタスクを右クリック、プロパティを開く
  2. トリガータブの毎日を選択して編集をクリック
  3. タスクの開始はスケジュールに従う
  4. 設定は1回
  5. 開始時間は任意
  6. 繰り返し間隔を5分にする
  7. 継続時間を無期限にする
  8. OK

タスクスケジュールが設定できているか確認する

d:/phpsource/test.php
  • <?php
  • $time = date("YmdHis");
  • mkdir("D:/phpsource/{$time}");

確認のため、現在時刻でフォルダを作成する簡単なコードを書いてタスクスケジューラに登録する。このファイルをタスクスケジューラで5分ごとに実行して、20200928201035(2020年9月28日20時10分35秒)、20200928201535(2020年9月28日20時15分35秒)、、、と5分後ごとにフォルダが作成されていれば設定できている。

PHPからサーバーにアップロードする

タスクスケジューラに登録したPHPファイルに、FTPでアップロードする処理を書けば、ローカルファイルを自動定期アップロードできるようになる。

サンプルコード

例)…20200927注文0001.csv…20200928注文0001.csv…20200928注文0008.csv…という注文データがあって当日のデータのみアップロードしたいとする。csvファイルはすべて./csv_data内にあるとする。アップロード先も同じディレクトリ名で/csv_data内に保存するとする。

upload.php
  • アップロードするファイルを配列に入れる処理
  • //今日の日付を変数に入れる
  • $today = date("Ymd");//20200928
  • //アップロードしたいファイルパスを格納する配列を初期化
  • $upload_file=[];
  • //globを使ってパターンにマッチするパス名を探す。この例ではphpファイルと同階層のcsv_dataフォルダ内の20200928が含まれるファイルを検索する。
  • //foreachで検索ファイルがなくなるまで$upload_fileに配列追加
  • foreach(glob("./csv_data/*$today*") as $file) {
  • $upload_file[] = $file;
  • }
  • $uplad_fileの中身
  • 20200928注文0001.csv
  • 20200928注文0002.csv
  • あるだけ続く...
  • PHPからサーバーに接続する処理
  • //FTPサーバのアドレスはレンタルサーバーの管理画面等で確認する。
  • $host = 'ftpサーバのアドレス'
  • $port = 21
  • //セキュアなSSL-FTP接続(接続エラーでfalseを返す)
  • $conn_id = ftp_ssl_connect($host,$port);
  • //接続エラーなら処理終了
  • if(!$conn_id){exit;}
  • アップロード用のFTPユーザーを作る(レンタルサーバーの管理画面から作成)
  • $username = 'FTPユーザーネーム'
  • $password = 'FTPパスワード'
  • ログインする。失敗したらftp接続を閉じて終了
  • if(!ftp_login($conn_id, $username, $password)) {
  • ftp_close($conn_id);
  • exit();
  • }
  • パッシブモードに設定
  • ftp_pasv($conn_id, true);

  • アップロード処理
  • foreach ($uplad_file as $value) {
  • ftp_put($conn_id, $value, $value, FTP_ASCII)

  • FTP接続を閉じる
  • ftp_close($conn_id);
関連リンク