73. PHP - Hello World

Cet atelier a pour but de vous permettre de tester PHP dans 3 cas d'utilisation :

Mais aussi d'installer et de tester la configuration Php5.

73.1. Installation d'apache, PHP et MySQL sous Linux (LAMP)

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

73.2. Premier script web

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.

Figure 63.

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.

73.3. Première ligne de commande

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).

73.4. Premier script en ligne de commande

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).

73.5. Premier script CGI

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>
"""

Figure 64. Script python

73.6. Testez votre configuration PHP

Figure 65. Configuration visible via le phpinfo()

73.7. Créer une calculatrice

Vous devrez créer un programme calculatrice en PHP prenant trois arguments :

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