Operacje na plikach
Obsługa plików jest zawarta we wszystkich nowoczesnych językach programowania. Zdolność do tworzenia, czytania, zapisu i innych operacji na plikach lub innych obiektach systemu plików jest niezbędna do zrealizowania obsługi sesji i serializacji. Do obsługi plików i innych obiektów systemu plików PHP posiada funkcje podobne do tych spotykanych w języku C. Tak jak C, w funkcjach służących do odczytu i zapisu, PHP używa uchwytów plików oraz pozwala na tworzenie uchwytów (pozwalających na operacje innymi typami strumieni danych, takimi jak gniazda i potoki). Zdolność ta powoduje, że równie łatwo można zapisać dane do pliku jak również wysłać je poprzez potok do innego programu co bardzo ułatwia projektowanei stron internetowych.
Odczyt i zapis plików
Jedną z głównych różnic przy projektowaniu stron internetowych w stosunku do zwykłych aplikacji, jest sposób utrzymywania stanu aplikacji. W przypadku zwykłego programu, użytkownik uruchamia go, wykonuje kilka komend i kończy działanie programu. W czasie pracy programu stan aplikacji jest utrzymywany w pamięci. W aplikacjach opartych o sieć WWW stan musi być utrzymywany przez serwer WWW, ponieważ klientem jest zwykle prosta przeglądarka WWW. W chwili obecnej wystarczy wiedzieć, że do utrzymywania stanu aplikacji i tworzenia innych mechanizmów przechowywania danych można użyć plików.
Ważne jest, aby używając plików, pamiętać o zagadnieniach bezpieczeństwa. Ponieważ aplikacja będzie działać w kontekście serwera WWW, pliki będą miały uprawnienia użytkownika przy pomocy którego uruchamiany jest serwer WWW. W przypadku Apache domyślnie jest to użytkownik nobody, którego uprawnienia ograniczają dostęp przez aplikację do obiektów systemu plików. Należy uważać, aby korzystając z plików nie naruszyć systemu bezpieczeństwa serwera WWW. W większości przypadków użycie bazy danych zamiast plików jest o wiele bardziej bezpieczne i praktyczne. Projektowanie stron internetowych korzystajacych z bazy danych wymaga jednak dodatkowo znajomości jezyka SQL. Oczywiście istnieje wiele sytuacji gdy narzut czasowy wprowadzany przez bazę danych lub wymagania aplikacji powodują, że pliki są jedynym sensownym rozwiązaniem.
Na wydruku 4.1 pokazane zostało w jaki sposób można zrealizować liczniki dostępu do stron witryny. Do tego celu wykorzystane zostały podstawowe operacje na plikach, otwarcie, odczyt, zapis i zamknięcie prostego pliku śladu. W przykładzie tym nie zostały wykorzystane wszystkie dostępne w PHP funkcje operujące na plikach. Bardziej szczegółowy opis wszystkich funkcji znajdują się w skorowidzu funkcji na końcu książki.
Wydruk 4.1. Użycie plików do zliczania odwołań do stron witryny
<?php
/*
Plik ten może być dołączany do dowolnego skryptu PHP.
UŻYCIE: Wystarczy dołączyć ten plik. Tworzy on zmienną
*/
error_reporting( 0 );
$aLogFilePath = “/www/auto_logs/access.log”;
$aCountArray = array();
// Sprawdzenie czy plik istnieje
if ( is_file( $aLogFilePath ) == True )
{
// Otwarcie i odczytanie pliku. Format pliku to oddzielone tabulatorami
// pary opisujące kolejne skrypty:
// ścieżka-do-skryptu licznik
$aFile = fopen( $aLogFilePath, “r” );
while( !feof( $aFile ) )
{
$aLine = fgets( $aFile, 1024 );
$aTempArray = explode( “\t”, $aLine );
if ( count( $aTempArray ) == 2 )
{
$aCountArray[$aTempArray[0]] = $aTempArray[1];
}
}
fclose( $aFile );
}
// Ustawienie globalnego licznika odwołań do strony
// i uaktualnienie tablicy temp
$aPageAccessCount = $aCountArray[$PATH_TRANSLATED] + 1;
$aCountArray[$PATH_TRANSLATED] = $aPageAccessCount;
// Zapis całej tablicy do pliku
$aFile = fopen( $aLogFilePath, “w” );
foreach ( $aCountArray as $aKey => $aValue )
{
fputs( $aFile, “$aKey\t$aValue\n” );
}
fclose( $aFile );
?>
Na wydruku 4.1 pokazujemy użycie jednego pliku do przechowywania liczników odwołań do dowolnej liczby stron witryny. Nie jest to efektywny sposób, ale pokazuje ideę takiego licznika. W skrypcie tym sprawdzamy za pomocą funkcji is_file() czy istnieje plik śladu. Jeżeli plik ten istnieje, jego kolejne linie są odczytywane i analizowane. Każda linia zawiera pełną ścieżkę dostępu do skryptu, znak tabulacji i wartość licznika. Linia taka jest dzielona przy pomocy funkcji explode() na nazwę skryptu i wartość licznika a następnie wartości te są zapisywane w tablicy asocjacyjnej. Jeżeli chcesz, możesz użyć tej tablicy do wyświetlenia liczników dla wszystkich stron witryny a nie tylko bieżącej strony. Po wypełnieniu tablicy uaktualniany jest licznik odwołań do bieżącej strony (rozpoznawanej przy użyciu zmiennej globalnej PHP $PATH_TRANSLATED) i wartość ta jest przypisywana do zmiennej $aPageAccessCount. Na koniec cała tablica jest zapisywana do pliku śladu.
Na wydruku 4.2 pokazane jest strona demonstrująca jak łatwo można użyć tego licznika. Jeżeli szukasz takiego mechanizmu do twojej witryny, należy pamiętać, że jest to bardzo nieefektywne rozwiązanie. Bardziej efektywne jest odczytywanie i zapis tylko jednej wartości a nie całego pliku.
Wydruk 4.2. Użycie skryptu z wydruku 4.1
<?php
include( “auto_counter.php” );
?>
<html>
<head>
<title>Strona testowa 1</title>
</head>
<body>
Strona ta była oglądana <b>
<?php
print( $aPageAccessCount );
?>
</b> razy.
</body>
</html>