2014-02-18 3 views
2

Удаленная веб-страница обновляется - иногда медленнее, раз в десять минут или около того. Иногда чаще, как каждую минуту или чаще. На этой странице я хочу сохранить данные, обновляя их каждый раз, когда они меняются (не обязательно захватывать каждый раз, но не слишком сильно отстает от «текущего» и не задерживает обновление 24/7).Как вежливо спросить удаленную веб-страницу, если она изменилась?

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

Пилинг удалённого веб-сайта для заголовков один раз в минуту не будет чрезмерным.

Если есть какие-либо намеки на повторную проверку обновлений или ответьте сервером контент только после изменения содержимого, это будет идеально.

Как я могу минимизировать нежелательный трафик на удаленном сервере, сохраняя при этом актуальность?

«Наблюдатель/обновление» написан на PHP, извлекая страницу с помощью simplexml_load_file(), чтобы получить удаленный URL-адрес каждую минуту, так что что-то хорошее с этим (например, не отбрасывает соединение при определении файла, отличается только для повторного подключения для фактического контента через полсекунды, просто продолжит запрос на контент), вероятно, будет предпочтительным.

Редактировать: по запросу, образцы заголовков.

> HEAD xxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1 
    > User-Agent: curl/7.27.0 
    > Host: xxxxxxxxxxxxxx 
    > Accept: */* 
    > 
    * additional stuff not fine transfer.c:1037: 0 0 
    * HTTP 1/.1 or later with persistent connection, pipelining supported 
    < HTTP/1.1 200 OK 
    < Server: nginx 
    < Date: Tue, 18 Feb 2014 19:35:04 GMT 
    < Content-Type: application/rss+xml; charset=utf-8 
    < Content-Length: 9865 
    < Connection: keep-alive 
    < Status: 200 OK 
    < X-Frame-Options: SAMEORIGIN 
    < X-XSS-Protection: 1; mode=block 
    < X-Content-Type-Options: nosniff 
    < X-UA-Compatible: chrome=1 
    < ETag: "66509a4967de2c5984aa3475188012df" 
    < Cache-Control: max-age=0, private, must-revalidate 
    < X-Request-Id: 351a829a-641b-4e9e-a7ed-80ea32dcb071 
    < X-Runtime: 0.068888 
    < X-Powered-By: Phusion Passenger 
    < X-Frame-Options: SAMEORIGIN 
    < Accept-Ranges: bytes 
    < X-Varnish: 688811779 
    < Age: 0 
    < Via: 1.1 varnish 
    < X-Cache: MISS 
+3

используйте запрос '' HEAD'' и изучите заголовок 'Last-Modified' ... –

+1

Если удаленный сайт поставляет заголовок« Expires », который может сообщить вам, когда сайт ожидает обновления данных. –

+1

Зависит от того, какие кеширующие заголовки задают и понимают удаленный сервер. Можете ли вы показать дамп возвращенных заголовков? – deceze

ответ

2
ETag: "66509a4967de2c5984aa3475188012df" 

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

If-None-Match: "<the last received etag value>" 

Если содержание не было изменено, то сервер должен реагировать с 304 Not Modified статусом и без тела. См. http://en.wikipedia.org/wiki/HTTP_ETag. Кажется, что он тоже работает с кешем, поэтому вы, вероятно, не слишком сильно нажимаете на него.

2

Отправить HTTP HEAD запрос с использованием cURL и получить значение Last-Modified. Это похоже на GET, но HEAD передает только строку состояния и заголовка, поэтому вы не будете «грубыми» на другом сервере, если вы отправляете запрос HEAD.

В командной строке, мы можем достичь этого с помощью следующей команды:

curl -s -v -X HEAD http://example.com/file.html 2>&1 | grep '^< Last-Modified:' 

Оно не должно быть слишком трудно переписать эту библиотеку с помощью Curl в PHP.

Смежные вопросы