Login Logout

HowtoLAMP/PHP

Cette page a été importée automatiquement de notre ancien wiki mais n’a pas encore été révisée.

Howto PHP

http://php.net/supported-versions.php

  • Debian 6 : PHP 5.3.3
  • Debian 7 : PHP 5.4.45
  • Debian 8 : PHP 5.6.19
  • Debian 9 : PHP 7.0.10

Installation

Installation avec Apache :

# apt install php5 libapache2-mod-php5 php5-gd php5-imap php5-ldap php5-mcrypt php5-mhash php5-mysql php5-pgsql php-gettext librsvg2-bin

PHP est ainsi actif. On le vérifiera aisément avec :

$ php -v
PHP 5.6.19-0+deb8u1 (cli) (built: Mar 14 2016 10:22:33) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

# echo "<?php phpinfo(); ?>" > /var/www/info.php

$ wget <http://127.0.0.1/info.php>

Paquet PHP7.0 Dotdeb Jessie

Il suffit d’installer le sources.list de Dotdeb.

deb http://packages.dotdeb.org jessie all
wget https://www.dotdeb.org/dotdeb.gpg -O -|apt-key add -

Et d’installer les paquets nécessaires. Voici un exemple pour un serveur Apache :

php-common php7.0-cli php7.0-common php7.0-json php7.0-opcache php7.0-readline php7.0-ssh2 php7.0-curl php7.0-gd php7.0-mongodb php7.0-zip php7.0-xml php7.0-mbstring libapache2-mod-php7.0

Attention : Cela casse le paquet officiel Debian de phpmyadmin, à cause d’une dépendance en dur au paquet 5.6.

Configuration de base

Il existe un fichier php.ini suivant l’utilisation de PHP : Apache, CLI, FPM, etc. Pour un exemple de “sécurisation” de PHP pour Apache via /etc/php5/apache2/php.ini :

short_open_tags = Off
disable_functions = exec, shell-exec, system, passthru, putenv, popen
expose_php = Off
display_errors = Off
log_errors = On
allow_url_fopen = Off
memory_limit = 128M
max_execution_time = 10
open_basedir = /home

Note : par défaut, les erreurs PHP sont enregistrés dans le fichier ErrorLog du VVirtualHost Apache.

Cache/accélérateur pour PHP

Depuis PHP 5.6 (Debian 8), un cache d’OPcode (code “intermédiaire” généré par PHP) est intégré à PHP permet d’accélérer la génération du résultat des scripts PHP. Il remplace les accélérateurs comme APC, eAccelerator, etc. utilisé dans les versions précédentes de PHP. C’est le module OpCache configurable via /etc/php5/mods-available/opcache.ini

La valeur de cache par défaut est de 64M, paramètre opcache.memory_consumption

Pour surveiller OpCache on peut utiliser : - https://github.com/amnuts/opcache-gui [[BR]] - Plugin Munin https://github.com/munin-monitoring/contrib/blob/master/plugins/php/php_opcache + https://github.com/munin-monitoring/contrib/blob/master/plugins/php/php_opcache.php

APC (deprecated)

http://fr.php.net/manual/en/book.apc.php

En PHP 5.3/5.4 (Debian 6/7), on installait souvent le module APC pour accélérer la génération des scripts PHP.

# aptitude install php-apc

La directive apc.enabled, qui détermine l’activation d’APC, est à 1 par défaut. Elle s’active uniquement globalement (pour désactiver/activer par VirtualHost, on utilisera la directive apc.cache_by_default).

Example de configuration apc.ini :

extension=apc.so
apc.stat = 1
apc.include_once_override = 0
apc.shm_size=256M
apc.enabled = 1
apc.cache_by_default = 1

Ne pas oublier de faire :

# sysctl -w kernel.shmmax=536870912
# echo 'kernel.shmmax=536870912' >> /etc/sysctl.conf

Pour activer APC pour un site en particulier, on ajoutera dans son VirtualHost :

php_admin_value apc.cache_by_default 1

Un script est fourni par Debian pour accéder aux statistiques APC. Il suffit de le déposer dans un répertoire accessible par le serveur web :

# zcat /usr/share/doc/php-apc/apc.php.gz >/var/www/apc.php

Positionner un mot de passe dans le fichier apc.php pour pouvoir vider le cache APC via cette page…

Il peut arriver que le error.log grossisse de façon alarmante avec la configuration par défaut en cas de fort trafic :

[apc-warning] Unable to allocate memory for pool. in /var/www/foo/bar.php on line XXX 

Il suffit généralement d’augmenter la taille du cache APC dans /etc/php5/apache2/conf.d/apc.ini :

apc.shm_size=64

Pour augmenter le cache à 64Mo.

/! Préciser l’unité (MB ou Mo) peut empêcher apache de redémarrer, par défaut le cache est déjà en MB /!
/! Assurez-vous d’avoir une valeur kernel de kernel.shmmax supérieur (à adapter avec sysctl) /!
### APcu

Pour faire du cache de clé-valeur sans installer un service externe (comme Memcached par exemple), on pourra installer APCu.

Sessions PHP

http://php.net/manual/en/book.session.php

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 :
tmpfs /var/lib/php5 tmpfs defaults,noexec,nosuid,nodev,size=256m 0 0
  • Les sessions peuvent être stockées dans un ou plusieurs serveurs Memcached avec les paramètres suivants :
session.save_handler = memcached
session.save_path = "192.0.43.10:11211,192.0.43.11:11211"

Par contre, contrairement aux idées reçues, ce n’est pas conseillé. Memcached est fait pour “cacher” et non “stocker”. Voir le blog d’un développeur de Memcached à ce sujet : http://dormando.livejournal.com/495593.html

  • Les sessions peuvent être stockées dans un ou plusieurs serveurs Redis avec les paramètres suivants :
session.save_handler = redis
session.save_path = "tcp://192.0.43.10:6379?auth=<password>,tcp://192.0.43.11:6379?auth=<password>"
  • Les sessions peuvent être stockées dans Sharedance, un petit logiciel spécialement conçu pour stocker les sessions PHP. Il n’est plus maintenu, mais très simple, il est toujours fonctionnel. Voici un exemple d’utilisation :
auto_prepend_file = /usr/local/etc/sharedance.php
;session.save_handler = user
;session.save_handler = files
  • Les sessions peuvent être stockées dans Tokyo Tyrant/Tycoon avec les paramètres suivants :
tokyo_tyrant.session_salt="randomlongstring"
session.save_handler=tokyo_tyrant
session.save_path="tcp://192.0.43.10:1978,tcp://192.0.43.10:1978"

Modules de paiement

SPPlus

Pré-requis :

# apt install php5-dev

Attention à bien vérifier que /tmp n’est pas monté en noexec pour la suite.

Compilation du module :

cd /tmp
wget <http://kits.spplus.net/integration/spplus/kits/spplus-1.2.tar.gz>
tar xzf spplus-1.2.tar.gz
cd spplus-1.2
phpize
./configure
make
cp modules/php_spplus.so /usr/lib/php5/<builddate>/
chmod 644 /usr/lib/php5/<builddate>/php_spplus.so

Ajout dans la conf PHP :

echo "extension=php_spplus.so" >/etc/php5/conf.d/spplus.ini
chmod 644 /etc/php5/conf.d/spplus.ini

Module de protection suhosin (deprecated)

http://www.hardened-php.net/suhosin/configuration.html

Suhosin était un module du projet Hardened-PHP permettant d’ajouter une couche de protection à PHP. Il existait en PHP 5.2/5.3 (Debian 6/7), mais n’existe plus en PHP 5.6 (Debian 8).

# aptitude install php5-suhosin

Un exemple de configuration dans le fichier /etc/php5/conf.d/suhosin.ini :

extension=suhosin.so

;log
suhosin.log.syslog = S_ALL 
;mode "simulation" pour tester
;suhosin.simulation = On
;empecher d'augmenter le memory_limit défini
suhosin.memory_limit = 0
;Action en cas de soucis
;suhosin.filter.action = 406,<http://hosting.evolix.net/406.html>
suhosin.filter.action = 406
;Fonctions interdites
suhosin.executor.func.blacklist="exec,shell-exec,system,passthru,putenv,popen"
;Restrictions sur les variables GET/REQUEST/POST...
suhosin.get.max_name_length = 126
suhosin.request.max_varname_length = 256
suhosin.request.max_array_index_length = 128
suhosin.request.max_vars = 1000
suhosin.post.max_vars = 1000

Module du framework phalcon

https://docs.phalconphp.com/fr/latest/reference/install.html https://github.com/phalcon/phalcon-devtools

Installer les dépendances suivantes :

# apt install php5-dev libpcre3-dev gcc make php5-mysql

Cloner la dernière version stable (2.0.x à ce jour) :

git clone --depth=1 git://github.com/phalcon/cphalcon.git -b 2.0.x

Compiler et installer le module :

cd cphalcon/build
sudo ./install

Configurer PHP et Apache :

# Dans le fichier /etc/php5/mods-available/phalcon.ini
extension=phalcon.so
# Puis activer le module
ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/cli/conf.d/30-phalcon.ini
ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/apache2/conf.d/30-phalcon.ini
service apache2 reload

Installer les phalcon devtools :

git clone <https://github.com/phalcon/phalcon-devtools.git> -b 2.0.x /opt/phalcon-devtools
ln -s /opt/phalcon-devtools/phalcon.php /usr/local/bin/phalcon
chmod ugo+x /usr/local/bin/phalcon

FAQ

  • J’ai un message d’erreur du type : /usr/lib/php5/20090626/xcache.so doesn’t appear to be a valid Zend extension

Réponse : remplacer zend_extension= par extension= pour le chargement du module PHP

  • Certaines fonctions GD n’existent pas : imagerotate(), imageantialias(), etc.

Réponse : 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.