[PHP] Jak pobrać zdalny plik na lokalny serwer raz dziennie?
Chcesz raz dziennie pobrać plik zdalny (umieszczony na innym serwerze) na swój serwer lokalny.
Pobieranie plików może być przydatne, szczególnie gdy zachodzi potrzeba częstego odwoływania się do zdalnych zasobów. O wiele łatwiej jest pobrać go raz dziennie (i/lub wstępnie przetworzyć), a następnie czytać dane z własnego serwera.
Możesz w ten sposób pobierać strony WWW, pliki, również zasoby dostępne na hasło w postaci: http://login:password@www.adres.pl/sciezka/plik.txt.
Poniższy skrypt działa w dwóch wersjach. Prostej, gdzie sprawdzany jest tylko czas, aby pliki były pobrane raz dziennie. Bardziej rozbudowanej, gdzie oprócz czasu porównywana jest wielko¶ć pliku zdalnego i lokalnego, aby mieć pewno¶ć, że kopia zdalna jest tej samej wielko¶ci co lokalna i podczas ¶ci±gania nie została zerwana transmisja.
Zacznijmy od wersji prostej:
$zdalny = "http://www.adres.pl/sciezka/plik.txt";
$lokalny = "plik.txt";
$lokalny_data = (file_exists($lokalny))?date("Y.m.d",filemtime($lokalny)):0;
if ($lokalny_data<>date("Y.m.d")) {
copy($zdalny, $lokalny);
}
Kopiujemy zdalny plik http://www.adres.pl/sciezka/plik.txt do lokalnego plik.txt. Nazwa i położenie lokalnego pliku mog± być dowolne, tylko katalog musi mieć prawa do zapisywania dla każdego (ponieważ odbywa się to przez proces httpd, czyli zwykle użytkownika httpd lub nobody).
Kopiowanie odbywa się za pomoc± funkcji copy(), ale tylko wtedy gdy data pliku jest różna od daty dzisiejszej. Jeżeli rok, miesi±c i dzień s± takie same, to znaczy, że plik lokalny został już pobrany (wtedy jego data aktualizacji zmienia się na dzisiejsz±).
W ten sposób plik jest pobierany tylko raz w ci±gu dnia. Ale podczas transmisji mog± pojawić się nieoczekiwane problemy i wtedy plik nie pobierze się w cało¶ci. Aby zapobiec niezgodno¶ci plików, możesz dodatkowo sprawdzać wielko¶ć pliku zdalnego i lokalnego:
$data=date("Y.m.d");
$zdalny = "http://www.adres.pl/sciezka/plik.txt";
$zdalny_wielkosc = strlen(file_get_contents($zdalny));
$lokalny = "plik.txt";
$lokalny_wielkosc = (file_exists($lokalny))?filesize($lokalny):-1;
$lokalny_data = ($lokalny_wielkosc>-1)?date("Y.m.d",filemtime($lokalny)):0;
if ($lokalny_data<>$data or $zdalny_wielkosc<>$lokalny_wielkosc) {
copy($zdalny, $lokalny);
}
Jest to nieco bardziej kłopotliwy sposób, bo za każdym razem skrypt musi pobrać wielko¶ć pliku zdalnego co chwilkę trwa, ale dzięki temu mechanizmowi jakiekolwiek zerwanie transmisji powoduje natychmiastow± aktualizację pliku lokalnego (wielko¶ci plików będa wtedy różne).