У меня есть php-файл, который захватывает xml-файл с другого сайта, а затем забирает эту информацию в мою базу данных.
Проблема, с которой я столкнулся, заключается в том, что их сайт разрешает только 360 запросов в течение любого 1-часового периода, поэтому я пытаюсь закодировать его, чтобы проверить информацию заголовка при получении файла.
Я проверяю статус страницы, используя
$requesttest = 'http://www.footballwebpages.co.uk/teams.xml';
if($requesttest == NULL) return false;
$ch = curl_init($requesttest);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode == 429){
return 'Try again later, too many requests recieved.';
} else if($httpcode>=200 && $httpcode<300){
/* run code to grab xml file */
$comps = array ( 0 => 1, /* Premier_League */
1 => 2 /* Championship */
);
$comps_total = count($comps);
$comps_no = 0;
while ($comps_no < $comps_total) {
$url = 'http://www.footballwebpages.co.uk/teams.xml?comp=' . $comps[$comps_no];
$full_list = simplexml_load_file($url);
/* Code for grabbing and storing info from XML */
} else {
return 'Football Web Pages Offline';
}
В данный момент он проверяет главную страницу «команд», чтобы увидеть, был ли достигнут лимит запросов, а затем захватывает каждый xml для набора соревнований. Проблема заключается в том, что если при первой проверке доступен только 1 запрос, то при переходе к следующему этапу он не будет выполнен. Как я могу проверить информацию заголовка при загрузке XML-файла, не вызывая страницу, чтобы проверить заголовок, а затем вызвать страницу, чтобы получить XML-файл?
В основном загружайте файл xml, если код заголовка находится между 200 и 300 в одном вызове, чтобы не тратить 2 запроса на захват одной страницы XML.
Возможно, вы могли бы использовать метод, подобный следующему, забыть первый вызов базового URL-адреса, поскольку он избыточен, и вместо этого использовать возвращаемое значение из функции, чтобы определить, следует ли выполнять дальнейшую обработку:
<?php
/* utility function to get data and return an object */
function getxml( $comp=1 ){
global $ch;
global $url;
curl_setopt( $ch, CURLOPT_URL, $url . '?comp=' . $comp );
$data = curl_exec( $ch );
$status = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
return (object)array(
'xmldata' => $data,
'status' => $status
);
}
/* All the comps available - more than specified! */
$comps=array(
'Barclays_Premier_League' => 1,
'Sky_Bet_Championship' => 2,
'Sky_Bet_League_One' => 3,
'Sky_Bet_League_Two' => 4,
'National_League' => 5,
'National_League_North' => 6,
'National_League_South' => 7,
'Evo-Stik_Southern_League_Premier_Division' => 8,
'Evo-Stik_Southern_League_Division_One_Central' => 9,
'Evo-Stik_Southern_League_Division_One_South_&_West' => 10,
'Ryman_League_Premier_Division' => 11,
'Ryman_League_Division_One_North' => 12,
'Ryman_League_Division_One_South' => 13,
'Evo-Stik_League_Premier_Division' => 14,
'Evo-Stik_League_Division_One_North' => 15,
'Evo-Stik_League_Division_One_South' => 16,
'Scottish_Premiership' => 17,
'Scottish_Championship' => 18,
'Scottish_League_One' => 19,
'Scottish_League_Two' => 20
);
/* only interested in first two */
$comps=array_slice( $comps, 0, 2, true );/* I don't use simple_xml() - used to process xml data */
$dom=new DOMDocument;
/* base url */
$url= 'http://www.footballwebpages.co.uk/teams.xml';
/*
initialise curl request object but
set the url for each $comp in the function
*/
$ch = curl_init();
curl_setopt( $ch, CURLOPT_TIMEOUT, 5 );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 5 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
/*
If there have been too many requests when launching
the 429 condition should break out of the entire loop -
thus using only 1 request
*/
foreach( $comps as $key => $comp ){
$xml=getxml( $comp );
switch( $xml->status ){
case 429: echo 'Try again later, too many requests recieved.'; break 2;
case 200:
/* if everything is ok, process $xml */
$dom->loadXML( $xml->xmldata );/* example of processing xml data */
echo '
<h1>'.$dom->getElementsByTagName('competition')->item(0)->nodeValue.'</h1>
<ul>';
$col=$dom->getElementsByTagName('team');
if( $col ){
foreach( $col as $team ) echo '<li>'.$team->childNodes->item(1)->nodeValue.', '.$team->childNodes->item(3)->nodeValue.'</li>';
}
echo '
</ul>';
break;
default:/* If no response or an unknown response exit */
echo 'Football Web Pages Offline';
break 2;
}
}
curl_close( $ch );
$dom=$ch=$comps=null;
?>
Других решений пока нет …