Spis treści

Laboratorium, PHP # 3

Ćwiczenie 1: Ciastka

Przetestuj działanie poniższego kodu:

  1. jaka jest zawartość zmiennej $_COOKIE przy pierwszym uruchomnieniu,
  2. 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:

  1. uruchom skrypt,
  2. odczekaj ok. 5 sekund, uruchom ponownie,
  3. 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:

  1. przy pierwszej wizycie użytkownika poprosi o jego imię,
  2. przy każdej następnej wyświetli imię,
  3. dodaj datę i godzinę ostatniej wizyty, oraz
  4. 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.

  1. Do galerii można dodawać obrazki w formacie JPG, które są przechowywane w wybranym katalogu.
  2. 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.
  3. 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<br>';
  $start=time();
  sem_acquire($sem);
  echo 'Jestem w sekcji krytycznej<br>';
  /* tutaj kod sekcji krytycznej */
  sem_release($sem);
  echo 'Wyjscie z sekcji krytycznej<br>';
  echo 'Czas wykoania: '.(time()-$start).'<br>';
} else {echo 'Problemy z semaforem...<br>';}

Działanie w/w kodu możesz przetestować w poniższy sposób:

  1. dodaj odpowiednie znaczniki i umieść go w pliku z rozszerzeniem .php na serwerze,
  2. korzystając z przeglądarki uruchom program,
  3. korzystając z pomocy innego studenta uruchomcie ten sam program współbieżnie,
  4. 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<br>';
$start=time();
$fp = fopen('semafor', 'r+');
if (flock($fp, LOCK_EX)) {
  echo 'Jestem w sekcji krytycznej<br>';
  /* tutaj kod sekcji krytycznej */
  flock($fp, LOCK_UN);
  echo 'Wyjscie z sekcji krytycznej<br>';
  echo 'Czas wykoania: '.(time()-$start).'<br>';
} else { echo 'Problemy z blokada...<br>';}
fclose($fp);

Działanie w/w kodu możesz przetestować w poniższy sposób:

  1. dodaj odpowiednie znaczniki i umieść go w pliku z rozszerzeniem .php na serwerze,
  2. w tym samym katalogu utwórz plik semafor,
  3. za pomocą przeglądarki uruchom skrypt,
  4. korzystając z pomocy innego studenta uruchomcie skrypt współbieżnie,
  5. jaki jest czas wykonania skryptu w w/w przypadkach?