2013-07-09 3 views
0

많은 외부 XML 페이지 (50 개 이상)에서 데이터를 가져 와서 PHP를 사용하여 테이블로 구문 분석하고 cron 작업을 사용하여 장면 뒤에서 수행하여 수집 된 데이터를 표시 할 수있는 스크립트를 작성하려고합니다. 내 사이트에서 사용자를위한 지연 지연 없음.많은 외부 XML 페이지에서 데이터를 미리로드하여 거의 실시간으로 웹 사이트에 정보를 표시하는 방법은 무엇입니까?

이 스크립트의 목적은 현재 온라인 회원과 그들이하고있는 게임을 보여주는 Steam Community 그룹의 회원 명단의 라이브 피드를 수집하는 것입니다. 먼저 그룹의 XML 페이지를 확인하여 업데이트 된 구성원 목록을 얻은 다음 해당 정보를 사용하여 각 구성원의 XML 파일을 검사하여 현재 온라인 상태와 게임 상태를 얻습니다.

나는 성공적이었습니다. 데이터는 로딩 지연없이 약 80 %의 시간으로 올바르게로드되고 표시됩니다. 그러나 나머지 20 %는 사용자가 스크립트가로드되는 페이지의 일부를 넘어서 웹 사이트를로드 할 수 없다는 것을 완전히 경험합니다. 그 시점까지 모든 것을로드하고, 몇 분 동안 정지 한 다음 새로 고침 후에 제대로 작동합니다. 나는 전화 끊기를위한 조건을 복제 할 수 없었고, 단지 너무 자주 무작위로 일어난다.

지연을 유발하는 스크립트를 실행하는 크론 작업이라고 의심 스럽지만 (사실 제한된) 내 영역을 벗어납니다.

내가 찾고있는 것을 더 좋은 방법으로 볼 수 있습니까? 간헐적 인 전화 끊김의 원인은 무엇입니까?

미리 도움을 청하십시오!

<?php 
$myFile = "steamfeed.php"; 
$fh = fopen($myFile, 'w'); 

$xml = simplexml_load_file('http://steamcommunity.com/groups/sundered/memberslistxml/?xml=1'); 
$members = $xml->xpath('//steamID64'); 
foreach($members as $steamID64) { 

$xml2 = simplexml_load_file('http://steamcommunity.com/profiles/'.$steamID64.'/?xml=1'); 

if ($xml2->onlineState != 'offline') { 


$steam_game = substr($xml2->inGameInfo->gameName, 0, 25); 

$stringData = '<table width="280px" cellspacing="0" cellpadding="0" valign="top" style="vertical-align:text-top;"><tr><td    style="background-image:url(\'http://www.thesunderedguard.com/images/statusbg.gif\');" width="288px" height="30px"><table width="100%"><tr><td width="50%" height="30px" style="text-align:left;"><a href="http://steamcommunity.com/profiles/'.$steamID64.'/" target="_blank" style="color:#CDCDCD;">'.$xml2->steamID.'</a></td><td width="50%"><a href="'.$xml2->inGameInfo->gameLink.'" target="_blank">'.$steam_game.'</a></td></tr></table></td></tr></table>'; 
fwrite($fh, $stringData); 

} 
    } 
    fclose($fh); 
?> 
+0

왜 데이터베이스 대신 플랫 파일을 사용하고 있습니까? 증기가이 수준의 긁힘을 허용합니까? –

+0

데이터베이스 작업에 대한 기술 부족으로 인해 tbh. 사이트가 사용하는 거대한 데이터베이스 (phpBB)에서 데이터를 입력하거나 호출하는 방법을 잘 모름. – user2562769

답변

0

문제는 그 크론은 누군가가 크론 그들이 때까지 "기다릴 필요"가 실행하는 동시에 귀하의 사이트를 방문 할 때 당신이 그렇게 steamfeed.php 파일을 잠그는 정보를 가져 오는 실행되는 동안 일이 끝났어. XML에서 반환 된 모든 내용을 작성한 다음 임시 파일을 작성한 다음 프로덕션 환경에서 사용하는 파일로 내용을 옮기는 임시 파일을 작성하는 것이 좋습니다.

희망 작품입니다.

+0

답변 해 주셔서 감사합니다! 그건 의미가 있습니다. 그래서, 스크립트 출력을 'steamtemp.php'로 만든 다음, 단순히 steamfeed.php를 실행하여 "file_get_contents ("steamtemp.php ");"를 페이지에 포함 시키시겠습니까? – user2562769

+0

실제로 steamtemp.php의 내용을 steamfeed.php로 복사하려고합니다.PHP를해야합니다 : –

+0

- fopen (steamfeed.php) - fwrite (steamtemp.php의 내용) –

0

문제가 발생하면 cron 작업이 시작되면 즉시 현재 파일이 지워집니다. 작업이 완료되면 cron 작업이 완료 될 때까지 사이트에 방문한 사람은 빈 페이지가 표시됩니다.

이전 콘텐츠를 지우기 전에 백그라운드에서 새 콘텐츠 파일을 만들어야합니다. 이것은 임시 파일을 만들고 파일에 내용을 만든 다음 파일의 이름을 바꾸고 이전 파일을 삭제하는 것처럼 간단 할 수 있습니다.

파일 이름을 바꾸는 동안 여전히 문제가 발생할 수 있습니다. 심볼릭 링크를 사용하고, cron 작업이 발생할 때마다 연결되는 파일을 변경하고, 때때로 이전 버전을 정리할 수 있습니다.

다른 방법이있을 것이라고 확신합니다 ...

+0

답해 주셔서 감사합니다! 전체 사이트를 끊지 않는 한 사용자가 피드의 프레임에서 몇 분 동안 아무 것도 볼 수 없다면 괜찮습니다. 하지만 중간 임시 파일이 필요하다는 것은 이해가됩니다. 복사/삭제 코드를 xml 파싱 코드와 동일한 스크립트 파일의 끝에 넣을 수 있습니까? 아니면 그 스크립트로 두 번째 크론 작업을 만들어 첫 번째 작업 이후에 정리해야합니다. – user2562769

+0

새 파일을 만든 후에는 동일한 스크립트에서 복사/이름 바꾸기/삭제/모든 작업을 수행 할 수 있습니다. 중요한 것은 이전 파일을 제거하기 전에 새 파일을 준비시키는 것입니다. –