@Deterrent

Как остановить php цикл по времени?

Выполняется цикл while
Внутри него есть $object=simplexml_load_file($i);
где $i="site.ru/file.xml"

иногда сайт затупливает и не отдает xml и скрипт зависает.

Как это выявить? Можно ли остановить цикл если он "завис" на N секунд?
  • Вопрос задан
  • 458 просмотров
Пригласить эксперта
Ответы на вопрос 4
@sunrails
Разделите задачу на простые шаги. Так, чтобы на каждом шаге можно было ловить ошибки и обработать их:
  1. Загрузка файла php.net/manual/ru/book.curl.php
  2. Разбор XML php.net/manual/ru/book.simplexml.php
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
только по таймауту скрипта php.net/manual/ru/function.set-time-limit.php
или так:
function simplexml_load_file_from_url($url, $timeout = 5){
  
  $context = array('http' => array('timeout' => (int)$timeout));
  
  $data = file_get_contents($url, false, $context);
  
  if(!$data){
    trigger_error('Cannot load data from url: ' . $url, E_USER_NOTICE);
    return false;
  }
  
  return simplexml_load_string($data);
}
Ответ написан
Комментировать
@Nc_Soft
Если это сайтмап разбейте на несколько частей
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://site.com/sitemap/part1.xml</loc>
</sitemap>
<sitemap>
<loc>http://site.com/sitemap/part2.xml</loc>
</sitemap>
</sitemapindex>
Ответ написан
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Лучше использовать XmlReader на проход структуры дерева а simplexml на чтение ноды можно прочитать большие xml без необходимости увлечение памяти скрипту.

( на практике применял когда парсил YML каталоги товаров по 2гб+ фаил средние значение поедание памяти 16-17мб.)

XmlReader читает документ на лету без загрузки дерева в оперативу
simplexml читает фаёл в оперативу потом разберает...

function getSimpleXMLInstance($xml_reader)
 {
        $doc = new DOMDocument('1.0', 'UTF-8');
        return simplexml_import_dom($doc->importNode($xml_reader->expand(), true));
    }
//....

        $xml_reader = new XMLReader();
        $reader = $xml_reader;
        $reader->open($catalog->yml_catalog_url)
        while ($reader->read())
        {
 if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'sitemap')
            {
                try
                {
                   // тут simplexml
                   $simpleXmlObject = getSimpleXMLInstance($reader);
                }
                catch (Exception $e)
               {
                    continue;
                }
            }
        }


ТС, обьем файла в мб?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы