2009-09-26 3 views
2

매시업을 위해 last.fm의 API를 통해 많은 사용자 데이터를 가져옵니다. 나는 듣는 데이터를 수집해야하므로 매주 이것을한다.simplexml_load_file()은 얼마나 빠릅니까?

REST API 및 XML을 통해 데이터를 가져옵니다. 구체적으로는 simplexml_load_file()입니다.

스크립트가 터무니없이 오래 걸립니다. 대략 2 300 명의 사용자를 위해, 원본은 예술가의 이름 만 가져 오기 위하여 30min를 가지고 간다. 나는 그것을 고쳐야한다, 그렇지 않으면 나의 접대 회사는 저를 폐쇄 할 것이다. 나는 다른 모든 옵션을 간략히 설명했다. 스크립트를 느리게하는 것은 XML이다.

이제는 last.fm이 느린 API를 가지고 있는지 (또는 PHP를 사용하지 않고 호출을 제한하는지) PHP의 simplexml이 실제로 느린 지 여부를 알아야합니다.

내가 알기로는 XML 요청이 필자가 필요로하는 것보다 더 많이 가져 오지만, API를 통해 제한 할 수는 없다 (즉, 70 개가 아닌 3 개의 밴드에만 정보 제공). 그러나 "큰"XML 파일은 약 20kb에 불과합니다. 스크립트가 느려지고있는 것일까? 2300 명의 사용자 각각에 대해 객체에 20kb를로드해야합니까?

그럴 수는 없다 ... 단지 그것이 아마도 마지막이라고 확신 할 필요가 있습니다. 느린 API입니다. 아니면 그렇지?

다른 도움을 줄 수 있습니까?

+0

몇 가지 코드를 게시 하시겠습니까? 2300 API 호출을하고 있습니까? – Eineki

+0

예, 2 300 API 호출을하고 있습니다. –

+0

이 비슷한 전화입니까? http://ws.audioscrobbler.com/2.0/?method=library.getartists & api_key = b25b959554ed76058ac220b7b2e0a026 & user = joanofarctan – Eineki

답변

1

단순한 xml이 느린 것은 아니라고 생각합니다. 파서이기 때문에 느리지 만 2300 컬/file_get_contents가 더 많은 시간을 소비한다고 생각합니다. 또한 데이터를 가져 오지 않고 simplexml_load_string을 사용하는 이유는 무엇입니까? 실제로이 파일을 서버의 디스크에 저장해야합니까?

최소한 메모리에서로드하면 약간의 작업 속도가 빨라지고로드 된 xml은 어떤 처리가됩니까? 처리가 효율적일 수 있습니까?

+0

처리가 아니므로 테스트했습니다. "simplexml_load_file"을 사용하는 행위입니다 ... 그래서 last.fm에서 XML을 가져 와서 로컬로로드해야한다고 말하고 있습니까? –

+0

메모리에서로드하는 것이 최소한 최소한 io – RageZ

1

20kb * 2300 명의 사용자는 ~ 45MB입니다. ~ 25kB/초로 다운로드하는 경우 데이터를 다운로드하는 데 30 분이 걸리지 만 구문 분석은 할 수 없습니다.

+0

와우, 이럴 수는 있지만 ... 데이터는 서버에서 서버로 다운로드됩니다. 그것은 그렇게 느릴 수 없습니다. –

0

last.fm에서 다운로드 한 XML이 gzipped인지 확인하십시오. gzip을 지원하는 서버에 올바른 HTTP 헤더를 포함시켜야 할 것입니다. 다운로드 속도는 빨라지지만 ungzipping 부분으로 더 많은 서버 리소스를 사용합니다.

비동기 다운로드를 사용하여 서버 리소스를 확보하는 것도 고려하십시오. 반드시 프로세스 속도를 높일 필요는 없지만 서버 관리자를 행복하게 만들어야합니다.

XML 자체가 큰 경우 DOM 파서 대신 SAX 파서를 사용하십시오.

0

초당 1 회의 API 호출이 있다고 생각합니다. 나는이 정책이 코드를 통해 집행되고 있는지 확신하지 못하지만, 그 정책과 관련이있을 수있다. 이 경우라고 생각되면 IRC의 Last.fm 직원에게 # audioscrobbler에게 질문 할 수 있습니다.

0

제안한대로 simplexml_load_file에 의존하는 대신 데이터를 가져와 simplexml_load_string을 사용하여 구문 분석합니다. 약 2 배 빠른 속도로 작동합니다. 여기에 몇 가지 코드가 있습니다 :

function simplexml_load_file2($url, $timeout = 30) { 


// parse domain etc from url 
$url_parts = parse_url($url); 
if(!$url_parts || !array_key_exists('host', $url_parts)) return false; 

$fp = fsockopen($url_parts['host'], 80, $errno, $errstr, $timeout); 
if($fp) 
{ 
    $path = array_key_exists('path', $url_parts) ? $url_parts['path'] : '/'; 
    if(array_key_exists('query', $url_parts)) 
    { 
     $path .= '?' . $url_parts['query']; 
    } 

    // make request 
    $out = "GET $path HTTP/1.1\r\n"; 
    $out .= "Host: " . $url_parts['host'] . "\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 

    fwrite($fp, $out); 

    // get response 
    $resp = ""; 
    while (!feof($fp)) 
    { 
     $resp .= fgets($fp, 128); 
    } 
    fclose($fp); 

    $parts = explode("\r\n\r\n", $resp); 
    $headers = array_shift($parts); 

    $status_regex = "/HTTP\/1\.\d\s(\d+)/"; 
    if(preg_match($status_regex, $headers, $matches) && $matches[1] == 200) 
    { 
     $xml = join("\r\n\r\n", $parts);  
     return @simplexml_load_string($xml);    
    } 

} 
return false; }