programmation_serveur_php_python_nodejs
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
programmation_serveur_php_python_nodejs [2019/11/27 21:21] – joseph | programmation_serveur_php_python_nodejs [2020/05/19 08:29] (Version actuelle) – joseph | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
# Comment programmer un serveur web ? | # Comment programmer un serveur web ? | ||
- | * Côté client (c'est à dire ce qui s' | + | * **Côté client** (c'est à dire ce qui s' |
- | * Mais comment programmer ce qu'il se passe *côté serveur* ? Exemple : lorsqu' | + | * Mais comment programmer ce qu'il se passe **côté serveur** ? Exemple : lorsqu' |
C'est ce que nous allons voir ici. | C'est ce que nous allons voir ici. | ||
- | # PHP | + | ## PHP |
PHP est **le** langage par excellence pour programmer côté serveur. Statistique 2018 : | PHP est **le** langage par excellence pour programmer côté serveur. Statistique 2018 : | ||
Ligne 24: | Ligne 24: | ||
?> | ?> | ||
| | ||
- | * C'est tout! Il suffit d' | + | * C'est tout! Il suffit d' |
Avantages : | Avantages : | ||
- | * Il y a souvent rien à installer, car Apache et PHP sont installés par défaut sur les hébergements webs mutualisés. En gros, que se passe-t-il ? Lorsque Apache reçoit une requête pour `http:// | + | * Il y a souvent rien à installer, car Apache et PHP sont installés par défaut sur les hébergements webs mutualisés. En gros, que se passe-t-il ? Lorsque Apache reçoit une requête pour `http:// |
* Cela est très rapide (à chaque requête, le process Apache qui s' | * Cela est très rapide (à chaque requête, le process Apache qui s' | ||
Ligne 34: | Ligne 34: | ||
* On peut [mixer très facilement du HTML et du PHP](https:// | * On peut [mixer très facilement du HTML et du PHP](https:// | ||
- | # Python | + | ## Python |
- | ## Méthode simple | + | Dans toute la suite, on supposera qu'un classique serveur web Apache tourne sur la machine. On supposera aussi que le `VirtualHost` soit réglé en `AllowOverride All` (c'est la valeur par défaut pour certaines versions d' |
- | Il y a une [méthode | + | ``` |
+ | < | ||
+ | ServerName example.com | ||
+ | DocumentRoot / | ||
+ | < | ||
+ | AllowOverride All | ||
+ | Require all granted | ||
+ | </ | ||
+ | </ | ||
+ | ``` | ||
+ | |||
+ | |||
+ | ### Méthode simple (old-school): | ||
+ | |||
+ | * Installer [mod_cgi](http:// | ||
+ | |||
+ | * Créer un fichier `/ | ||
+ | ``` | ||
+ | # | ||
+ | print(" | ||
+ | print("" | ||
+ | print(" | ||
+ | ```` | ||
+ | Dans `.htaccess`, | ||
+ | ``` | ||
+ | Options +ExecCGI | ||
+ | SetEnv PYTHONIOENCODING utf8 | ||
+ | AddHandler cgi-script .py | ||
+ | ``` | ||
+ | |||
+ | * Visitez http:// | ||
+ | |||
+ | NB: Utiliser CGI revient à démarrer un nouveau process (= un nouvel interpréteur Python) pour chaque requête, ce qui est potentiellement plus lent (dans mes tests 90ms Python 2.7 / 140ms Python 3, au lieu de 34ms avec `mod_python` ou `mod_wsgi`) que les méthodes détaillées ci-après. | ||
+ | |||
+ | |||
+ | ### Méthode simple: mod_python | ||
+ | |||
+ | Il y a une [méthode | ||
1. Installer le module `mod_python` : | 1. Installer le module `mod_python` : | ||
Ligne 54: | Ligne 91: | ||
return("< | return("< | ||
- | 4. Ouvrir https:// | + | 4. Ouvrir |
+ | |||
+ | Avantages : | ||
+ | |||
+ | * logique toute simple, identique à ce qu'on fait en PHP | ||
+ | |||
+ | * pas de librairie / framework à utiliser, c'est donc très léger | ||
+ | |||
+ | * *" | ||
+ | |||
+ | ### Méthode classique: avec un framework web (Bottle, Flask, etc.) | ||
+ | |||
+ | La méthode la plus courante pour faire du web en Python est assez différente des 2 méthodes présentées précédemment. | ||
+ | |||
+ | Contrairement à avoir, comme précédemment, | ||
+ | |||
+ | Exemple : | ||
+ | |||
+ | from bottle import route, run, template | ||
+ | |||
+ | @route('/ | ||
+ | def hello(name): | ||
+ | return template('< | ||
+ | |||
+ | @route('/' | ||
+ | def index(): | ||
+ | return ' | ||
+ | |||
+ | run(host=' | ||
+ | |||
+ | On utilise classiquement un framework pour ça : | ||
+ | |||
+ | * [bottle.py](https:// | ||
+ | * [Flask](https:// | ||
+ | * Django, réputé comme très complet, jamais testé personnellement | ||
+ | |||
+ | Le code précédent fonctionne bien, mais " | ||
+ | |||
+ | Comment donc " | ||
+ | |||
+ | * **Soit avec une règle de réécriture d'URL pour rediriger les requêtes, d' | ||
+ | |||
+ | Mettre ceci dans le `.htaccess` : | ||
+ | ``` | ||
+ | RewriteEngine On | ||
+ | RewriteRule /(.*) http:// | ||
+ | ``` | ||
+ | Il faut aussi se débrouiller manuellement pour que le script Python tourne **sans arrêt**, même si on ferme la fenêtre du terminal / le SSH. Exemple dans Bash : | ||
+ | ``` | ||
+ | nohup python mysever.py & | ||
+ | ``` | ||
+ | ou avec `screen` (voir un tuto à ce sujet) : `screen -S pythonserver`, | ||
+ | |||
+ | * **Soit en faisant un " | ||
+ | |||
+ | Ajouter cela dans la configuration Apache `< | ||
+ | ``` | ||
+ | ProxyPass / http:// | ||
+ | ProxyPassReverse / http:// | ||
+ | ``` | ||
+ | De même que pour le point précédent, | ||
+ | |||
+ | * **Soit avec `mod_wsgi`** | ||
+ | |||
+ | Cette méthode est souvent plébiscitée, | ||
+ | |||
+ | On installe ce module Apache avec : | ||
+ | ``` | ||
+ | apt-get install libapache2-mod-wsgi | ||
+ | ``` | ||
+ | On remplace la dernière ligne de l' | ||
+ | ``` | ||
+ | < | ||
+ | ServerName example.com | ||
+ | WSGIScriptAlias / / | ||
+ | < | ||
+ | AllowOverride All | ||
+ | Require all granted | ||
+ | </ | ||
+ | </ | ||
+ | ``` | ||
+ | L' | ||
+ | |||
+ | Par contre, en testant `mod_wsgi` je suis tombé sur quelques problèmes: `import module` qui ne marche pas alors qu'il est [dans le même répertoire](https:// | ||
+ | |||
+ | ## Javascript | ||
+ | |||
+ | Oui on peut faire du Javascript côté serveur, c'est le cas notamment avec le framework très populaire [NodeJS](https:// | ||
+ | |||
+ | Le principe est le même que dans le paragraphe précédemment, | ||
+ | |||
+ | node app.js | ||
+ | |||
+ | Voici le code pour `app.js`: | ||
+ | |||
+ | var express = require(' | ||
+ | var app = express(); | ||
+ | app.get('/', | ||
+ | res.send(' | ||
+ | }); | ||
+ | app.listen(8080, | ||
+ | console.log(' | ||
+ | }); | ||
+ | |||
+ | |||
+ | ## C | ||
+ | |||
+ | Pour les puristes ! In progress... | ||
+ | |||
+ | ## A voir (divers) | ||
+ | |||
+ | ### A lire... | ||
+ | |||
+ | Pour bien voir la différence CGI / FastCGI / mod_wsgi / mod_python: | ||
+ | |||
+ | https:// | ||
+ | |||
+ | |||
+ | ### Comparaison de performance mod_php vs. mod_python | ||
+ | |||
+ | Créons un fichier `test.py`: | ||
+ | |||
+ | import time | ||
+ | def index(req): | ||
+ | return(str(time.time())) | ||
+ | |||
+ | un fichier `test.php`: | ||
+ | |||
+ | <?php | ||
+ | echo time(); | ||
+ | ?> | ||
+ | |||
+ | le `.htaccess` qui permet d' | ||
+ | |||
+ | AddHandler mod_python .py | ||
+ | PythonHandler mod_python.publisher | ||
+ | |||
+ | et enfin `index.html` pour tester le temps que prend chaque requête: | ||
+ | |||
+ | <div id=" | ||
+ | <div id=" | ||
+ | |||
+ | <script type=" | ||
+ | var start; | ||
+ | |||
+ | document.getElementById(" | ||
+ | start = Date.now() | ||
+ | var xhr = new XMLHttpRequest(); | ||
+ | xhr.open(" | ||
+ | xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); | ||
+ | xhr.send("" | ||
+ | } | ||
+ | |||
+ | document.getElementById(" | ||
+ | start = Date.now() | ||
+ | var xhr = new XMLHttpRequest(); | ||
+ | xhr.open(" | ||
+ | xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); | ||
+ | xhr.send("" | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Ouvrons `index.html` dans le navigateur et regardons le contenu de la console. | ||
+ | |||
+ | Bilan : | ||
+ | * la différence entre `mod_php` et `mod_python` est imperceptible, | ||
- | ## La méthode classique | + | * je craignais que `mod_python` relance un interpréteur Python *pour chaque requête* (ce qui aurait été loooonnnnng... probablement au moins 100 ou 200 ms?) mais fort heureusement, |
- | # NodeJS | ||
</ | </ | ||
{{tag> | {{tag> |
programmation_serveur_php_python_nodejs.1574889699.txt.gz · Dernière modification : 2019/11/27 21:21 de joseph