From 3e3b7ee2ef35aad7f79bc87fffd9b9d6e5418d47 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 30 Jul 2023 19:09:41 +0300 Subject: [PATCH] optimize snaps, delete unused constructions --- config/app.php.txt | 8 +-- crontab/crawler.php | 162 ++++++++++++++++++++++---------------------- database/yggo.mwb | Bin 22446 -> 22273 bytes library/mysql.php | 31 +-------- 4 files changed, 87 insertions(+), 114 deletions(-) diff --git a/config/app.php.txt b/config/app.php.txt index 7376e52..3e56d50 100644 --- a/config/app.php.txt +++ b/config/app.php.txt @@ -97,10 +97,10 @@ define('SNAP_STORAGE', json_encode((object) 'directory' => __DIR__ . '/../storage/snap/hp/', 'quota' => [ 'mime' => false, - 'size' => 10000000024, + 'size' => 10000000024, // @TODO 'request' => [ 'download' => [ - 'size' => 10000024, + 'size' => 10000024, // @TODO 'seconds' => 60*60 ] ] @@ -119,10 +119,10 @@ define('SNAP_STORAGE', json_encode((object) 'passive' => true, 'quota' => [ 'mime' => 'text/html,application/xhtml+xml,text/plain,image/webp,image/png,image/gif,image/jpeg,image/ico', - 'size' => 10000000024, + 'size' => 10000000024, // @TODO 'request' => [ 'download' => [ - 'size' => 10000024, + 'size' => 10000024, // @TODO 'seconds' => 60*60 ] ] diff --git a/crontab/crawler.php b/crontab/crawler.php index c0370a0..615a9cc 100644 --- a/crontab/crawler.php +++ b/crontab/crawler.php @@ -656,133 +656,131 @@ foreach ($db->getHostPageCrawlQueue(CRAWL_PAGE_LIMIT, time() - CRAWL_PAGE_SECOND // Begin snaps if (SNAP_STORAGE) { - $crc32data = crc32($content); + $hostPageSnapTimeAdded = time(); + $hostPageSnapPath = chunk_split($queueHostPage->hostPageId, 1, '/'); - $snapTime = time(); - $snapPath = chunk_split($queueHostPage->hostPageId, 1, '/'); + $hostPageSnapFilenameTmp = __DIR__ . '/../storage/tmp/snap/hp/' . $hostPageSnapPath . $hostPageSnapTimeAdded . '.zip'; + @mkdir(__DIR__ . '/../storage/tmp/snap/hp/' . $hostPageSnapPath, 0755, true); - $snapTmp = __DIR__ . '/../storage/tmp/snap/hp/' . $snapPath . $snapTime . '.zip'; - @mkdir(__DIR__ . '/../storage/tmp/snap/hp/' . $snapPath, 0755, true); + // Create new ZIP container + $zip = new ZipArchive(); - // Create not duplicated data snaps only, even newer by time added - if ($hostPageSnap = $db->findHostPageSnap($queueHostPage->hostPageId, $crc32data)) { + if (true === $zip->open($hostPageSnapFilenameTmp, ZipArchive::CREATE)) { - $hostPageSnapId = $hostPageSnap->hostPageSnapId; + // Insert compressed snap data into the tmp storage + if (true === $zip->addFromString('DATA', $content) && + true === $zip->addFromString('META', sprintf('TIMESTAMP: %s', $hostPageSnapTimeAdded) . PHP_EOL . + sprintf('MIME: %s', Filter::mime($contentType)) . PHP_EOL . + sprintf('SOURCE: %s', Filter::url(WEBSITE_DOMAIN . '/explore.php?hp=' . $queueHostPage->hostPageId)) . PHP_EOL . + sprintf('TARGET: %s', Filter::url($queueHostPage->hostPageURL)))) { - } else { + // Done + $zip->close(); - // Create new ZIP container - $zip = new ZipArchive(); + // Temporarily snap file exists + if (file_exists($hostPageSnapFilenameTmp)) { - if (true === $zip->open($snapTmp, ZipArchive::CREATE)) { + // Register snap in DB + if ($hostPageSnapId = $db->addHostPageSnap($queueHostPage->hostPageId, $hostPageSnapTimeAdded)) { - // Insert compressed snap data into the tmp storage - if (true === $zip->addFromString('DATA', $content) && - true === $zip->addFromString('META', sprintf('TIMESTAMP: %s', $snapTime) . PHP_EOL . - sprintf('CRC32: %s', $crc32data . PHP_EOL . - sprintf('MIME: %s', Filter::mime($contentType)) . PHP_EOL . - sprintf('SOURCE: %s', Filter::url(WEBSITE_DOMAIN . '/explore.php?hp=' . $queueHostPage->hostPageId)) . PHP_EOL . - sprintf('TARGET: %s', Filter::url($queueHostPage->hostPageURL))))) { + // Default storage success + $snapFilesExists = false; - // Done - $zip->close(); + // Copy files to each storage + foreach (json_decode(SNAP_STORAGE) as $name => $storages) { - // Temporarily snap file exists - if (file_exists($snapTmp)) { + foreach ($storages as $i => $storage) { - // Register snap in DB - if ($hostPageSnapId = $db->addHostPageSnap($queueHostPage->hostPageId, $crc32data, filesize($snapTmp), $snapTime)) { + // Generate storage id + $crc32name = crc32(sprintf('%s.%s', $name, $i)); - $hostPagesSnapAdded++; - } - } - } - } - } + switch ($name) { - // Copy files to each storage - foreach (json_decode(SNAP_STORAGE) as $name => $storages) { + case 'localhost': - foreach ($storages as $i => $storage) { + // Validate mime + if (!$storage->quota->mime) continue 2; - // Generate storage id - $crc32name = crc32(sprintf('%s.%s', $name, $i)); + $snapMimeValid = false; + foreach ((array) explode(',', $storage->quota->mime) as $mime) { - switch ($name) { + if (false !== stripos(Filter::mime($contentType), Filter::mime($mime))) { - case 'localhost': + $snapMimeValid = true; + break; + } + } - // Validate size quota - if ($db->getTotalHostPageSnapSizeByStorage($hostPageSnapId, $crc32name) >= $storage->quota->size) continue 2; + if (!$snapMimeValid) continue 2; - // Validate mime - if (!$storage->quota->mime) continue 2; + // Copy tmp snap file to the permanent storage + @mkdir($storage->directory . $hostPageSnapPath, 0755, true); - $snapMimeValid = false; - foreach ((array) explode(',', $storage->quota->mime) as $mime) { + if (copy($hostPageSnapFilenameTmp, $storage->directory . $hostPageSnapPath . $hostPageSnapTimeAdded . '.zip')) { - if (false !== stripos(Filter::mime($contentType), Filter::mime($mime))) { + // Register storage name + $db->addHostPageSnapStorage($hostPageSnapId, $crc32name, time()); - $snapMimeValid = true; - break; - } - } + $snapFilesExists = true; + } - if (!$snapMimeValid) continue 2; + break; + case 'ftp': - // Copy tmp snap file to the permanent storage - @mkdir($storage->directory . $snapPath, 0755, true); + // Validate mime + if (!$storage->quota->mime) continue 2; - if (copy($snapTmp, $storage->directory . $snapPath . $snapTime . '.zip')) { + $snapMimeValid = false; + foreach ((array) explode(',', $storage->quota->mime) as $mime) { - // Register storage name - $db->addHostPageSnapStorage($hostPageSnapId, $crc32name, time()); - } + if (false !== stripos(Filter::mime($contentType), Filter::mime($mime))) { - break; - case 'ftp': + $snapMimeValid = true; + break; + } + } - // Validate size quota - if ($db->getTotalHostPageSnapSizeByStorage($hostPageSnapId, $crc32name) >= $storage->quota->size) continue 2; + if (!$snapMimeValid) continue 2; - // Validate mime - if (!$storage->quota->mime) continue 2; + // Copy tmp snap file to the permanent storage + $ftp = new Ftp(); - $snapMimeValid = false; - foreach ((array) explode(',', $storage->quota->mime) as $mime) { + if ($ftp->connect($storage->host, $storage->port, $storage->username, $storage->password, $storage->directory, $storage->timeout, $storage->passive)) { - if (false !== stripos(Filter::mime($contentType), Filter::mime($mime))) { + $ftp->mkdir('hp/' . $hostPageSnapPath, true); - $snapMimeValid = true; - break; - } - } + if ($ftp->copy($hostPageSnapFilenameTmp, 'hp/' . $hostPageSnapPath . $hostPageSnapTimeAdded . '.zip')) { - if (!$snapMimeValid) continue 2; + // Register storage name + $db->addHostPageSnapStorage($hostPageSnapId, $crc32name, time()); - // Copy tmp snap file to the permanent storage - $ftp = new Ftp(); + $snapFilesExists = true; + } - if ($ftp->connect($storage->host, $storage->port, $storage->username, $storage->password, $storage->directory, $storage->timeout, $storage->passive)) { + $ftp->close(); + } - $ftp->mkdir('hp/' . $snapPath, true); + break; + } + } + } - if ($ftp->copy($snapTmp, 'hp/' . $snapPath . $snapTime . '.zip')) { + // At least one file have been stored + if ($snapFilesExists) { - // Register storage name - $db->addHostPageSnapStorage($hostPageSnapId, $crc32name, time()); - } + $hostPagesSnapAdded++; - $ftp->close(); - } + } else { - break; + $db->deleteHostPageSnap($hostPageSnapId); + } + } } } } // Delete tmp snap - unlink($snapTmp); + unlink($hostPageSnapFilenameTmp); } // Skip page links following with meta robots:nofollow attribute diff --git a/database/yggo.mwb b/database/yggo.mwb index 60b72b1327bda31fe3e365b19b0e639c0aa09fb8..4a90b91fa2da474567171f9a40ec6ab7e63b1047 100644 GIT binary patch delta 18894 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 delta 19001 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 mKj;(PGy1Ya|~4 diff --git a/library/mysql.php b/library/mysql.php index 2a0a20d..ef39df1 100644 --- a/library/mysql.php +++ b/library/mysql.php @@ -483,14 +483,11 @@ class MySQL { return $query->fetchAll(); } - public function addHostPageSnap(int $hostPageId, string $crc32data, int $size, int $timeAdded) { + public function addHostPageSnap(int $hostPageId, int $timeAdded) { - $query = $this->_db->prepare('INSERT INTO `hostPageSnap` (`hostPageId`, - `crc32data`, - `size`, - `timeAdded`) VALUES (?, ?, ?, ?)'); + $query = $this->_db->prepare('INSERT INTO `hostPageSnap` (`hostPageId`, `timeAdded`) VALUES (?, ?)'); - $query->execute([$hostPageId, $crc32data, $size, $timeAdded]); + $query->execute([$hostPageId, $timeAdded]); return $this->_db->lastInsertId(); } @@ -522,19 +519,6 @@ class MySQL { return $query->fetchAll(); } - public function getTotalHostPageSnapSizeByStorage(int $hostPageId, int $crc32name) { - - $query = $this->_db->prepare('SELECT SUM(`hostPageSnap`.`size`) AS `total` FROM `hostPageSnap` - JOIN `hostPageSnapStorage` ON (`hostPageSnapStorage`.`hostPageSnapId` = `hostPageSnap`.`hostPageSnapId`) - - WHERE `hostPageSnap`.`hostPageSnapId` = ? - AND `hostPageSnapStorage`.`crc32name` = ?'); - - $query->execute([$hostPageId, $crc32name]); - - return $query->fetch()->total; - } - public function getHostPageSnap(int $hostPageSnapId) { $query = $this->_db->prepare('SELECT * FROM `hostPageSnap` WHERE `hostPageSnapId` = ? LIMIT 1'); @@ -544,15 +528,6 @@ class MySQL { return $query->fetch(); } - public function findHostPageSnap(int $hostPageId, int $crc32data) { - - $query = $this->_db->prepare('SELECT * FROM `hostPageSnap` WHERE `hostPageId` = ? AND `crc32data` = ? LIMIT 1'); - - $query->execute([$hostPageId, $crc32data]); - - return $query->fetch(); - } - public function addHostPageSnapDownload(int $hostPageSnapStorageId, string $crc32ip, int $timeAdded) { $query = $this->_db->prepare('INSERT INTO `hostPageSnapDownload` (`hostPageSnapStorageId`,