Lorsque des sessions PHP sont utilisées (fonctions session_*() dans le code), des informations sont stockées côté serveur.
Le navigateur conserve uniquement identifiant pour accéder à ces informations, stockés dans un cookie ou une variable du type PHPSESSID dans l'URL (cela tend à être obsolète).
Par défaut, ces informations sont conservées dans des fichiers sur le disque (un fichier par session) mais il est conseillé d'utiliser
une méthode plus performante si vous avez un serveur dédié. Évidemment il est EXCLU de stocker les sessions dans une base de données SQL
sauf si vous voulez payer cher pour avoir un site lent et tuer des bébés phoques.
* La plus simple si votre site web est en mono-serveur ou en mode sticky : monter le répertoire qui stocker les fichiers en *TMPFS*.
Cela se fait par exemple en ajoutant la ligne suivante dans votre _fstab_ :
[Composer](https://getcomposer.org/) est un outil moderne de gestion des bibliothèques PHP, qui tend à remplacer le vieil outil [PEAR](https://pear.php.net/). Il est disponible à partir de Debian 9.
Composer s'utilise sans les droits _root_.
Il s'appuye sur la présence d'un fichier `composer.json` qui déclare les bibliothèques à installer.
~~~
$ composer about
Composer - Package Management for PHP
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See https://getcomposer.org/ for more information.
Au niveau système, pour voir exactement ce qui est fait. (Ouverture de fichiers, connexion distante, requêtes MySQL).
Exemple d'utilisations.
~~~
# Affiche les fichiers ouverts.
$ strace -ff -e trace=open php index.php
# Affiche les appels réseaux.
$ strace -ff -e trace=network php index.php
# Compte les appels systèmes et le temps passé.
$ strace -c php index.php
# Calcul du temps d'exécution d'un appel.
$ strace -T php index.php
# Affichage d'un timestamp devant chaque appel.
$ strace -ttt php index.php
# Strace verbeux.
$ strace -s 65535 -ff php index.php
~~~
Dans certains cas, des CMS gèrent mal le fait qu'on exécute le code via PHP-CLI. On pourra utiliser PHP-CGI pour le tromper, c'est notamment le cas de Magento.
[Xdebug](https://xdebug.org/) est un débogueur PHP.
~~~
# aptitude install php5-xdebug
~~~
Pour l'activer, dans _/etc/php5/conf.d/xdebug.ini_ :
~~~
zend_extension=/usr/lib/php5/20090626/xdebug.so
;xdebug.auto_trace=On
;xdebug.profiler_enable=1
xdebug.profiler_output_dir=/home/xdebug
xdebug.trace_output_dir=/home/xdebug
~~~
Pour activer dans un vhost Apache :
~~~
php_admin_value xdebug.profiler_enable 1
~~~
Attention, bien mettre le bon chemin de l'extension zend (dépend de votre version PHP) et les droits sur le répertoire _/home/xdebug_. Notez qu'il peut se remplir très vite une fois activé !
On obtient des fichiers _trace.XXX.xt_ et _cachegrind.out.XXXX_
Le fichier xt est une trace de tout les appels aux fonctions PHP du code préfixé par le temps d'exécution. Idéal pour trouver une fonction anormalement longue.
La seconde colonne contient l'empreinte mémoire, idéal aussi pour répérer une fonction qui utilise trop de mémoire.
Le fichier _cachegrind_ peuvent être lus avec l'outil kcachegrind (pour Linux) ou wincachegrind (sous Windows), cela permet de schématiser les appels aux fonctions PHP et de voir le temps passé en % et le nombre d'appels.
Voici un exemple :
[[Image(call1.png)]]
Ici, 30% du temps est passé dans php::uasort, appelé par Mage_Core_Model_Layout->getOutput.
Webgrind en PHP permet de faire comme kcachegrind mais via un navigateur.
Puis dans le fichier de configuration config.php on mettre profilerDir à /home/xdebug. Il faut aussi installer le package graphviz et mettre dotExecutable à /usr/bin/dot si on veut profiter du graphique « call graph ».
#0 0x00007ffd348abe53 in _zend_mm_free_canary_int (heap=0x7ffd39b11130, p=0x21143c453bb97f0f) at /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c:2090
2090 /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c: No such file or directory.
in /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c
#0 0x00000000007e10b1 in zend_mm_free_cache ()
~~~
Astuce : utiliser xdebug pour en savoir plus sur la boucle (xdebug étant limité à 100 récursions, il affichera les infos via une PHP Fatal Error :
~~~
Fatal error: Maximum function nesting level of '100' reached, aborting! in [...]
* J'ai un message d'erreur du type : _/usr/lib/php5/20090626/xcache.so doesn't appear to be a valid Zend extension_
Remplacer `zend_extension=` par `extension=` pour le chargement du module PHP.
* Certaines fonctions GD n'existent pas : imagerotate(), imageantialias(), etc.
Pour des raisons de sécurité et de maintenabilité, la version de PHP de Debian n'embarque par le GD modifié par PHP. Ces fonctions ne sont
pas disponibles. Pour contourner ce problème, nous conseillons d'écrire vos propres fonctions (il y a des exemples sur <http://php.net).>
Cela peut éventuellement être mis dans un fichier partagé qui sera ensuite inclus systématiquement dans votre code lorsque l'utilisation est nécessaire.