cfmgrv4/app/Libraries/MySocket/CloudflareSocket.php
2024-10-04 11:50:44 +09:00

98 lines
3.1 KiB
PHP

<?php
namespace App\Libraries\MySocket;
use GuzzleHttp\Client;
use App\Models\Cloudflare\AuthModel;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\CommonLibrary;
use App\Entities\Cloudflare\AuthEntity;
abstract class CloudflareSocket extends CommonLibrary
{
private static int $_request = 0;
private static int $_request_max = 1000;
private static int $_request_perpage_max = 700;
private static int $_request_timewait = 60;
private $_authModel = null;
private $_accountModel = null;
private $_client = null;
private $_auth_entity = null;
protected function __construct(AuthEntity $auth_entity)
{
parent::__construct();
$this->_auth_entity = $auth_entity;
self::$_request_max = getenv("cfmgr.request.max") ?: 1000;
self::$_request_perpage_max = getenv("cfmgr.request.perpage.max") ?: 700;
self::$_request_timewait = getenv("cfmgr.request.timewait") ?: 60;
}
abstract protected function getArrayByResult($result, array $formDatas = []): array;
final protected function getAuthModel(): AuthModel
{
if ($this->_authModel === null) {
$this->_authModel = new AuthModel();
}
return $this->_authModel;
}
final protected function getAccountModel(): AccountModel
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
}
return $this->_accountModel;
}
final protected function getClient(): Client
{
if ($this->_client === null) {
// Guzzle HTTP 클라이언트를 설정하면서 Cloudflare API 토큰 사용
$this->_client = new Client([
'base_uri' => 'https://api.cloudflare.com/client/v4/',
'headers' => [
'X-Auth-Email' => $this->_auth_entity->getID(), // 인증 토큰 사용
'X-Auth-Key' => $this->_auth_entity->getAuthKey(), // 인증 토큰 사용
'Content-Type' => 'application/json',
],
'verify' => false // SSL 인증서 검증을 비활성화
]);
}
if (self::$_request >= self::$_request_max) {
log_message('warning', sprintf("--Cloudflare API Call %s초 대기 시작--", self::$_request_timewait));
sleep(intval(self::$_request_timewait));
self::$_request = 0;
log_message('warning', sprintf("--Cloudflare API Call %s초 대기 종료--", self::$_request_timewait));
}
self::$_request++;
return $this->_client;
}
final protected function reload_procedure($uri): array
{
$page = 1; //Page는 1부터 시작해야함
$perpage_max = self::$_request_perpage_max;
$results = [];
do {
$query = [
'page' => $page,
'per_page' => $perpage_max,
'match' => 'all',
];
$cf = $this->getClient()->get($uri, $query);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Loop 제한 : 한페이지에서 가져온 갯수가 perpage_max보다 적다는것은 더이상 다음페이지기 없으므로 0로 종료시키기 위함
if (count($cf->result) < $perpage_max) {
$results = $cf->result;
$page = 0;
} else {
$results = array_merge($results, $cf->result);
$page++;
}
} while (0 < $page);
return $results;
}
}