Ускорить чтение нескольких файлов XML в PHP - PullRequest
0 голосов
/ 14 декабря 2011

В настоящее время у меня есть php-файл, который должен читать сотни XML-файлов, у меня нет выбора, как эти XML-файлы создаются, они создаются третьей стороной.

Первый XML-файл большойколичество заголовков для остальных файлов XML, поэтому я ищу первый файл XML, чтобы получить имена файлов для остальных файлов XML.

Затем я читаю каждый xml-файл в поисках его значений для определенной фразы.

Этот процесс действительно медленный.Я говорю о 5 1/2 минутных прогонах ... Что неприемлемо для веб-сайта, клиенты не будут оставаться так долго.

Кто-нибудь знает способ, который мог бы ускорить мой код до максимума?время выполнения около 30 с.

Вот пастбина моего кода: http://pastebin.com/HXSSj0Jt

Спасибо, простите за непонятный английский ...

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Ваша основная проблема - вы пытаетесь сделать сотни загрузок http для выполнения поиска.Если вы не избавитесь от этого ограничения, оно будет идти так быстро.

Если по какой-то причине файлы вообще не кэшируются вообще (маловероятно), даже иногда, вы можете набрать некоторую скорость, загружая параллельно.Смотрите функции curl_multi _ * ().В качестве альтернативы, используйте wget из командной строки с xargs для параллельной загрузки.

Приведенное выше звучит безумно, если у вас есть какой-либо трафик.

Скорее всего, файлы могут быть кэшированы как минимум в течение короткого времени.Посмотрите на заголовки http и посмотрите, какую информацию свежести отправляет их сервер.Он может сказать, как долго истекает срок действия файла, и в этом случае вы можете сохранить его локально до этого момента.Или это может дать последнее изменение или etag, и в этом случае вы можете выполнять запросы условного получения, что должно ускорить процесс.

Я бы, вероятно, настроил локальный кеш squid иPHP должен сделать эти запросы через Squid.Он позаботится обо всем использовании локальной копии, если она свежая, или при условии получения новой логики новой версии для вас.

Если вы все еще хотите повысить производительность, вы можете преобразовать кэшированные файлы в более подходящий формат (например, вставить соответствующие данные в базу данных).Или, если вам нужно придерживаться формата xml, вы можете сначала выполнить поиск строки по файлу, чтобы проверить, стоит ли вообще разбирать этот файл как xml.

1 голос
/ 14 декабря 2011

Прежде всего, если вам приходится иметь дело с большими xml-файлами для каждого запроса к вашему сервису, имеет смысл скачать xml один раз, предварительно обработать и кэшировать их локально.

Если вы не можете предварительно обработать и кэшировать xml-файлы и загружать их для каждого запроса (что на самом деле не так), вы можете попытаться оптимизировать его с помощью XMLReader или какого-либо синтаксического анализатора xml на основе событий SAX.Проблема с SimpleXML заключается в том, что он использует DOM внизу.DOM (как обозначают буквы) создает объектную модель документа в вашей памяти процесса php, которая занимает много времени и потребляет массу памяти.Я бы рискнул сказать, что DOM бесполезен для анализа больших XML-файлов.

В то время как XMLReader позволит вам обходить большой XML-узел за узлом, не тратя при этом никакой памяти с компромиссом, который вы не можете выполнить с запросами xpath или любым другим.другие непоследовательные шаблоны доступа к узлам.

Как использовать xmlreader, вы можете обратиться к руководству php для расширения XMLReader

...