http(s)://example.com/hello)Apache dans une VM
Serveur Web allumé en permanence. Application lancées à la demande.
Si plusieurs requêtes de plusieurs clients différents au même moment, même programme exécuté plusieurs fois en parallèle
Gère plusieurs clients se connectant simultanément :
… des centaines par secondes, OK ?
Remarque : par défaut, les applications se terminent à la fin de la réponse à une requête. La requête 3 redémarre une requête. L’exécution pour la requête 1 du même client est oubliée.
Gère plusieurs clients se connectant simultanément :
… des centaines par secondes, OK ?
Simplifions :
Exécution :
ou
Common Gateway Interface
Obsolète !
Au final, peu importe : nos programmes sont démarrés sur la plate-forme d’exécution le temps de traiter une requête, puis s’arrêtent.
Serveur d’exécution PHP dédié : PHP-FPM (FastCGI Process Manager)
PHP « derrière » Apache, avec php-fpm
Exemple: avec FTP sur serveur Apache + PHP + SGBD
Git push vers un hébergement Cloud PAAS (Platform as a Service)
Exemple: avec commande symfony deploy sur platform.sh
Objecif : programmation événementielle :
Exemple :
GET sur /todo/list appelleTodoController::index()GET sur /todo/show/{i} appelle TodoController::show($todo)POST)
En POSIX, exécution d’un processus :
0 (succès)!= 0 (erreurs)stdin)stderr) ?Idem en CGI, FastCGI, etc.
Construction de la Réponse HTTP
Code de retour -> Code de statut
Exemple :
| Succès | 0 | 
⇒ | 200 | 
| Erreur | != 0 | 
⇒ | 5xx | 
stdout) telle-quelle dans réponse HTTP : attention au format
stderr) : dans les logs du serveur ?Permet de tester comportement serveur d’application PHP simplement en local
Démarrage :
php -S localhost:8000 -t public/  
public/, (ou par défaut, par public/index.php)Exemples :
| URL | Programme | Args | 
|---|---|---|
http://localhost:8000/test.php | 
public/test.php | 
|
http://localhost:8000/test.php?hello | 
public/test.php | 
hello | 
http://localhost:8000/ | 
public/index.php | 
|
http://localhost:8000/hello | 
public/index.php | 
hello | 
http://localhost:8000/index.php?hello | 
public/index.php | 
hello | 
Principes d’une Application Programming Interface (API) objet d’une application Web, invoquée par le serveur d’application, dans un paradigme de programmation évenementielle.
Exemple : envoi du message « execute » à une commande
  class Application {
      public run() {
          //...
          $command = new ListTodosCommand();
          $res = $command->execute();
Identique dans beaucoup de systèmes de programmation d’interfaces (GUI, HTTP, …) :
Réception d’une requête HTTP => appel de méthode
Appel de méthodes dans une classe conçue pour gérer des actions (HTTP) sur des ressources (Web)
Patron de conception Model, Vue, Controller (MVC)
index.phpAiguillage des requêtes :
.phpindex.php, qui passe la main au routeur| URL | Programme | Args | 
|---|---|---|
http://localhost:8000/test.php | 
404 | |
http://localhost:8000/ | 
public/index.php | 
NULL | 
http://localhost:8000/hello | 
public/index.php | 
hello | 
http://localhost:8000/blah/plop | 
public/index.php | 
blah/plop | 
Faire la conversion entre le mode d’invocation classique de PHP, hérité des CGI d’origine, et le mode objet moderne.
Le programmeur Symfony n’a plus qu’à s’occuper :
HomeControllersrc/Controller/HomeController.phphttp://localhost:8000/HomeController
indexAction()Route :
| Chemin | Nom | Args | 
/ | 
home | 
TodoControllersrc/Controller/TodoController.phphttp://localhost:8000/todo/http://localhost:8000/todo/42TodoController :
listAction()showAction(id)| Chemin | Nom | Args | 
/todo/ | 
todo_list | 
|
/todo/{id} | 
todo_show | 
id | 
Définition des routes avec annotations Route (attributs PHP 8)
class TodoController extends Controller {
    /**
     * Finds and displays a todo entity.
     */
    #[Route('/todo/{id}', name: 'todo_show',
            requirements: ['id' => '\d+'], methods: ['GET']) ]
    public function showAction(Todo $todo): Response {
        return ...;
    }
}
{id})id est un entier)Traitement d’un événement (réception d’une requête HTTP)
Temps de vie de l’application : appel d’une méthode de contrôleur
Répété à chaque requête
Route