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.php
Aiguillage des requêtes :
.php
index.php
, qui passe la main au routeurURL | 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 :
HomeController
src/Controller/HomeController.php
http://localhost:8000/
HomeController
indexAction()
Route :
Chemin | Nom | Args |
/ |
home |
TodoController
src/Controller/TodoController.php
http://localhost:8000/todo/
http://localhost:8000/todo/42
TodoController
:
listAction()
showAction(id)
Chemin | Nom | Args |
/todo/ |
todo_list |
|
/todo/{id} |
todo_show |
id |
Définition des reoutes 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 ...;
}
}
{i}
)i
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