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.SU

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


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

> Описание: ускорить парсер валют
annd
Отправлено: 15 Февраля, 2013 - 11:57:01
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Февр. 2013  


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




Здравствуйте!

Есть код парсера отдельных валют с национального банка РБ.

PHP:
скопировать код в буфер обмена
  1.  
  2. // Евро
  3.         $epatern='/1 евро<td>([^(,*)<\/td>$]+)/';
  4.         if(preg_match($epatern, file_get_contents('http://www.nbrb.by/statistics/Rates/RatesDaily.asp'), $matches))
  5.                 {
  6.          $eur = $matches[1];
  7.     }
  8.  
  9. // Доллар
  10.         $dpatern='/1 доллар США<td>([^(,*)<\/td>$]+)/';
  11.         if(preg_match($dpatern, file_get_contents('http://www.nbrb.by/statistics/Rates/RatesDaily.asp'), $matches))
  12.                 {
  13.          $doll = $matches[1];
  14.     }
  15.  
  16. // 1 российский рубль
  17. $rpatern='/1 российский рубль<td>([^(,*)<\/td>$]+)/';
  18.         if(preg_match($rpatern, file_get_contents('http://www.nbrb.by/statistics/Rates/RatesDaily.asp'), $matches))
  19.                 {
  20.          $rubl = $matches[1];
  21.     }
  22.  
  23. echo "$eur, $doll, $rubl ";
  24.  
  25.  


Код, в принципе, рабочий и эти валюты потом выводятся на главной странице сайта. Но загружается главная стр. из-за этого медленнее на 8-10сек.

Может, если все паттерны поместить в массив и обрабатывать в цикле, то все немного ускорится?

Посоветуйте пожалуйста, как лучше и грамотнее это сделать?
 
 Top
Мелкий Супермодератор
Отправлено: 15 Февраля, 2013 - 12:01:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Запрашивайте для начала страницу только один раз, а не три.
Во-вторых, сделайте кэширование значений. Не ежесекундно же обновляются валюты.


-----
PostgreSQL DBA
 
 Top
annd
Отправлено: 15 Февраля, 2013 - 13:45:49
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Февр. 2013  


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




Мелкий пишет:
Запрашивайте для начала страницу только один раз, а не три.
Во-вторых, сделайте кэширование значений. Не ежесекундно же обновляются валюты.

Не совсем все понимаю, извините.

Один раз - это как-то с помощью сессий?..
 
 Top
Zuldek
Отправлено: 15 Февраля, 2013 - 13:50:40
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




это значит один раз делать file_get_contents('http://www.nbrb.by/statistics/Rates/RatesDaily.asp') в вашем скрипте, а далее использовать уже полученную страницу.
 
 Top
annd
Отправлено: 15 Февраля, 2013 - 14:17:04
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Февр. 2013  


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




Zuldek пишет:
это значит один раз делать file_get_contents('http://www.nbrb.by/statistics/Rates/RatesDaily.asp') в вашем скрипте, а далее использовать уже полученную страницу.


Как-то вот так?

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $url = 'http://www.nbrb.by/statistics/Rates/RatesDaily.asp';
  4. $val = file_get_contents($url);
  5.  
  6. // Евро
  7.         $spatern='/1 евро<td>([^(,*)<\/td>$]+)/';
  8.         if(preg_match($spatern, $val, $matches))
  9.                 {
  10.         $eur = $matches[1];
  11.     }
  12. // Доллар
  13.         $patern='/1 доллар США<td>([^(,*)<\/td>$]+)/';
  14.         if(preg_match($patern, $val, $matches)){
  15.         $doll = $matches[1];
  16.     }
  17. // 1 российский рубль
  18. $patern='/1 российский рубль<td>([^(,*)<\/td>$]+)/';
  19.         if(preg_match($patern, $val, $matches))
  20.                 {
  21.          $rubl = $matches[1];
  22.     }
  23.  
  24. echo "$eur, $doll, $rubl ";
  25. ?>
  26.  
 
 Top
Zuldek
Отправлено: 15 Февраля, 2013 - 14:30:05
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




Да. Тем не менее на лету запрашивать страницу каждый раз - не правильно. Как и советовали выше, - используйте кеширование.
 
 Top
annd
Отправлено: 15 Февраля, 2013 - 15:09:37
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Февр. 2013  


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




Zuldek пишет:
...- используйте кеширование.


Спасибо.
Что касается кэширования, то здесь смотреть в сторону функции ob_start(); ?
 
 Top
annd
Отправлено: 18 Февраля, 2013 - 07:51:49
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Февр. 2013  


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




Zuldek пишет:
...- используйте кеширование.


Что-то не знаю как подступиться к кэшированию...( Натолкните хоть на правильную мысль!
 
 Top
Stierus Супермодератор
Отправлено: 19 Февраля, 2013 - 10:34:41
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




http://www[dot]cbr[dot]ru/scripts/Root[dot]asp?Prtid=SXML это самое лучшее упрощение
 
My status
 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