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;
}
}
コメント