@Coddee.

Unity/C#とか、PHP/MySQLとか。ぺーぺーがプログラムの備忘録も兼ねて。

【PHP】外部サーバへのファイル転送は「cURL」関数

まさかのデスマーチ
とあるお仕事で、そんなキーワードが頭によぎるような事態がありました…
まあまあ、終わったのでいいですけれど。デスマーチのきっかけは、お題にある「cURL」。備忘録がてら、使い方を残しておきます。

外部サーバに対してファイルを転送するときとか

<?php
// sftpによる接続およびファイル転送
$curl = curl_init();
$file = fopen("curl.txt", "r+");
$url = "http://192.168.33.10/file/";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_UPLOAD, 1);
curl_setopt($curl, CURLOPT_INFILE, $file);
curl_exec($curl);
curl_close($curl);

標準の関数で飛ばすこともできるんですが、キーファイルを指定されたり、ポート指定があったり、そもそも飛ばし方に指示があったり……。
悩んだ挙句、一番マッチして、かつそこまで改修が必要のない関数「cURL」を選択しました。

オプションは「curl_setopt()」で指定

cURL」のもう一つの強みが、付随するオプションの豊富さです。これがあったから、デスマーチもなんとか乗り切れた感はあります…

  • CURLOPT_URL

転送先URLを設定

  • CURLOPT_UPLOAD

ファイルをアップロードする際に使用。(1なら「転送ON」)

  • CURLOPT_INFILE

実際に転送するファイルを指定

  • CURLOPT_PROTOCOLS

転送する際に経由するのはSFTP?SCP?FTP?っていうのを決める

  • CURLOPT_SSH_PUBLIC_KEYFILE

公開鍵ファイルに指示がある際はこれでファイルを指定

  • CURLOPT_SSH_PRIVATE_KEYFILE

こっちは秘密鍵

  • CURLOPT_SSH_AUTH_TYPES

AUTHキーの指定がある際はこれ

  • CURLOPT_SSLKEYPASSWD

SSL接続のためのパスワード指定

実際に使ったコードはこんな感じ。

<?php
// ERRの取得
error_reporting(E_ALL);
ini_set("display_errors",1);

// cURLスタート
$ch = curl_init();
$file = fopen($filepath, "r+");

curl_setopt($ch, CURLOPT_URL, "sftp://$user:$password@$server_name/$filename");
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_setopt($ch, CURLOPT_SSH_PUBLIC_KEYFILE, $publickey);
curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, $privateKey);
curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);

curl_exec($ch);
$error_no = curl_errno($ch);

fclose($file);
curl_close($ch);

これにも助けられました…エラーハンドリングが、めちゃくちゃになっていた最中、これだけは裏切らなかった…!

余談ですが…

sftp接続する際、以下の点に気をつけてくださいね。こんなのにもスタックしてました…

  • 鍵ファイルはPutty形式かOpenSSH形式か
  • 鍵ファイルを開くためのパスワードは記述したか
  • ソフトウェア側のファイアウォールの22番ポートは開いているか(iptables
  • ハードウェア側はどうか(データセンターに問い合わせてくださいね)

今年入社の新人君がまさかの案件のメインフロントであることから、かなり振り回された感がありました…(ボクも反省するところは多々…)
まあ終わったことですのでね。いいですけれど。