Pobieranie informacji o nowych artykułach
W artykule opisuje skrypt który wyświetli nam informacje na temat nowych arytkułów na compzone.org. Skrypt będzie oczywiście w PHP. Będzie to skrypt shella, dlatego najpierw polecam zapoznać się z artykułem mówiącym o nich: Skrypty PHP jako skrypty powłoki.
Jak ten skrypt będzie działać?
W skrypcie bardzo dużo jest funkcji działających na strumieniach. Aby w pełni zrozumieć skrypt musimy najpierw posiadać wiedzę na temat strumieni. W skrypcie wykorzystane są 2 typy strumieni: pliki oraz połaczenie z internetem przez gniazdo (socket). Na początku naszego skryptu otworzymy plik konfiguracyjny i załadujemy jego zawartość. Będą tam znajdowały się informacje o dostępnych wcześniej artykułach. Później połączymy się z serwerem HTTP compozone.org i zażądamy wyświetlenia strony zawierające listę artykułów. Następnie pobierzemy z tej strony wszystkie tytuły artykułów i porównamy z tymi bedącymi już wcześniej. Dzięki temu dowiemy się które artykuły są nowe. Na koniec zapizemy nową konfigurację z nowymi informacjami oraz wyświetlimy listę nowych artykułów.
Piszemy skrypt PHP
Wiemy już jak działa skrypt, musimy jeszcze ustalić format pliku konfiguracyjnego. Wygląda on tak:
PHP (kategoria) 9 (liczba artykułów) Tytuł 1 (tytuł) Tytuł 2 ....
teraz przystąpny do napisania kodu. Poniżej zamieszczam gotowy kod wraz z obszernymi komentarzami:
#!/usr/bin/php -q
![]()
//Kategorie dostępne na compzone.org
$cats = array('PHP'=>'4','SQL'=>'5','Inne'=>'6');
![]()
//Tu wczytamy artykuły, o których istnieniu wiemy
$arts = array();
//Konstruujemy ścieżkę do pliku konfiguracyjnego - plik .compzone.arts w katalogu domowym
$config_path = $_ENV['HOME'].'/.compzone.arts';
//Jeżeli nie jest to pierwsze uruchomienie i plik istnieje wczytamy konfiguracje
if(file_exists($config_path)){
//Otwiramy plik do odczytu
$file = fopen($config_path,"r");
//Dopóki nie osiągniemy końca pliku
while(!feof($file)){
//wczytaj linie do zmiennej $line, oczyść z białych znaków
$line = trim(fgets($file,1024));
//jeżeli linia zawiera kategorię
if(array_key_exists($line,$cats)){
//wczytujemy liczbę artykułów
$count = (int)(trim(fgets($file,1024)));
for($i=0;$i<$count;$i++){
//wczytujemy po koleji wszystkie artykuły do tablicy $arts
$arts[] = trim(fgets($file,1024));
}
}
}
}
![]()
//W tej tablicy będziemy przechowywać informacje na temat nowych artykułów
$new_arts=array();
![]()
//Otwieramy plik konfiguracji do pisania. Czyści cały plik
$file = fopen($config_path,'w');
![]()
//Dla każdej kategorii
foreach($cats as $key=>$cat){
//Połącz się z serwerem www compzone.org na porcie 80 - port HTTP
$fp = fsockopen('www.compzone.org',80);
//Wyśli żądanie GET
fwrite($fp,'GET /index.php?katid='.$cat.' HTTP/1.1'."\nHost: www.compzone.org\n\n");
//Wypisz informacje co pobieramy
echo 'Pobieranie danych z kategori: '.$key.".";
$page ='';
//Dopóki w strumieniu są dane
while(!feof($fp)){
//wypisz znak postępu pobierania
echo '.';
//odczytaj dane ze strumienia do zmiennej $page
$page .= fread($fp,1024);
}
echo "\n";
![]()
//Zamknij połączenie z serwerem
fclose($fp);
![]()
//Znajdujemy początek listy artykułów
$begin = strpos($page,'width="415">');
//Znajdujemy koniec liczby artykułów
$end = strpos($page, '</table>',$begin);
//Zapisujemy do zmiennej $text odpowiedni fragment
$text = substr($page,$begin,$end-$begin);
//Używając wyrażeń regularnych znajdujemy wszystkie tytuły arykuły - linki
preg_match_all('/href="([A-Z\+a-z0-9\._\-&;?=]*)">([ [:alnum:]_:\-&!@#$%^*+\/?"\']*)<\/a>/',$text,$matches);
![]()
$count = count($matches[1]);
![]()
//Zapisujemy do pliku konfiguracyjnego kategorię i liczbę artykułów
fwrite($file,$key."\n$count\n");
//Przetwarzamy wszystkie tytuły
for($i=0;$i<$count;$i++){
//Jeśli tytuł ($matches[2][$i]) nie jest jeszcze w naszej "bazie" artykułów
if(!in_array($matches[2][$i],$arts)){
//dodaj go do listy nowych artykułów
$new_arts[$key][] = $matches[2][$i];
}
//Zapisz tytuł artykułu do pliku
fwrite($file,$matches[2][$i]."\n");
}
}
![]()
//Wyświetl nową linie
echo "\n";
//Jeśli liczba artykułów nie zmieniła się - nie ma nowych
if(count($new_arts)==0){
//Wyświetl stosowny komunikat
echo 'Nie ma nowych artykulow'."\n";
}else{
//jeśli są nowe artykuły wyświetl je
echo 'Nowe artykuly!'."\n";
foreach($new_arts as $cat=>$arr){
echo "\t$cat:\n\t\t".implode("\n\t\t",$arr)."\n";
}
}
![]()
Kod nie jest bardzo skomplikowany. Jedyną trudność może sprawić zrozumienie działania wyrażenia regularnego dla kogoś kto ich jeszcze nie zna. Użyłem tutaj funkcji preg_match_all, która zwraca w postaci tablicy wszystkie znalezione elementy. Funkcja ta wykorzystuje wyrażenia regularne (z ang. Regular Expressions, regexp) w stylu Perla. Jednak wyrażenia regularne to temat zbyt obszerny, aby zmieścić go w tym artykule.
Jak uruchomić nasz skrypt?
W systemie linux (i inny uniksopochodnych) wystarczy nadać mu odpowiednie prawa wykonywania:
$#Nadanie praw wykonania $chmod a+x skrypt.php $#Uruchomienie skrypty $./skrypt.php
W systemie windows wystarczy wpisać:
c:\PHP\php.exe -q skrypt.php
Nie zaleznie od tego w jaki sposób uruchomimy program, wynik bedzie taki sam, na przykład:
Pobieranie danych z kategori: PHP................. Pobieranie danych z kategori: SQL................. Pobieranie danych z kategori: Inne................. Nowe artykuly! PHP: Upload plików w PHP Autoryzacja kodem z obrazka w PHP Dynamiczny avatar SQL: Zastosowanie dyrektywy SQL - GROUP BY Podział rekordów na strony Inne: Skrypty PHP jako skrypty powłoki
albo jeśli nie ma nowych artykułów:
Pobieranie danych z kategori: PHP................. Pobieranie danych z kategori: SQL................ Pobieranie danych z kategori: Inne................ Nie ma nowych artykulow
Zakończenie
Ten artykuł daje tylko zarys ogromnych możliwości PHP. Po drobnych modyfikacjach powyższy skrypt powinno się bez problemu dać uruchomić na serwerze.










