Php curl: рабочий скрипт, нужно немного добавить - PullRequest
0 голосов
/ 01 ноября 2011

Это мой код:

    function get_remote_file_to_cache(){    
$sites_array = array("http://www.php.net", "http://www.engadget.com", "http://www.google.se", "http://arstechnica.com", "http://wired.com");
$the_site= $sites_array[rand(0, 4)];

    $curl = curl_init();
    $fp = fopen("rr.txt", "w");
    curl_setopt ($curl, CURLOPT_URL, $the_site);
    curl_setopt($curl, CURLOPT_FILE, $fp);    
    curl_exec ($curl);
    curl_close ($curl);
}    

$cache_file = 'rr.txt';
$cache_life = '15'; //caching time, in seconds    
$filemtime = @filemtime($cache_file);     

if (!$filemtime or (time() - $filemtime >= $cache_life)){
    ob_start();  

echo file_get_contents($cache_file);    
ob_get_flush();

echo " <br><br><h1>Writing to cache</h1>";
get_remote_file_to_cache(); 
}else{
   echo "<h1>Reading from cache file:</h1><br> ";    
    ob_start();    
echo file_get_contents($cache_file);
ob_get_flush();

}

Все работает так, как должно, без проблем и неожиданностей, и, как вы можете видеть, это довольно простой код, но я новичок в CURL и просто хотел бы добавить одну проверку в код, но не знаю, как:

Можно ли в любом случае проверить, что файл, извлеченный с удаленного сайта, не является страницей 404 (не найдена) или чем-то подобным, а является кодом состояния 200 (успешно)?

Таким образом, в основном, запись в файл кэша только в том случае, если заполнение имеет код состояния 200.

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Чтобы получить код состояния из дескриптора cURL, используйте curl_getinfo после curl_exec:

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

Но кэшированный файл будет перезаписан, когда

$fp = fopen("rr.txt", "w");

вызывается независимо от кода HTTP, это означает, что для обновления кэша только при статусе 200 вам необходимо прочитать содержимое в память или записать во временный файл. Затем, наконец, запишите в реальный файл, если статус 200.

Это также хорошая идея, чтобы

touch('rr.txt');

перед выполнением cURL, поэтому следующий запрос, который может прийти до завершения текущей операции, также не будет пытаться загрузить страницу на страницу.

1 голос
/ 01 ноября 2011

Попробуйте после curl_exec

$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...