PHPでcurlを使ってネットワーク上からファイルをダウンロードするサンプルコードです。
用途に応じてカスタマイズして使ってみてください。
Curlの実行クラス(メモリ上に展開とファイルに直接ダウンロードするメソッド)
<?php namespace Util\Net; class Curl { // 引数の$optionsで設定をカスタマイズ可能 public static function request($url, $options): CurlResponse { return self::execCrul($url, $options + [ CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, // 例: 5回までリダイレクト許可 CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, // 例: タイムアウト3秒 CURLOPT_TIMEOUT => 3, CURLOPT_CONNECTTIMEOUT=> 3, // 例: sslのエラーを無視 (安全性下がるのでよくない) CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, ]); } // curlの実行結果を直接ファイルにダウンロードする public static function downloadAsFile($url, $storePath, $options): CurlResponse { $fp = fopen($storePath, 'w+'); try { return self::execCrul($url, $options + [ CURLOPT_FILE => $fp, ]); } finally { flose($fp); } } // curlを実行するメインのメソッド private static function execCrul($url, $options): CurlResponse { $curl = curl_init($url); try{ foreach ($options as $option => $value) { curl_setopt($curl, $option, $value); } $ret = curl_exec($curl); return (new CurlResponse())->setData($ret === false ? null : $ret) ->setInfo(curl_getinfo($curl)) ->setHttpStatus(curl_getinfo($curl, CURLINFO_HTTP_CODE)) ->setCurlError(curl_error($curl)) ->setCurlErrorNo(curl_errorno($curl)); } finally { curl_close($curl); } } }
Curlの実行結果を保持するクラス
上記のメインのコード内でcurlの実行結果を保存するクラスです。
<?php namespace Util\Net; class CurlResponse { private $httpStatus; private $curlErrorNo; private $curlError; private $data; private $info; function getHttpStatus() { return $this->httpStatus; } function getCurlErrorNo() { return $this->curlErrorNo; } function getCurlError() { return $this->curlError; } function getData() { return $this->data; } function getInfo() { return $this->info; } function setHttpStatus($httpStatus): self { $this->httpStatus = $httpStatus; return $this; } function setCurlErrorNo($curlErrorNo): self { $this->curlErrorNo = $curlErrorNo; return $this; } function setCurlError($curlError): self { $this->curlError = $curlError; return $this; } function setData($data): self { $this->data = $data; return $this; } function setInfo($info): self { $this->info = $info; return $this; } }
コメント