From 5e0f59f8c54c434c7772056000d6520435bef949 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Aug 2024 09:34:16 +0300 Subject: [PATCH] =?UTF-8?q?Curl=20=D1=81=D1=82=D0=B0=D0=BB=20=D0=BE=D1=81?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9,=20=D0=B0=20=D1=82=D0=B0=D0=BA?= =?UTF-8?q?=D0=B6=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20=D0=B1?= =?UTF-8?q?=D0=B4=20=D1=81=D1=82=D0=B0=D0=BB=D0=B8=20=D0=B8=D0=BD=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B2=20=D0=BB=D0=BE=D0=B3=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/library/Database.php | 18 ++++++---- app/library/DatabaseConfig.php | 5 +++ curl-helper.php | 62 +++++++++++++++++++++++++++++----- 3 files changed, 70 insertions(+), 15 deletions(-) diff --git a/app/library/Database.php b/app/library/Database.php index ceaae08..6a20415 100644 --- a/app/library/Database.php +++ b/app/library/Database.php @@ -10,28 +10,32 @@ class Database { private PDO $pdo; private static $logFile = 'database.log'; + private DatabaseConfig $config; public function __construct(DatabaseConfig $config) { + $this->config = $config; try { - $dsn = $config->getDsn(); - $username = $config->getUsername(); - $password = $config->getPassword(); + $dsn = $this->config->getDsn(); + $username = $this->config->getUsername(); + $password = $this->config->getPassword(); $this->pdo = new PDO( $dsn, $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); - Logger::log(self::$logFile, "Подключение успешно!"); + $message = "Подключение к ". $this->config->getDBName() ." успешно!"; + Logger::log(self::$logFile, $message); } catch (PDOException $e) { - $message = "Ошибка подключения:" . $e->getMessage(); + $message = "Ошибка подключения к ". $this->config->getDBName() .": " . $e->getMessage(); Logger::log(self::$logFile, $message); } } public function __destruct() { - Logger::log(self::$logFile, "Подключение прервано!"); + $message = "Подключение к ". $this->config->getDBName() ." прервано!"; + Logger::log(self::$logFile, $message); } public function selectQuery(string $sql, array $params = []) : array @@ -45,7 +49,7 @@ class Database $stmt->execute(); $array = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { - $message = "Ошибка запроса:" . $e->getMessage(); + $message = "Ошибка запроса: " . $e->getMessage(); Logger::log(self::$logFile, $message); } finally { return $array; diff --git a/app/library/DatabaseConfig.php b/app/library/DatabaseConfig.php index b91b77f..ccceed1 100644 --- a/app/library/DatabaseConfig.php +++ b/app/library/DatabaseConfig.php @@ -29,6 +29,11 @@ class DatabaseConfig $this->password = $config['DB_PASSWORD']; } + public function getDBName(): string + { + return $this->dbname; + } + public function getDsn() : string { return $this->driver.":host=".$this->host diff --git a/curl-helper.php b/curl-helper.php index a0ad887..850d436 100644 --- a/curl-helper.php +++ b/curl-helper.php @@ -8,26 +8,64 @@ use Symfony\Component\Yaml\Yaml; require_once(dirname(__FILE__) ."/vendor/autoload.php"); -$pathLogErrorHttp = __DIR__.'/../log/'. date('Y-m-d') . '/error-http-curl.log'; -$pathLogErrorHtml = __DIR__.'/../log/'. date('Y-m-d') . '/error-html.log'; -$ +function curl_redir_exec($ch) +{ + static $curl_loops = 0; + static $curl_max_loops = 20; + if ($curl_loops++ >= $curl_max_loops) { + $curl_loops = 0; + return false; + } + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $data = curl_exec($ch); + list($header, $data) = explode("\n\n", $data, 2); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if ($http_code == 301 || $http_code == 302) { + $matches = []; + preg_match('/Location:(.*?)\n/', $header, $matches); + $url = @parse_url(trim(array_pop($matches))); + if (!$url) { + //couldn't process the url to redirect to + $curl_loops = 0; + return $data; + } + $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); + if (!$url['scheme']) + $url['scheme'] = $last_url['scheme']; + if (!$url['host']) + $url['host'] = $last_url['host']; + if (!$url['path']) + $url['path'] = $last_url['path']; + $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:''); + curl_setopt($ch, CURLOPT_URL, $new_url); + // debug('Redirecting to', $new_url); + return curl_redir_exec($ch); + } else { + $curl_loops=0; + return $data; + } +} + +$pathLogErrorHttp = __DIR__.'/log/'. date('Y-m-d') . '/error-http-curl.log'; +$pathLogErrorHtml = __DIR__.'/log/'. date('Y-m-d') . '/error-html.log'; + // $sites = ContingentManager::getInstance()->getExceptionsHttpCurl('select-http-error.log'); // print_r($sites); $dbOpendata = new Database(new DatabaseConfig('opendata')); $dbNiimko = new Database(new DatabaseConfig('niimko')); -var_dump($dbOpendata); // $sites = ContingentManager::getInstance()->getSites($dbNiimko); $specializations = ContingentManager::getInstance()->getSpecializations($dbNiimko); $orgs = ContingentManager::getInstance()->getOrgs($dbOpendata); $sites = Yaml::parse(file_get_contents(dirname(__FILE__) ."/sites.yaml")); -print_r($sites); - +// $sites = ContingentManager::getInstance()->getExceptionsHttpCurl('log/2024-08-27/error-http-curl.log'); +// print_r($sites); for ($i = 0; $i < count($sites); $i++) { // Нет URL сайта вуза if (empty($sites[$i]['site'])) { // $message = implode(' ', $sites[$i]); - // Logger::log($pathLogErrorHttp, $message); + Logger::log($pathLogErrorHttp, $message); // Logger::log($pathErrorHttp, implode(' ', $sites[$i])); continue; } @@ -57,9 +95,17 @@ for ($i = 0; $i < count($sites); $i++) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 YaBrowser/24.6.0.0 Safari/537.36'); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $html = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - if ($httpCode != 200) { + if ($httpCode != 200 && $httpCode != 0) { + $message = implode(' ', $sites[$i]) . ' ' . $httpCode; + Logger::log($pathLogErrorHttp, $message); + unset($httpCode); + continue; + } else if ($httpCode == 0) { $errno = curl_errno($ch); $message = implode(' ', $sites[$i]); $message .= " cURL error ({$errno}): ".curl_strerror($errno);