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
Форумы портала PHP.SU :: Версия для печати :: Парсинг более 30 тысяч страниц.
Форумы портала PHP.SU » » Работа с сетью » Парсинг более 30 тысяч страниц.

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

1. DeMonyan - 07 Марта, 2015 - 18:11:49 - перейти к сообщению
Есть скрипт который формирует задание для парсинга. и записывает его в БД. После окончания своей работы он через сокеты запускает 4 экземпляра парсера, ПОСТом передав с какой записи в базе необходимо начать парсинг.

Парсер выбирает 30 записей в базе и их обрабатывает, по завершению опять же через сокет запускает себя снова увеличив параметр на 120.

Вот процедура для запуска скрипта и отправки ему ПОСТом данных:
CODE (htmlphp):
скопировать код в буфер обмена
  1. function exec_script($url, $params = array())
  2. {
  3.     $parts = parse_url($url);
  4.  
  5.     if (!$fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80))
  6.     {
  7.         return false;
  8.     }
  9.  
  10.     $data = http_build_query($params, '', '&');
  11.  
  12.     fwrite($fp, "POST " . (!empty($parts['path']) ? $parts['path'] : '/') . " HTTP/1.1\r\n");
  13.     fwrite($fp, "Host: " . $parts['host'] . "\r\n");
  14.     fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
  15.     fwrite($fp, "Content-Length: " . strlen($data) . "\r\n");
  16.     fwrite($fp, "Connection: Close\r\n\r\n");
  17.     fwrite($fp, $data);
  18.     fclose($fp);
  19.  
  20.     return true;
  21. }
  22.  


Вот по такому условию происходит запуск после парсинга очередной порции:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $limit=$limit+30; //значение из массива пост увеличиваем на 30
  3. $query="Select * FROM parcers where script='trade' LIMIT $limit,30";
  4. $result=ExecuteQuery($query);
  5. if (mysql_num_rows($result)<=0) {
  6.         $qt="INSERT INTO parcers_logs SET script='parcer_trade', data='".$realm."_just_finish'";
  7.         ExecuteQuery($qt);
  8. }
  9. else {
  10.         $limit=$limit+90;
  11.         $query="Select * FROM parcers where script='trade' LIMIT $limit,30";
  12.         $result=ExecuteQuery($query);
  13.         if (mysql_num_rows($result)>0) {
  14.                 $url='http://'.$_SERVER['HTTP_HOST'].'/parcers/parcer_trade.php';
  15.                 $params['limit'] = $limit;
  16.                 exec_script($url, $params);
  17.         }
  18. }
  19.  


Запускаю скрипт формирующий ссылки, всё хорошо, он заканчивает нормально работу, и вроде даже запускает 4 экземпляра парсера. Но ни разу парсинг не дошёл до конца. Останавливается совершенно разных местах, причину понять не могу.

Собственно зачем таки грабли? На хостинге ограничение на выполнение скрипта минута. Изменить её в настройках нельзя, в скрипте задать нельзя. Потому приходится делить на части парсинг и запускать рекурсивно.

Подскажите, может есть вариант решения попроще, или в чём причина обрыва выполнения скрипта может быть?
2. zloy dyx - 07 Марта, 2015 - 21:08:13 - перейти к сообщению
хост скрипт который сильно грузит систему отрубать может. неуже взять вдс и настроить самому так тяжело? (гугли вдс разминка, 60 рублей месяц 225 озу)
3. DeMonyan - 08 Марта, 2015 - 13:26:23 - перейти к сообщению
Русские не ищут лёгких путей!
Решил проблему мониторингом выполнения предыдущего шага, и плевать я хотел что у хостера там ошибки сыпятся при этом и что-то нагружается. Главное моя задача выполняется правильно, пусть и немного дольше.

 

Powered by ExBB FM 1.0 RC1