Re: Помогите разобраться с функцией в парсере
OrlandO, конечно он будет грузить весь сайт не по детски..
В этом скрипте
13 вызовов чтения удаленных файлов..
Такой скрипт ни в коем случае нельзя вставлять прямо в тело сайта..
Только этот скрипт (приведенный Вами) будет работать (до выдачи результата) 6 секунд и больше. Это я указал среднее время замеренное мною. Были случаи что и 13 секунд работал. И думаю это еще не предел - всё будет зависеть от загруженности тех сайтов, которые Вы дергаете, интернет канала пользователя, который будет загружать страницу с этим скриптом и т.д.
Время работы PHP скрипта на сервере ограничено...
Оно указано в настройках PHP (на сервере) и обычно это 30-60 секунд.
Если в течении этого времени скрипт не отрабатывает - он сбрасывается - чтобы не вешать сервер..
Вот потому у Вас и происходит подобное...
Вообще-то - такие скрипты (которые могут работать достаточно длительное время) должны вызываться на странице (срабатывать) только после того, как сама страница уже отображена пользователю.
Вы наверняка видели на многих сайтах - после того как страница показана в браузере - начинают подгружаться какие-то блоки информации.
Если будет желание, почитайте по этому поводу (отложенная загрузка, Web 2.0, Ajax, jQuery) - оно как раз для таких случаев - для тяжелых скриптов...
А теперь - по самому скрипту...
Учитесь оптимизировать скрипты, которые Вы пишите...
Анализируйте написанный Вами код, и ищите способы ускорить его (оптимизировать). Нельзя просто брать и копировать куски кода - это в большинстве случаев неверно - и будет только увеличивать время работы скрипта, причем в основном - в разы...
Например...
- Вы с сайта cbr.ru и с сайта nbrb.by запрашиваете полный файл курсов на вчера и на сегодня для 3-х разных валют.
Это 12 обращений к внешним сайтам...
А зачем Вы это делаете ?
Ведь при запросе курсов валют на определенную дату в файле содержится информация по всем валютам... Зачем же его еще 2 раза запрашивать ?
Получается что то, что можно было сделать за один запрос - Вы делаете 3-мя запросами. Только это уже увеличивает время работы скрипта в 3 раза...
Для Вашего примера (3 валюты с 3-х сайтов) этот скрипт можно переделать следующим образом (так будет правильнее, немного компактнее, да и работать будет быстрее)..
И еще...
Советую Вам пересмотреть работу с этим скриптом.
А именно - не нужно постоянно обращаться к тем 3-м сайтам за данными.
Курсы ведь меняются один раз в день - так почему бы Вам, например, не сохранять считанные значения у себя в базе где-то...
При первой загрузке скрипта проверяете если данные за сегодня уже есть - то не обращаетесь к этим сайтам, а работаете со своими данными.
А если их еще нету - то зачитали один раз и сохранили в базе.
Таким образом этот скрипт будет работать еще быстрее...
В общем - подумайте над моими советами...
Ах да - вот и сам скрипт.
Работу его можете посмотреть здесь :
https://www.libertykeeper.net.ua/testXml.php
PHP код:
<?php
// Валюты, которые мониторим
$aCurrencyName = array("USD","EUR","RUB","UAH","BYR");
echo('<div align="center"><table width="80%">');
// Запрашиваем курсы валют с сайта bank-ua.com
$xml = simplexml_load_file("https://bank-ua.com/export/currrate.xml");
echo('<tr><td><b>bank-ua.com</b></td>');
foreach ($xml->item as $item)
{
// Пройдемся по всем валютам
if (in_array($item->char3, $aCurrencyName))
{
// Если текущая валюта в списке тех, которая нам нужна - будем анализировать её
if ($item->change > 0) $txtChange = '<img src="https://finliga.com/images/up.png" width="9" height="10" alt="up">';
else if ($item->change < 0) $txtChange = '<img src="https://finliga.com/images/down.png" width="9" height="10" alt="up">';
else $txtChange = ' <b>-</b>';
// Текущий курс валюты
$curRate = floatval($item->rate) / floatval($item->size);
// Выведем результат
echo('<td align="center"><b>1 '.$item->char3.'</b> = '.number_format($curRate,4,'.','').' UAH '.$txtChange.'</td>');
}
}
echo('</tr>');
echo('<tr><td><b>cbr.ru</b></td>');
// Запрашиваем курсы валют с сайта cbr.ru
// За вчерашний день
$dateYesterday = date("d/m/Y", mktime(0, 0, 0, date("m"), date("d")-1, date("Y")));
$xmlYesterday = simplexml_load_file("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateYesterday);
// За сегодняшний день
$dateToday = date("d/m/Y");
$xmlToday = simplexml_load_file("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateToday);
foreach ($xmlYesterday->Valute as $item)
{
// Пройдемся по всем валютам
if (in_array($item->CharCode, $aCurrencyName))
{
// Если текущая валюта в списке тех, которая нам нужна - будем анализировать её
// Найдем запись для текущей валюты в сегодняшних данных
$itemToday = $xmlToday->xpath("Valute/CharCode[.='".$item->CharCode."']/parent::*");
// Т.к. у нас найдется только одна запись с таким же кодом, то будем брать всегда первую
$itemToday = $itemToday[0];
// Заменим в значении Value запятую на точку.
$itemToday->Value = (preg_replace("/,/",".",$itemToday->Value));
// Определим как изменился курс (в какую сторону)
if (floatval($itemToday->Value) > floatVal($item->Value)) $txtChange = '<img src="https://finliga.com/images/up.png" width="9" height="10" alt="up">';
else if (floatval($itemToday->Value) > floatVal($item->Value)) $txtChange = '<img src="https://finliga.com/images/down.png" width="9" height="10" alt="up">';
else $txtChange = ' <b>-</b>';
// Выведем результат
echo('<td align="center"><b>'.$itemToday->Nominal.' '.$itemToday->CharCode.'</b> = '.number_format(floatval($itemToday->Value),4,'.','').' RUB '.$txtChange.'</td>');
}
}
echo('</tr>');
echo('<tr><td><b>nbrb.by</b></td>');
// Запрашиваем курсы валют с сайта nbrb.by
// За вчерашний день
$dateYesterday = date("m/d/Y", mktime(0, 0, 0, date("m"), date("d")-1, date("Y")));
$xmlYesterday = simplexml_load_file("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateYesterday);
// За сегодняшний день
$dateToday = date("m/d/Y");
$xmlToday = simplexml_load_file("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateToday);
foreach ($xmlYesterday->Currency as $item)
{
// Пройдемся по всем валютам
if (in_array($item->CharCode, $aCurrencyName))
{
// Если текущая валюта в списке тех, которая нам нужна - будем анализировать её
// Найдем запись для текущей валюты в сегодняшних данных
$itemToday = $xmlToday->xpath("Currency/CharCode[.='".$item->CharCode."']/parent::*");
// Т.к. у нас найдется только одна запись с таким же кодом, то будем брать всегда первую
$itemToday = $itemToday[0];
// Заменим в значении Value запятую на точку (если вдруг будет).
$itemToday->Rate = (preg_replace("/,/",".",$itemToday->Rate));
// Определим как изменился курс (в какую сторону)
if (floatval($itemToday->Rate) > floatVal($item->Rate)) $txtChange = '<img src="https://finliga.com/images/up.png" width="9" height="10" alt="up">';
else if (floatval($itemToday->Rate) > floatVal($item->Rate)) $txtChange = '<img src="https://finliga.com/images/down.png" width="9" height="10" alt="up">';
else $txtChange = ' <b>-</b>';
// Выведем результат
echo('<td align="center"><b>'.$itemToday->Scale.' '.$itemToday->CharCode.'</b> = '.number_format(floatval($itemToday->Rate),4,'.','').' BYR '.$txtChange.'</td>');
}
}
echo('</tr>');
echo('</table></div>');
?>