Comment changer la version de PHP dossier par dossier ?
Sur l'hébergement web o2switch, vous pouvez changer la version de PHP et contrôler la configuration PHP (php.ini) de plusieurs façons différentes.
La méthode recommandée est d'utiliser l'outil Sélectionner une version de PHP de l'hébergement. L'outil permet de changer la version de PHP pour l'ensemble de l'hébergement. En complément, l'outil vous permet de charger ou décharger des modules PHP et de modifier le php.ini.
Cependant, cet outil n'est pas toujours suffisant. Vous pouvez être amené à vouloir utiliser une version précise de PHP pour tout l'hébergement, à l'exception d'un dossier ou d'un site précis qui a besoin d'une version différente.
Autrement dit, vous souhaitez pouvoir changer la version de PHP, dossier par dossier, sur votre hébergement.
Ce type de configuration est possible chez o2switch, en modifiant le fichier .htaccess qui se trouve à la racine du
site.
Dans la mesure du possible, nous décourageons l'usage de cette méthode car le PHP qui sera exécuté de cette manière sera un peu plus lent que le PHP exécuté nativement.
Si vous avez la possibilité d'isoler le site sur un sous-compte, un lune (gratuitement) et de choisir la version de PHP avec le sélecteur de version de PHP directement sur le sous-compte, ça sera plus performant.
La perte de performance décrite ci-dessus vient du SAPI utilisé (cgi-fcgi), et non du principe du .htaccess.
Il existe une seconde écriture du handler qui conserve le SAPI natif litespeed : voir
Variante LiteSpeed.
Choisir la version de PHP
Vous pouvez choisir la version de PHP en mettant en place un fichier .htaccess dans le dossier ou vous souhaitez que cette version de PHP soit exécuté. Dans ce fichier .htaccess, vous pouvez précisez l'une de ces lignes :
#PHP 5.2 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php52
</FilesMatch>
AddHandler application/x-httpd-php52 .php
#PHP 5.3 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php53
</FilesMatch>
AddHandler application/x-httpd-php53 .php
#PHP 5.4 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php54
</FilesMatch>
AddHandler application/x-httpd-php54 .php
#PHP 5.5 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php55
</FilesMatch>
AddHandler application/x-httpd-php55 .php
#PHP 5.6 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php56
</FilesMatch>
AddHandler application/x-httpd-php56 .php
#PHP 7.0 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php70
</FilesMatch>
AddHandler application/x-httpd-php70 .php
#PHP 7.1 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php71
</FilesMatch>
AddHandler application/x-httpd-php71 .php
#PHP 7.2 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php72
</FilesMatch>
AddHandler application/x-httpd-php72 .php
#PHP 7.3 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php73
</FilesMatch>
AddHandler application/x-httpd-php73 .php
#PHP 7.4 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php74
</FilesMatch>
AddHandler application/x-httpd-php74 .php
#PHP 8.0 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php80
</FilesMatch>
AddHandler application/x-httpd-php80 .php
#PHP 8.1 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php81
</FilesMatch>
AddHandler application/x-httpd-php81 .php
#PHP 8.2 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php82
</FilesMatch>
AddHandler application/x-httpd-php82 .php
#PHP 8.3 :
<FilesMatch \.php$>
SetHandler application/x-httpd-php83
</FilesMatch>
AddHandler application/x-httpd-php83 .php
#PHP 8.4 :
Non disponible pour le moment.
Si le handler indiqué n'existe pas sur le serveur (faute de frappe, ou version de PHP non installée), le serveur
ne renvoie pas d'erreur : il sert le fichier .php tel quel, en clair, avec l'en-tête
Content-Type: application/x-httpd-ea-php72. Le navigateur affiche ou télécharge alors le code source.
Sur un WordPress, un Prestashop ou un Symfony, cela expose les identifiants de base de données contenus dans
wp-config.php, parameters.php ou .env.
Après avoir mis en place la directive, vérifiez toujours que la page renvoie bien du HTML et non du code PHP,
par exemple avec un fichier de test contenant <?php echo PHP_VERSION;.
Le changement de version fonctionne sans qu'aucun fichier php.ini ne soit présent : le serveur charge alors le
php.ini par défaut de la version choisie (/opt/alt/phpXX/etc/php.ini), qui contient déjà les extensions
courantes (mysqli, mbstring, gd, intl…).
Ne créez un php.ini personnalisé que si vous avez réellement besoin de modifier un réglage (voir
Mettre en place un php.ini personnalisé).
Contrairement à la version PHP native de votre panel qui tolère des permissions larges, la version PHP de votre dossier utilise suPHP qui refuse d'exécuter tout fichier en 777 ou 775 pour des raisons de sécurité.
Pensez à vérifier vos permissions sur les fichiers pour éviter les erreurs.
La version de PHP sera prise en compte pour le dossier contenant le fichier .htaccess ainsi que l'ensemble des sous-dossiers. Cela vous permet d'avoir des configurations assez fines, comme par exemple définir une versions de PHP différente pour chacun de vos sites : il suffit de préciser un fichier .htaccess avec la bonne directive à la racine de vos sites.
public_html/.htaccess avec :
<FilesMatch \.php$>
SetHandler application/x-httpd-php52
</FilesMatch>
AddHandler application/x-httpd-php52 .php
permet de dire que l'ensemble de public_html et ces sous-dossiers fonctionneront avec php 5.2
public_html/site-recent.fr/.htaccess avec :
<FilesMatch \.php$>
SetHandler application/x-httpd-php54
</FilesMatch>
AddHandler application/x-httpd-php54 .php
permet d'avoir le dossier "site-recent.fr" ainsi que les sous-dossiers avec php 5.4. Le .htaccess de "dernier niveau" est pris en compte, donc le .htaccess précédent de "public_html" est ignoré dans ce cas puisque redéfini dans un dossier plus profond.
sites/.htaccess avec rien de particulier à l'intérieur : utilise la version par défaut de PHP sur le serveur.
Variante LiteSpeed : conserver le SAPI natif
Les directives ci-dessus font passer les requêtes par le SAPI cgi-fcgi, d'où la perte de performance signalée en
introduction. Une seconde écriture du handler permet de choisir la version de PHP tout en restant sur le SAPI
litespeed, comme la version native du panel :
# PHP 8.0, SAPI litespeed
AddHandler application/x-httpd-alt-php80___lsphp .php
Le nom du handler suit le format application/x-httpd-alt-php<XX>___lsphp, où <XX> est la version sans point
(74, 80, 83…), avec trois tirets bas avant lsphp.
| Directive | Version obtenue | php_sapi_name() |
|---|---|---|
SetHandler application/x-httpd-php80 + AddHandler application/x-httpd-php80 .php | 8.0 | cgi-fcgi |
AddHandler application/x-httpd-alt-php80___lsphp .php | 8.0 | litespeed |
Cette écriture donne également accès à des versions absentes de la liste précédente, par exemple PHP 8.5 :
AddHandler application/x-httpd-alt-php85___lsphp .php
Avec le handler ___lsphp, les directives suPHP_ConfigPath et php_value, ainsi que les fichiers .user.ini,
sont ignorés silencieusement : php_ini_loaded_file() renvoie toujours le php.ini par défaut de la version.
Si vous avez besoin d'un php.ini personnalisé sur un dossier, utilisez la forme SetHandler /
x-httpd-php<XX> décrite plus haut, au prix du SAPI cgi-fcgi.
Mettre en place un php.ini personnalisé
Pour mettre en place un fichier php.ini, vous devez forcer la version de PHP que vous souhaitez utiliser (par défaut, php 5.4) à l'aide des explications fournies plus haut, puis ajoutez cette directive dans le fichier .htaccess contenu dans le dossier ou vous souhaitez que les modifications soient effectives :
suPHP_ConfigPath ne fonctionne qu'avec la forme SetHandler / x-httpd-php<XX>. Avec le handler
___lsphp présenté plus haut, la directive est ignorée.
# Attention : c'est bien le chemin vers le DOSSIER CONTENANT le fichier php.ini
# Et PAS le chemin vers le fichier php.ini
suPHP_ConfigPath /chemin/vers/dossier_contenant_php_ini
Par exemple, si vous souhaitez mettre en place un fichier php.ini en utilisant la version par défaut de PHP pour votre site principal contenu dans "public_html", vous devrez créer un fichier .htaccess dans le dossier public_html avec ces directives :
<FilesMatch \.php$>
SetHandler application/x-httpd-php54
</FilesMatch>
AddHandler application/x-httpd-php54 .php
suPHP_ConfigPath /home/votre_login/public_html/
Dans ce dernier cas, le fichier php.ini devra être situé ici : /home/votre_login/public_html/php.ini
La version de PHP ainsi que les modifications ajoutées via le fichier php.ini seront effectives pour le dossier public_html ET l'ensemble des sous-dossiers de "public_html" SAUF si un fichier .htaccess ré-écrit cela avec de nouvelles directives.
Si vous avez un deuxième site contenu dans le dossier "public_html" qui requiert des configurations particulières, vous pouvez ré-écrire cela en mettant en place un nouveau fichier .htaccess à la racine du deuxième site cette fois :
<FilesMatch \.php$>
SetHandler application/x-httpd-php53
</FilesMatch>
AddHandler application/x-httpd-php53 .php
suPHP_ConfigPath /home/votre_login/public_html/site2.fr/
Exemple de fichier php.ini
Le fichier php.ini devra être ici : /home/votre_login/public_html/site2.fr/php.ini
Pour PHP inférieur ou égal 5.6
Sur les versions de PHP inférieures ou égale à PHP 5.6, il est nécessaire d'activer les extensions mysql.
Ces extensions là sont supprimées à partir de PHP 7 et sont remplacées par des équivalents plus modernes.
Pensez à modifier les chemins pour les zend_extension visible en fin de fichier. Remplacez 56 par la version
de PHP que vous souhaitez utiliser.
[PHP]
engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision = 14
y2k_compliance = On
output_buffering = Off
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 17
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
expose_php = Off
memory_limit = 512M
error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
error_log = error_log
variables_order = "EGPCS"
request_order = "GP"
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 512M
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = On
file_uploads = On
upload_max_filesize = 512M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[Date]
date.timezone = "Europe/Paris"
[Syslog]
define_syslog_variables = Off
[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
[SQL]
sql.safe_mode = Off
[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[Session]
session.save_handler = files
session.save_path = "/opt/alt/php56/var/lib/php/session"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
opcache.memory_consumption = 2048
opcache.max_accelerated_files = 100000
extension=bcmath.so
extension=bz2_filter.so
extension=dom.so
extension=enchant.so
extension=fileinfo.so
extension=gd.so
extension=imap.so
extension=intl.so
extension=json.so
extension=ldap.so
extension=mbstring.so
extension=mailparse.so
extension=mbstring.so
extension=mcrypt.so
extension=mysqli.so
extension=mysqlnd.so
extension=pdo.so
extension=pdo_mysql.so
extension=pdo_sqlite.so
extension=pgsql.so
extension=phar.so
extension=posix.so
extension=propro.so
extension=pspell.so
extension=soap.so
extension=sockets.so
extension=spl_types.so
extension=sysvmsg.so
extension=sysvsem.so
extension=sysvshm.so
extension=tidy.so
extension=wddx.so
extension=xmlreader.so
extension=xmlrpc.so
extension=xmlwriter.so
extension=xsl.so
extension=zip.so
zend_extension=/opt/alt/php56/usr/lib64/php/modules/ZendGuardLoader.so
zend_extension=/opt/alt/php56/usr/lib64/php/modules/opcache.so
zend_extension=/opt/alt/php56/usr/lib64/php/modules/ioncube_loader.so
Pour PHP supérieur à 5.6
Pour les versions de PHP supérieures à PHP 5.6, les modules MySQL n'existent plus et sont remplacés, donc le fichier php.ini est légèrement différents.
[PHP]
output_buffering = Off
engine = On
short_open_tag = Off
precision = 14
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
zend.exception_ignore_args = On
expose_php = On
max_execution_time = 360
max_input_time = 360
max_input_vars = 250000
memory_limit = 512M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
error_log =
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 512M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 512M
max_file_uploads = 20
allow_url_fopen = On
default_socket_timeout = 20
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Europe/Paris
[Pcre]
pcre.jit=0
[Pdo_mysql]
pdo_mysql.default_socket=
[mail function]
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = Off
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[Session]
session.save_handler = files
session.save_path = "/opt/alt/php81/var/lib/php/session"
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = -1
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[ldap]
ldap.max_links = -1
[ffi]
opcache.jit_buffer_size=0
opcache.jit=disable
opcache.memory_consumption = 2048
opcache.max_accelerated_files = 100000
opcache.huge_code_pages = 0
extension=bcmath.so
extension=dba.so
extension=dom.so
extension=enchant.so
extension=fileinfo.so
extension=gd.so
extension=imap.so
extension=intl.so
extension=ldap.so
extension=mbstring.so
extension=mailparse.so
extension=mbstring.so
extension=mcrypt.so
extension=mysqli.so
extension=mysqlnd.so
extension=pdo_mysql.so
extension=pdo.so
extension=pdo_sqlite.so
extension=pgsql.so
extension=phar.so
extension=posix.so
extension=pspell.so
extension=soap.so
extension=sockets.so
extension=sysvmsg.so
extension=sysvsem.so
extension=sysvshm.so
extension=tidy.so
extension=xmlreader.so
extension=xmlrpc.so
extension=xmlwriter.so
extension=xsl.so
extension=zip.so
zend_extension=/opt/alt/php81/usr/lib64/php/modules/opcache.so
zend_extension=/opt/alt/php81/usr/lib64/php/modules/ioncube_loader.so