2011-12-14 3 views
0

현재 저는 수백 개의 XML 파일을 읽어야하는 PHP 파일이 있습니다.이 XML 파일을 작성하는 방법에 대한 선택의 여지가 없으며 제 3자가 작성했습니다.PHP에서 여러 XML 파일 읽기 속도 향상

첫 xml 파일은 나머지 xml 파일에 대한 많은 양의 제목이므로 첫 xml 파일을 검색하여 나머지 xml 파일의 파일 이름을 얻습니다.

그런 다음 각 xml 파일의 특정 구문에 대한 값을 검색합니다.

이 프로세스는 실제로 느립니다. 나는 5 1/2 분 런타임을 말하는거야 ... 어느 웹 사이트에 대한 허용되지 않습니다, 고객은 오랫동안 머물 못해.

약 30 초의 최대 런타임까지 내 코드를 빠르게 할 수있는 방법을 아는 사람이 있습니까? 여기

내 코드의 페이스트 빈입니다 : 당신이 당신의 서비스에 대한 각 요청에 대해 큰 XML 파일을 처리해야하는 경우 ... 모든

+0

나는 cachegrind.out을 가지고 있으며, 시간이 걸리는 부분은 SimpleXMLElement -> __로 구성한다. 평균 소요 시간은 1.98s이다. – Aaron

+0

이것은 대부분 다운로드 시간이 될 것이다. 다운로드 및 xml 파싱을 분리하고, file_get_contents()를 사용하거나, gzip을 지원하기 위해 말리기를 시도하십시오. – goat

+0

나는 다른 것을 구걸한다. 항상 다운로드 시간 만있는 것은 아닙니다. XML이 큰 경우 DOM/SimpleXML 사용의 경우 XML에서 DOM을 빌드하는 데 많은 시간과 메모리가 필요합니다. 따라서 대규모 XML 처리를 피할 방법이없는 경우 스트리밍 (XMLReader)/이벤트 기반 (SAX) 파서 만 선택할 수 있습니다. 그런 scenarious의 DOM은 잘 작동하지 않습니다. – cryo28

답변

1

귀하의 주요 문제를 상담 할 수의 XMLReader를 사용하는 방법

는 HTTP 다운로드 수백 검색을 수행 할 수 있도록 노력하고 있습니다. 그 제한을 없애지 않는 한, 그렇게 빨리 갈 것입니다.

어떤 이유로 든 파일이 캐시 할 수없는 경우 (거의 없을 수도 있음) (일부는 아닐 수도 있음)은 병렬로 다운로드하여 속도를 향상시킬 수 있습니다. curl_multi _ *() 함수를 참조하십시오. 또는 wgetxargs과 함께 사용하여 병렬로 다운로드하십시오.

만약 당신이 어떤 종류의 트래픽이 있다면 위의 소리가 미친.

파일은 적어도 짧은 시간 동안 캐시 될 수 있습니다. http 헤더를보고 서버가 보내는 신선도 정보의 종류를 확인하십시오. 파일이 만료 될 때까지의 기간을 말하며,이 경우 그때까지 로컬에서 저장할 수 있습니다. 또는, 마지막 수정 또는 etag를 줄 수 있으며, 조건부 get 요청을 할 수 있습니다.

아마도 로컬 squid cache을 설정하고 php가 squid를 통해 이러한 요청을하게하십시오. 신선한 경우 로컬 사본을 사용하거나 조건부로 새 버전 논리를 검색합니다.

더 많은 성능을 원할 경우 캐시 된 파일을보다 적합한 형식으로 변환 할 수 있습니다 (예 : 데이터베이스의 관련 데이터 고정). 또는 xml 형식을 고수해야하는 경우 파일에 문자열 검색을 먼저 수행하여 해당 파일을 xml로 구문 분석해야하는지 여부를 테스트 할 수 있습니다.

+0

헤더를 살펴 봤는데 한 달에 한 번 캐시를 업데이트하는 것이 좋습니다. 어떻게 그런 캐시를 만들까요? 로컬로 500 개 정도의 XML 파일을 모두 다운로드 한 다음 매월 업데이트해야합니다. – Aaron

+1

"tripcode", "country"및 "xml"필드가있는 데이터베이스 테이블을 만들 것입니다. 한 달에 한 번 cron 작업을 통해 PHP 스크립트를 실행하여 데이터베이스를 업데이트하십시오. 이제 데이터베이스 번개를 빠르게 검색 할 수 있습니다. – goat

1

먼저 http://pastebin.com/HXSSj0Jt

덕분에, 이해할 수없는 영어 미안해 xml을 한 번 다운로드하고 전처리하고 로컬에 캐시하는 것이 현명합니다.

xml을 전처리하고 캐시 할 수없고 요청할 때마다 다운로드해야하는 경우 (실제로는 그렇지 않다고 생각하는 경우) XMLReader 또는 일부 SAX 이벤트 기반 xml 파서를 사용하여 최적화를 시도 할 수 있습니다. SimpleXML의 문제점은 아래에 DOM을 사용하고 있다는 것입니다. DOM (글자 그대로) PHP 프로세스 메모리에 많은 시간이 걸리고 많은 메모리를 소비하는 문서 객체 모델을 만듭니다. DOM은 큰 XML 파일을 파싱 할 때 쓸모가 없다고 말할 수 있습니다.

XMLReader를 사용하면 xpath 쿼리 나 기타 중요하지 않은 노드 액세스 패턴을 발행 할 수 없다는 절충안으로 거의 먹지 않고 노드별로 큰 XML 노드를 탐색 할 수 있습니다. 당신이 php manual for XMLReader extension