Simulare lo streaming video

Implementazione in PHP

L’implementazione che ho previsto si divide in due pagine: controllo.php e immagine.php.

La prima servirà per verificare la disponibilità e l’eliminazione delle immagini obsolete, la seconda a mostrarci solo l’immagine che effettivamente è disponibile.

Andiamo ad implementare prima il codice di immagine.php molto più semplice e che semplificherà l’implementazione successiva di controllo.php

<? 
$folder = '/images/wait/' 
$file = file($_SERVER['DOCUMENT_ROOT'] . $folder . 'tobeused.txt'); 
$img_fn = $file[0]; 
$filename = $_SERVER['DOCUMENT_ROOT'] . $folder . $img_fn; 
 
$f = fopen($filename, 'r'); 
$buffer = fread($f, filesize($filename)); 
fclose($f); 
header("Content-Type: image/gif"); 
echo($buffer); 
?>

Il funzionamento è abbastanza semplice :

  1. Accediamo ad un file tobeused.txt (To Be Used) e ne leggiamo l’intero contenuto. Questo file conterrà come unica informazione, il nome dell’immagine attualmente in uso.
  2. Quindi leggiamo in un buffer l’immagine da usare, e la disegnamo a video impostando opportunamente il Content Type dell’informazione che inviamo al client (in questo caso image/gif).

La pagina controllo.php invece avrà il compito specifico di monitorare il numero di files presenti nella cartella e cancellare il file immagine più vecchio non in uso, aggiornando il file tobeused.txt in modo che riporti sempre il nome del file immagine da utilizzare.

Guardiamo in dettaglio questo semplice file:

<? 
// file: controllo.php 

$timeout_aggiornamento = 10;    # Il timeout è espresso in secondi 
$folder = '/images/wait/'; 
$immagine_da_usare = ''; 
$immagine_da_rimuovere = ''; 
$file_immagine_in_uso = $_SERVER['DOCUMENT_ROOT'] . $folder . 'tobeused.txt'; 
$file = file($file_immagine_in_uso); 
$immagine_in_uso = $file[0]; 
$immagine_disponibile = $_SERVER['DOCUMENT_ROOT'] . $folder . 'img.gif'; 

if(file_exists($immagine_disponibile)){ 
  # Se esiste il file img.gif, vuol dire che esiste una ripresa aggiornata del paesaggio. 

  # Array predisposto per il controllo del nome da attribuire 
  # al nuovo file (img.gif) 
  $image_list = array(
      'img3.gif', 
      'img1.gif', 
      'img2.gif', 
      'img3.gif', 
      'img1.gif' ); 
  $immagine_da_rimuovere     = ''; 
  $immagine_da_usare = ''; 
  for($i=1; $i<4; $i++){ 
    if($immagine_in_uso == $image_list[$i]){ 
      $immagine_da_rimuovere     = $image_list[$i-1]; 
      $immagine_da_usare = $image_list[$i+1]; 
      break; 
    } 
  } 
  $nuova_immagine_disponibile = $_SERVER['DOCUMENT_ROOT'] . 
                                $folder . $immagine_da_usare; 
  $file_immagine_da_rimuovere = $_SERVER['DOCUMENT_ROOT'] . 
                                $folder . $immagine_da_rimuovere; 
  # Imposta nuova immagine 
  rename($immagine_disponibile, $nuova_immagine_disponibile); 
  $fp = fopen($file_immagine_in_uso,'w+'); 
  fwrite($fp, $immagine_da_usare); 
  fclose($fp); 
  unlink($file_immagine_da_rimuovere); 
} 
?> 
<html> 
  <head> 
    <meta http-equiv="refresh" content="<?=$timeout_aggiornamento?>" /> 
    <title>Monitoraggio file per simulazione streaming</title> 
  </head> 
  <body> 
    <h1>Monitoraggio</h1> 
    <p> 
      Ultimo aggiornamento al: 
      <?=date('d/m/Y') . ' ore: ' . date('H.i.s') ?> 
    </p>
    <p> 
      <strong>Immagine attualmente in uso: </strong> 
      <?=$immagine_in_uso?> <br /> 
      <strong>Immagine di prossim utilizzo: </strong>
      <?=$immagine_da_usare?> <br /> 
      <strong>Immagine attualmente rimossa: </strong>
      <?=$immagine_da_rimuovere?> <br /> 
    </p> 
 </body> 
</html>

Questa pagina sarà aperta sempre nel browser e non richiederà interazione con l’utente: esegue un elaborazione lato server, e mostra una specie di report dell’attività semplificato a video così se un utente vuole sapere cosa è successo all’ultimo aggiornamento potrà sempre saperlo.

Vi ricordate il discorso del barista qualche paragrafo più indietro? Il file controllo.php è la sua implementazione.

Credo che non ci sia bisogno di troppe spiegazioni per le quali non mi dilungherò oltre.

L’unico grosso difetto di questa procedura è il refresh completo della pagina: se un sito per qualche strana ragione smette di funzionare (e credetemi, succede ai siti internet ) la risposta del server sarà un timeout con la conseguenza che la pagina non si aggiornerà più.

Per una questione di complessità posso suggerire di implementare (come sto facendo in questo momento) una soluzione simile a quella sopra indicata ma facendo uso di AJAX così che anche se la pagina dovesse dare una risposta di errore qualsiasi, il controllore funzionerà ancora e consentirà al successivo refresh di valicare le informazioni. Ma questo sarà oggetto di un altro tutorial!


Pubblicato

in

,

da

%d blogger hanno fatto clic su Mi Piace per questo: