【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);
これにも助けられました…エラーハンドリングが、めちゃくちゃになっていた最中、これだけは裏切らなかった…!