CompZone.Org :: Artykuły :: PHP
Która technologia najbardziej Cię interesuje?
PHP
ASP
AJAX
SQL
JavaScript
Inna
Sonda Wyniki

Add to Google

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
<?php
//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.

Kodie @ 11-07-2006 21:40
Brak komentarzy...
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!