====== Laboratorium, PHP # 3 ======
===== Ćwiczenie 1: Ciastka =====
Przetestuj działanie poniższego kodu:
- jaka jest zawartość zmiennej ''$_COOKIE'' przy pierwszym uruchomnieniu,
- a jaka przy kolejnych?
setcookie('ciastko','smaczne');
var_dump($_COOKIE);
===== Ćwiczenie 2: Ciastka, data przydatności do spożycia ======
Przetestuj działanie poniższego kodu:
- uruchom skrypt,
- odczekaj ok. 5 sekund, uruchom ponownie,
- odczekaj ok. 15 sekund, uruchom ponownie, czy coś się zmieniło?
define('CIACHO','mojeciasteczko');
if (!setcookie(CIACHO,'dane',time()+10)) echo 'nie moge wysłać ciastka...';
if (isset($_COOKIE[CIACHO]))
echo $_COOKIE[CIACHO];
else
echo 'brak danych';
===== Ćwiczenie 3: Identyfikacja użytkownika (przeglądarki) =====
Napisz pojedynczy skrypt PHP, który:
- przy pierwszej wizycie użytkownika poprosi o jego imię,
- przy każdej następnej wyświetli imię,
- dodaj datę i godzinę ostatniej wizyty, oraz
- mechanizm zapominania imienia (np. przy przesłaniu metodą GET atrybutu ''zapomnij'': ''http://..../skrypt.php?zapomnij'').
Powyższy mechanizm możesz wykorzystać, aby np. dodać do galerii logowanie użytkownika, tak aby nie trzeba było za każdym razem podawać nazwy użytkownika oraz hasła przy dodawaniu lub usuwaniu obrazków.
===== Ćwiczenie 4: Sesje ======
Powtórz poprzednie ćwiczenie korzystając z mechanizmu sesji. Możesz wykorzystać poniższy kod.
session_start();
if (isset($_GET['zapomnij'])){
echo 'Zapominam...';
unset($_SESSION['moje']);
} else {
if (!empty($_SESSION['moje'])) {
echo $_SESSION['moje'];
} else {
$_SESSION['moje']='jest';
}
}
===== Ćwiczenie 5: Wyścig w Galerii ======
Skorzystaj z kodu galeri z poprzednich ćwiczeń, biorąc pod uwagę poniższe wymagania.
- Do galerii można dodawać obrazki w formacie JPG, które są przechowywane w wybranym katalogu.
- Nazwy obrazków są kolejnymi liczbami naturalnymi zaczynając od 1 tj.: ''1.jpg'', ''2.jpg'' itd., tak aby można było łatwo wyświetlić obrazki w kolejności dodawania.
- Zaprogramuj sekcję krytyczną, tak aby nie doszło do nadpisania współbieżnie dodawanych obrazków.
Podpowiedź: nazwa dodawanego obrazka = ilość plików w katalogu z obrazkami + 1, np.:
$ile=count(glob('*.jpg'));
==== Informacje dodatkowe: Semafory ====
W poniższym kodzie zastąp wartość KLUCZ unikalną w ramach grupy laboratoryjnej liczbą -- możesz użyć identyfikatora użytkownika na serwerze (polecenie ''id'' po zalogowaniu na serwere za pomocą ''ssh'').
define('KLUCZ',123456);
$sem=sem_get(KLUCZ);
if ($sem != FALSE) {
echo 'Wejscie do sekcji krytycznej
';
$start=time();
sem_acquire($sem);
echo 'Jestem w sekcji krytycznej
';
/* tutaj kod sekcji krytycznej */
sem_release($sem);
echo 'Wyjscie z sekcji krytycznej
';
echo 'Czas wykoania: '.(time()-$start).'
';
} else {echo 'Problemy z semaforem...
';}
Działanie w/w kodu możesz przetestować w poniższy sposób:
- dodaj odpowiednie znaczniki i umieść go w pliku z rozszerzeniem ''.php'' na serwerze,
- korzystając z przeglądarki uruchom program,
- korzystając z pomocy innego studenta uruchomcie ten sam program współbieżnie,
- jaki jest czas wykonania programu w w/w przypadkach?
==== Informacje dodatkowe: Blokowanie dostępu za pomocą pliku (file lock) =====
Dany jest kod:
echo 'Wejscie do sekcji krytycznej
';
$start=time();
$fp = fopen('semafor', 'r+');
if (flock($fp, LOCK_EX)) {
echo 'Jestem w sekcji krytycznej
';
/* tutaj kod sekcji krytycznej */
flock($fp, LOCK_UN);
echo 'Wyjscie z sekcji krytycznej
';
echo 'Czas wykoania: '.(time()-$start).'
';
} else { echo 'Problemy z blokada...
';}
fclose($fp);
Działanie w/w kodu możesz przetestować w poniższy sposób:
- dodaj odpowiednie znaczniki i umieść go w pliku z rozszerzeniem ''.php'' na serwerze,
- w tym samym katalogu utwórz plik ''semafor'',
- za pomocą przeglądarki uruchom skrypt,
- korzystając z pomocy innego studenta uruchomcie skrypt współbieżnie,
- jaki jest czas wykonania skryptu w w/w przypadkach?