[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Кэш парсера
linklink26
В общем вытаскиваю тех характеристики для товаров с сайта производителя курлом.
Страница грузится ~3 секунды, что скорее всего грузит сервак. Решил сделать парсер курлом в файлы. Чтобы потом открывать просто локально. Почему не в мускул? А фиг знает, подумал что в файлы быстрее, в общем вот что получается.

Я сначала собираю айдишники товаров, их всего 800 тысяч. После этого я каждый айдишник курлом подгружаю, и регулярками граблю нужные куски кода, затем fopen-ом сохраняю в файл текстовый. Скорость сохранения составляет 10 секунд 1 файл, т.е. слшком долго, мне при такой скорости нужно 800 часов для сохранения инфы. Как можно ускорить сохранение данных?
Игорь_Vasinsky
Цитата
Почему не в мускул? А фиг знает, подумал что в файлы быстрее, в общем вот что получается.


угу, только не сортировки, не подсчёта суммы если нужно, не подсчёта товара в категории, даже фильтр по товарам не сделаешь.

не магазин - а копилка HTML файлов.

Цитата
Я сначала собираю айдишники товаров, их всего 800 тысяч.

Цитата
Как можно ускорить сохранение данных?

Всё просто - нужно найти сзади у компьютера разъём дял LAN - там, не вытаскивая сетевого кабеля, нужно дуть внутрь разъёма - тем самым ускоряя потоком воздуха бинарные данные.


мульи курл вам нужен, и file_put_contents()

но т.к. идея бредовая - то пожелания удачи - бессмысленны.



_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linklink26
Игорь_Vasinsky

Специально для вас перписал сохранение в мускул.

Вышли те же 10 сек на 1 запись, видимо долго просто парсит. Там просто защита у них, я сначала вытягиваю curl-om referer (т.е. загловки затем парсю их preg_match('/Location:(.*?)\n/') а потом уже повторно вытаскиваю код существующей страницы реферера и на это похоже уходит львиная доля времени.
linklink26
Т.е.

if( $curl = curl_init() ) {
curl_setopt($curl,CURLOPT_URL,'http://site.com/product/x/'.$seria.'.aspx');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_HEADER,true);
$out = curl_exec($curl);
curl_close($curl);
}

$matches_one = array();

preg_match('/Location:(.*?)\n/', $out, $matches_one);

$referer = trim($matches_one[1]);

$ch = curl_init('http://site.com'.$referer);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$content = curl_exec($ch);
curl_close($ch);

if ($content!='') {
$sql = "INSERT INTO.........
}

Игорь_Vasinsky
Цитата
Вышли те же 10 сек на 1 запись, видимо долго просто парсит.

само собой - время на запрос и парсинг тоже уходит.

я же написал про мультикурл - там есть возможность запараллелить потоки.

https://github.com/bizonix/MultiCurl/blob/m...iCurl.class.php

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linklink26
Цитата (Игорь_Vasinsky @ 8.02.2016 - 14:30)
Цитата
Вышли те же 10 сек на 1 запись, видимо долго просто парсит.

само собой - время на запрос и парсинг тоже уходит.

я же написал про мультикурл - там есть возможность запараллелить потоки.

https://github.com/bizonix/MultiCurl/blob/m...iCurl.class.php

Я думал это опечатка и вы про мускуль)) Спасибо, покопаю мультикурл.
Игорь_Vasinsky
не, не, я до 20 потоков запускал паралельно.

получается 20 за 1 идут по времени.

тока это первый класс из гугла, у меня другой был, куда делься...хз

там прям в конструктор массив ссылок гонишь и работаешь

ну тут малость по другому - но тоже гуд

<?php
include_once '../MultiCurl.class.php';
class MyMultiCurl extends MultiCurl {
protected function onLoad($url, $content, $info) {
print "[$url] $content ";
print_r($info);
}
}

try {
$mc = new MyMultiCurl();
$mc->setMaxSessions(2); // limit 2 parallel sessions (by default 10)
$mc->setMaxSize(10240); // limit 10 Kb per session (by default 10 Mb)
$mc->addUrl('http://google.com');
$mc->addUrl('http://yahoo.com');
$mc->addUrl('http://altavista.com');
$mc->wait();
} catch (Exception $e) {
die($e->getMessage());
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linklink26
Не этот? http://artkiev.com/blog/php-curl_multi_init.htm

Ну в любом случает тенк, понятно куда копать в итоге 40 часов вместо 800 меня вполне устроит.
Игорь_Vasinsky
linklink26
оОо. спасибо. это он!

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
linklink26
Игорь_Vasinsky шикарно, надеюсь перенаправления тоже получится обойти с этой штукой)

UPD: вам спасибо =)
Игорь_Vasinsky
ну короч взаимно rolleyes.gif

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Bolik
я так понял запросы идут на один и тот же домен? если будешь использовать текущее соединение, а не каждый раз создавать новое, но выиграешь во времени в несколько раз.

и да, лучше использовать pthreads. с мультикурлом как-то непонятно все да и не многопоточность это...
Игорь_Vasinsky
Bolik
это параллельность. в PHP многопоточность хитро реализуется, и то вроде не многопоточность, а толи псевдо толи как то. не интересовался подробно.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.