2015-12-22 6 views
3

Мне нужно получить несколько параметров пользователя с сайта. Я могу это сделать, потому что каждый пользователь имеет уникальный идентификатор и я могу искать пользователей по адресу:PHP - самый быстрый способ получить контент на другом сайте и проанализировать этот контент

http://page.com/search_user.php?uid=X

Так что я добавил этот URL в течение() петли и я попытался 500 результатов:

<?php 

$start = time(); 
$results = array(); 

for($i=0; $i<= 500; $i++) 
{ 
    $c = curl_init(); 
    curl_setopt($c, CURLOPT_URL, 'http://page.com/search_user.php?uid='.$i); 
    curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 desktopsmiley_2_2_5643778701369665_44_71 DS_gamingharbor Firefox/3.5.2 (.NET CLR 3.5.30729)'); 
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
    $p = curl_exec($c); 
    curl_close($c); 

    if (preg_match('"<span class=\"uname\">(.*?)</span>"si', $p, $matches)) 
    { 
     $username = $matches[1]; 
    } 
    else 
    { 
     continue; 
    } 

    preg_match('"<table cellspacing=\"0\">(.*?)</table>"si', $p, $matches); 
    $comments = $matches[1]; 

    preg_match('"<tr class=\"pos\">(.*?)</tr>"si', $comments, $matches_pos); 
    preg_match_all('"<td>([0-9]+)</td>"si', $matches_pos[1], $matches); 
    $comments_pos = $matches[1][2]; 

    preg_match('"<tr class=\"neu\">(.*?)</tr>"si', $comments, $matches_neu); 
    preg_match_all('"<td>([0-9]+)</td>"si', $matches_neu[1], $matches); 
    $comments_neu = $matches[1][2]; 

    preg_match('"<tr class=\"neg\">(.*?)</tr>"si', $comments, $matches_neg); 
    preg_match_all('"<td>([0-9]+)</td>"si', $matches_neg[1], $matches); 
    $comments_neg = $matches[1][2]; 

    $comments_all = $comments_pos+$comments_neu+$comments_neg; 

    $about_me = 0; 
    if (preg_match('"<span>O mnie</span>"si', $p)) 
    { 
     $about_me = 1; 
    } 

    $results[] = array('comments' => $comments_all, 'about_me' => $about_me, 'username' => $username); 
} 

echo 'Generated in: <b>'.(time()-$start).'</b> seconds.<br><br>'; 
var_dump($results); 
?> 

Наконец я получил результаты: - все было сгенерирована за 135 секунд.

Затем я заменил curl на file_get_contents(), и я получил: 155 секунд.

Быстрее, чтобы получить этот результат, чем завиток ?? Я должен получить 20.000.000 результатов с другой страницы, и 135 секунд для меня слишком много.

Спасибо.

+0

Это ежедневное явление или это только один раз? – Cups

+0

Один. Наконец, я хотел бы начать этот скрипт с помощью CRON и получить все результаты (20.000.000) во временных частях (1 секунда для 500 результатов). – NewbieUser

ответ

2

Если вам действительно нужно запрашивать разные URL-адреса 500 раз, возможно, вам стоит рассмотреть асинхронный подход. Проблема выше заключается в том, что самой медленной частью (узким местом) являются сами запросы на завивание. Пока вы ожидаете ответа, ваш код ничего не делает.

Постарайтесь взглянуть на PHP asynchronous cURL with callback (т. Е. Вы будете делать 500 запросов «почти сразу» и обрабатывать ответы по мере их поступления - асинхронно).

+0

https://gist.github.com/Xeoncross/2362936#file-example -php - это он? – NewbieUser

+0

Итак, я должен создать массив с 500 URL-адресами, а затем в функции обратного вызова создать preg_match'es на основе ответа от этого обратного вызова? – NewbieUser

+0

@NewbieUser Извините, у меня нет времени на то, чтобы написать полное решение для вас, я просто хочу указать, что наиболее перспективным способом является анализ или обработка выбранного URL-адреса в некотором обратном вызове асинхронно, так что выполнение не похоже: выборка, ожидание, ответ, анализ/процесс, выборка другого, ожидание ... но что-то вроде fetch1, fetch2, fetch3, response1, parse1, fetch4, response2 и т. д. – LihO

0

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

debugging long running PHP script

В вашем случае я бы сказал, что вы будете следовать той же идее, но вы бы дальше кусок запросов на группы по 500, говорите.

 Смежные вопросы

  • Нет связанных вопросов^_^