Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Скрипт PHP

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
event
Отправлено: 29 Января, 2015 - 18:50:16
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Привет.
Написал скрипт - парсер, на PHP. Парсер на cuRL с многопоточностью. Скриптом доволен, но как-то долго парсит, я думал с многопоточностью будет намного скорее.

Скрипт парсера:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $start = microtime(true);
  4.  
  5.  
  6. $categoryid = $_GET['cat'];
  7.  
  8. if(empty($categoryid)) {
  9.         die("Error Category ID!");
  10. }
  11.  
  12. function get_row_count($table, $suffix = "") {
  13.         global $mysqli;
  14. if ($suffix)
  15.         $suffix = " $suffix";
  16.         ($r = $mysqli->query("SELECT COUNT(*) FROM $table$suffix"));
  17.         ($a = $r->fetch_row());
  18.                 return $a[0];
  19. }
  20.  
  21. function sqlesc($value) {
  22.         global $mysqli;
  23.    if (!is_numeric($value)) {
  24.            $value = "'" . $mysqli->real_escape_string($value) . "'";
  25.    }
  26.    return $value;
  27. }
  28.  
  29. function sqlerr($file = "", $line = "", $error = "") {
  30.                 global $USER;
  31.                
  32.         die("<b>MySQL Error:</b><br /><b>File:</b> ". $file ." <b>Line:</b> ". $line ."<br /><b>Error:</b> ". $error);
  33. }
  34.  
  35. $mysql = array(
  36.         "host" => "localhost",
  37.         "user" => "root",
  38.         "password" => "123456",
  39.         "database" => "site",
  40.         "charset" => "utf8"
  41. );
  42.  
  43. $mysqli = @ new mysqli($mysql['host'], $mysql['user'], $mysql['password'], $mysql['database']);
  44.  
  45. @ $mysqli->query("SET NAMES " . $mysql['charset']);
  46.        
  47.         die("MySQLi connect error: " . mysqli_connect_error());
  48. }
  49.  
  50. $ccc = get_row_count("links WHERE categoryid = '" . $cat . "' AND used='no'");
  51.  
  52. $catnext = $cat + 1;
  53.  
  54. if($cat > 64) {
  55.         die("END!");
  56. }
  57.  
  58. if($ccc == 0) {
  59.         echo '<meta http-equiv="refresh" content="0;URL=3.php?cat=' . $catnext . '" />';
  60.         die;
  61. }
  62.  
  63. $result = $mysqli->query("SELECT * FROM links WHERE used = 'no' AND categoryid = '" . $categoryid . "' LIMIT 5") or sqlerr(__FILE__, __LINE__, $mysqli->error);
  64.  
  65.  
  66. $urls = array();
  67.    while($row = $result->fetch_assoc()) {
  68.         $urls[] = $row['link'];
  69. }
  70.  
  71.  
  72. $multi = curl_multi_init();
  73. $channels = array();
  74.  
  75. foreach ($urls as $url) {
  76.         $url = "http://URL_SITE" . $url;
  77.     $ch = curl_init();
  78.     curl_setopt($ch, CURLOPT_URL, $url);
  79.     curl_setopt($ch, CURLOPT_HEADER, false);
  80.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  81.     curl_multi_add_handle($multi, $ch);
  82.  
  83.     $channels[$url] = $ch;
  84. }
  85.  
  86. $active = null;
  87. do {
  88.     $mrc = curl_multi_exec($multi, $active);
  89. } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  90.  
  91. while ($active && $mrc == CURLM_OK) {
  92.     if (curl_multi_select($multi) == -1) {
  93.         continue;
  94.     }
  95.  
  96.     do {
  97.         $mrc = curl_multi_exec($multi, $active);
  98.     } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  99. }
  100.  
  101. foreach ($channels as $value => $channel ) {   
  102.  
  103. $site = curl_multi_getcontent($channel);
  104.  
  105. preg_match('#<h1>(.+?)</h1>#i', $site, $name);
  106.  
  107. $name = strip_tags($name[1]);
  108.  
  109. $name =iconv("WINDOWS-1251","UTF-8", $name);
  110.  
  111. preg_match("#</noindex>\s+</td></tr></table>(.*?)</center><hr>#si", $site, $tmp);
  112.      
  113. $result = preg_replace('#<noindex.*?</noindex>|<script.*?</script>|<ins.*?</ins>|<!--.*?-->#si', '', $tmp[1]);
  114.      
  115. $text = trim($result);
  116. $text = str_replace("<p>&nbsp;</p>", "", $text);
  117. $text = str_replace("<p>&nbsp;</p>", "", $text);
  118. $text = str_replace("<br>", "", $text);
  119. $text = str_replace("<center>", "", $text);
  120.  
  121. $text = iconv("WINDOWS-1251","UTF-8", $text);
  122.  
  123. preg_match_all('#<img.*src="(.*)".*>#isU', $text, $urlsex);
  124.  
  125. foreach($urlsex[1] as $val) {
  126.         $urlsex_end .= $val . "\n";
  127. }
  128.  
  129. $value = str_replace("http://URL_SITE", "", $value);
  130.  
  131. $value = trim($value);
  132.  
  133. $result = $mysqli->query("INSERT INTO texts (name, text, image_urls, categoryid, link) VALUES (" . implode(", ", array_map("sqlesc", array($name, trim($text), trim($urlsex_end), $cat, $value))) . ")") or sqlerr(__FILE__, __LINE__, $mysqli->error);
  134.  
  135. $mysqli->query("UPDATE links SET used = 'yes' WHERE link = " . sqlesc($value)) or sqlerr(__FILE__, __LINE__, $mysqli->error);
  136.  
  137. curl_multi_remove_handle($multi, $channel);
  138.  
  139. }
  140.  
  141.  
  142. $a = get_row_count("links");
  143. $b = get_row_count("texts");
  144.  
  145. $number1 = $a;
  146. $number2 = $b;
  147. $result = ($number2 / $number1) * 100;
  148.  
  149. echo "Обработано: " . $b . " / " . $a . " (" . round($result) . "%).";
  150.  
  151. echo '<br /><br />Время выполнения скрипта: '.(microtime(true) - $start).' сек.';
  152.  
  153. ?>
  154.  
  155.  
  156. <meta http-equiv="refresh" content="0;URL=3.php?cat=<?=$cat;?>" />
  157.  


Подскажите, как можно ускорить работу? Может у меня есть где-то ошибка?

На выполнение одного раза выполнения скрипта (это парсинг 5 статей) уходит 5 секунд. Это нормально?

Прошлый парсер у меня был тоже на курл, но без многопоточности, и парсил 1 запись /2 сек.

В чем моя ошибка?
 
 Top
event
Отправлено: 29 Января, 2015 - 22:52:49
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Ну что никто не подкажет? Радость
 
 Top
KingStar
Отправлено: 29 Января, 2015 - 23:01:12
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




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


-----
То что программа работает, не означает что она написана правильно!
 
 Top
event
Отправлено: 29 Января, 2015 - 23:56:56
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




короче потестирова скрипт, всю малину портит что юзаю бд очень много.
(Добавление)
KingStar, точно не так, ответ очень-очень быстрый
(Добавление)
Все, сделал. Теперь работает как самолет. Хорошо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB