Cet atelier a pour but de vous permettre de tester PHP dans 3 cas d'utilisation :
en script web,
en script cgi,
en ligne de commande.
Mais aussi d'installer et de tester la configuration Php5.
Vérification de la présence des outils nécessaires pour la réalisation du tp :
[agilan@adminbdd ~]$ yum list installed mysql php httpd php-cli
Loaded plugins: fastestmirror, rhnplugin *Note* Red Hat Network repositories are not listed below. You must run this command as root to access RHN repositories. Installed Packages httpd.x86_64 2.2.3-63.el5.centos installed mysql.x86_64 5.0.77-4.el5_6.6 installed php.x86_64 5.1.6-32.el5 installed php-cli.x86_64 5.1.6-32.el5 installed
Créer une page exemple.php dans votre racine web (généralement /var/www/html ou /var/www/web) contenant le code :
<html> <head><title>Exemple</title></head> <body> <?php echo "Hello World"; ?> </body> </html>
Vérifiez le bon fonctionnement de votre script en exécutant cette page avec un navigateur.
Ajoutez dans ce fichier la ligne <? print_r($_ENV); ?>, puis exécutez-le. Que constatez-vous ?
Comme c'est totalement illisible en l'état, je vais utiliser à la place var_dump(), le tout encadré par la balise <pre>.
J'obtiens ainsi comme résultat :
array(21) { ["MANPATH"]=> string(27) ":/var/opt/netkit/man" ["NETKIT_HOME"]=> string(22) "/var/opt/netkit" ["HOSTNAME"]=> string(8) "adminbdd" ["SHELL"]=> string(9) "/bin/bash" ["TERM"]=> string(5) "xterm" ["HISTSIZE"]=> string(4) "1000" ["USER"]=> string(4) "root" ["LS_COLORS"]=> string(440) "no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" ["OPENNMS_HOME"]=> string(12) "/opt/opennms" ["MAIL"]=> string(20) "/var/spool/mail/root" ["PATH"]=> string(29) "/sbin:/usr/sbin:/bin:/usr/bin" ["INPUTRC"]=> string(12) "/etc/inputrc" ["PWD"]=> string(17) "/etc/httpd/conf.d" ["LANG"]=> string(1) "C" ["SHLVL"]=> string(1) "3" ["HOME"]=> string(5) "/root" ["LOGNAME"]=> string(4) "root" ["LESSOPEN"]=> string(24) "|/usr/bin/lesspipe.sh %s" ["HISTTIMEFORMAT"]=> string(17) "%h/%d - %H:%M:%S " ["G_BROKEN_FILENAMES"]=> string(1) "1" ["_"]=> string(15) "/usr/sbin/httpd" }
Ceci est très ressemblant, à peu de choses près, au résultat de la commande env.
[adminbdd www]$ env
MANPATH=:/var/opt/netkit/man NETKIT_HOME=/var/opt/netkit/ HOSTNAME=adminbdd SHELL=/bin/bash TERM=xterm HISTSIZE=1000 USER=root LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: OPENNMS_HOME=/opt/opennms MAIL=/var/spool/mail/root PATH=/var/opt/netkit/bin:/usr/local/Trolltech/Qt-4.7.3/bin:/usr/local/Trolltech/Qt-4.7.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/opennms/bin:/root/bin INPUTRC=/etc/inputrc PWD=/var/www/html/monsiteweb/www LANG=fr_FR.UTF-8 SHLVL=1 HOME=/root LOGNAME=root LESSOPEN=|/usr/bin/lesspipe.sh %s DISPLAY=localhost:10.0 HISTTIMEFORMAT=%h/%d - %H:%M:%S G_BROKEN_FILENAMES=1 XAUTHORITY=/root/.xauth65drG5 _=/bin/env OLDPWD=/root
n.b : Remarquez ici que votre fichier n'a pas besoin des droits d'exécution, c'est votre serveur web qui l'exécute avec ses propres droits.
Tapez dans un shell la ligne de commande :
php -r 'print_r(get_defined_constants());'
Essayons :
[adminbdd www]$ php -r 'print_r(get_defined_constants());'
Array ( [E_ERROR] => 1 [E_WARNING] => 2 [E_PARSE] => 4 [E_NOTICE] => 8 [E_STRICT] => 2048 [E_CORE_ERROR] => 16 [E_CORE_WARNING] => 32 [E_COMPILE_ERROR] => 64 [E_COMPILE_WARNING] => 128 [E_USER_ERROR] => 256 [E_USER_WARNING] => 512 [E_USER_NOTICE] => 1024 [E_ALL] => 2047 [TRUE] => 1 [FALSE] => [NULL] => [ZEND_THREAD_SAFE] => [PHP_VERSION] => 5.1.6 [PHP_OS] => Linux [PHP_SAPI] => cli [DEFAULT_INCLUDE_PATH] => .:/usr/share/pear:/usr/share/php [PEAR_INSTALL_DIR] => /usr/share/pear [PEAR_EXTENSION_DIR] => /usr/lib64/php/modules [PHP_EXTENSION_DIR] => /usr/lib64/php/modules [PHP_PREFIX] => /usr [PHP_BINDIR] => /usr/bin [PHP_LIBDIR] => /usr/lib64 [PHP_DATADIR] => /usr/share [PHP_SYSCONFDIR] => /etc [PHP_LOCALSTATEDIR] => /var [PHP_CONFIG_FILE_PATH] => /etc [PHP_CONFIG_FILE_SCAN_DIR] => /etc/php.d [PHP_SHLIB_SUFFIX] => so [PHP_EOL] => [PHP_INT_MAX] => 9223372036854775807 [PHP_INT_SIZE] => 8 [PHP_OUTPUT_HANDLER_START] => 1 [PHP_OUTPUT_HANDLER_CONT] => 2 [PHP_OUTPUT_HANDLER_END] => 4 [UPLOAD_ERR_OK] => 0 [UPLOAD_ERR_INI_SIZE] => 1 [UPLOAD_ERR_FORM_SIZE] => 2 [UPLOAD_ERR_PARTIAL] => 3 [UPLOAD_ERR_NO_FILE] => 4 [UPLOAD_ERR_NO_TMP_DIR] => 6 [UPLOAD_ERR_CANT_WRITE] => 7 [LIBXML_VERSION] => 20626 [LIBXML_DOTTED_VERSION] => 2.6.26 [LIBXML_NOENT] => 2 [LIBXML_DTDLOAD] => 4 [LIBXML_DTDATTR] => 8 [LIBXML_DTDVALID] => 16 [LIBXML_NOERROR] => 32 [LIBXML_NOWARNING] => 64 [LIBXML_NOBLANKS] => 256 [LIBXML_XINCLUDE] => 1024 [LIBXML_NSCLEAN] => 8192 [LIBXML_NOCDATA] => 16384 [LIBXML_NONET] => 2048 [LIBXML_COMPACT] => 65536 [LIBXML_NOXMLDECL] => 2 [LIBXML_NOEMPTYTAG] => 4 [LIBXML_ERR_NONE] => 0 [LIBXML_ERR_WARNING] => 1 [LIBXML_ERR_ERROR] => 2 [LIBXML_ERR_FATAL] => 3 [XML_ERROR_NONE] => 0 [XML_ERROR_NO_MEMORY] => 1 [XML_ERROR_SYNTAX] => 2 [XML_ERROR_NO_ELEMENTS] => 3 [XML_ERROR_INVALID_TOKEN] => 4 [XML_ERROR_UNCLOSED_TOKEN] => 5 ...
Cette instruction permet de lister toutes les constantes déclarées par PHP pendant l'exécution de la ligne de commande.
La commande php -r 'print_r($_ENV);' permet ainsi d'obtenir le même résultat obtenu que précédemment (quoique bizarrement il semble y avoir plus de variable que durant l'exécution à travers un navigateur web).
Créer un fichier exemple.php contenant :
#!/usr/local/bin/php
<?php echo "Hello World\n"; print_r($_ENV); ?>
Exécutez ce fichier à l'aide d'une console en tapant la commande ./exemple.php. Que constatez-vous ?
[adminbdd www]$ ./exemple.php
Hello world Array ( [MANPATH] => :/var/opt/netkit/netkit/man [NETKIT_HOME] => /var/opt/netkit/netkit [HOSTNAME] => adminbdd [SHELL] => /bin/bash [TERM] => xterm [HISTSIZE] => 1000 [USER] => root [LS_COLORS] => no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: [OPENNMS_HOME] => /opt/opennms [MAIL] => /var/spool/mail/root [PATH] => /var/opt/netkit/netkit/bin:/usr/local/Trolltech/Qt-4.7.3/bin:/usr/local/Trolltech/Qt-4.7.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/opennms/bin:/root/bin [INPUTRC] => /etc/inputrc [PWD] => /var/www/html/monsiteweb/www [LANG] => fr_FR.UTF-8 [SHLVL] => 1 [HOME] => /root [LOGNAME] => root [LESSOPEN] => |/usr/bin/lesspipe.sh %s [HISTTIMEFORMAT] => %h/%d - %H:%M:%S [G_BROKEN_FILENAMES] => 1 [_] => ./exemple.php [OLDPWD] => /root )
On obtient toujours la même chose (à peu de chose près encore une fois).
Comme avec mon script PHP j'obtiens avec horreur un #!/usr/bin/php, je décide de faire un script CGI en Python.
Voici ma configuration :
ScriptAlias /cgi-bin/ /var/www/cgi-bin/ <Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all AddHandler default-handler .html .htm </Directory>
Le script Python :
#!/usr/bin/env python print "Content-Type: text/html" print print """\ <html> <head><title></title></head> <body> <h2>Hello World !</h2> </body> </html> """
Vous devrez créer un programme calculatrice en PHP prenant trois arguments :
une valeur,
un opérateur (+ - / %),
une valeur,
Et calculer le résultat de l'opération.
n.b : pour récupérer un argument passé en ligne de commande, vous devrez utiliser les variables argc et argv qui contiennent respectivement le nombre d'arguments passés et un tableau de valeurs des arguments récupérés.
Gérez ensuite le cas de n arguments avec une suite valeur, opérateur, valeur de telle manière que votre calculatrice puisse vous gérer plusieurs opérations à la fois. Par exemple qu'il puisse calculer le résultat de : 3 + 3 / 2.
Voici le code de ma calculatrice ultra-simpliste (ne gère pas la priorité des opérateurs) :
<?php if ($argc > 1) { $i = 2; $operateur; $resultat = $argv[1]; while ($i < $argc) { $operateur = $argv[$i]; switch ($operateur) { case '+': $resultat += intval($argv[$i + 1]); break; case '-': $resultat -= intval($argv[$i + 1]); break; case '/': $resultat /= intval($argv[$i + 1]); break; case '*': $resultat *= intval($argv[$i + 1]); break; } $i += 2; } echo $resultat . "\n"; } ?>
Exemple de fonctionnement :
[adminbdd www]$ php calculatrice.php 1 + 2 - 3 \* 4 - 5
- 5
[adminbdd www]$ php calculatrice.php 5 \* 5 / 4
6.25