linklink26
8.02.2016 - 17:57
В общем вытаскиваю тех характеристики для товаров с сайта производителя курлом.
Страница грузится ~3 секунды, что скорее всего грузит сервак. Решил сделать парсер курлом в файлы. Чтобы потом открывать просто локально. Почему не в мускул? А фиг знает, подумал что в файлы быстрее, в общем вот что получается.
Я сначала собираю айдишники товаров, их всего 800 тысяч. После этого я каждый айдишник курлом подгружаю, и регулярками граблю нужные куски кода, затем fopen-ом сохраняю в файл текстовый. Скорость сохранения составляет 10 секунд 1 файл, т.е. слшком долго, мне при такой скорости нужно 800 часов для сохранения инфы. Как можно ускорить сохранение данных?
Игорь_Vasinsky
8.02.2016 - 18:21
Цитата |
Почему не в мускул? А фиг знает, подумал что в файлы быстрее, в общем вот что получается. |
угу, только не сортировки, не подсчёта суммы если нужно, не подсчёта товара в категории, даже фильтр по товарам не сделаешь.
не магазин - а копилка 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
8.02.2016 - 18:24
Игорь_Vasinsky
Специально для вас перписал сохранение в мускул.
Вышли те же 10 сек на 1 запись, видимо долго просто парсит. Там просто защита у них, я сначала вытягиваю curl-om referer (т.е. загловки затем парсю их preg_match('/Location:(.*?)\n/') а потом уже повторно вытаскиваю код существующей страницы реферера и на это похоже уходит львиная доля времени.
linklink26
8.02.2016 - 18:27
Т.е.
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
8.02.2016 - 18:30
Цитата |
Вышли те же 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
8.02.2016 - 18:30
Я думал это опечатка и вы про мускуль)) Спасибо, покопаю мультикурл.
Игорь_Vasinsky
8.02.2016 - 18:33
не, не, я до 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);
$mc->setMaxSize(10240);
$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
8.02.2016 - 18:35
Не этот?
http://artkiev.com/blog/php-curl_multi_init.htmНу в любом случает тенк, понятно куда копать в итоге 40 часов вместо 800 меня вполне устроит.
Игорь_Vasinsky
8.02.2016 - 18:36
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
8.02.2016 - 18:37
Игорь_Vasinsky шикарно, надеюсь перенаправления тоже получится обойти с этой штукой)
UPD: вам спасибо =)
Игорь_Vasinsky
8.02.2016 - 18:37
ну короч взаимно
_____________
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
я так понял запросы идут на один и тот же домен? если будешь использовать текущее соединение, а не каждый раз создавать новое, но выиграешь во времени в несколько раз.
и да, лучше использовать pthreads. с мультикурлом как-то непонятно все да и не многопоточность это...
Игорь_Vasinsky
8.02.2016 - 22:43
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
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.