Salta el contingut

0614 - Bloc1: Servidors web i de transferència de fitxers

Apache i Nginx - Configuració PHP

Hem de tenir en compte, que a part de la configuració del servidor web, el llenguatge PHP també compta amb un fitxer de configuració que en defineix els paràmetres sobre la seva execució.

Aquest fitxer és el php.ini i es llegeix quan s'executa un programa en PHP.

Què és el fitxer php.ini

El fitxer php.ini és el fitxer principal de configuració del llenguatge PHP.
Defineix com s'executa PHP: quins límits té, on desa els errors, si permet pujar fitxers, quanta memòria pot usar, etc.

Quan es carrega aquest fitxer?
Depèn de com utilitzem PHP:

  • Com a mòdul d’Apache: es carrega quan Apache s’inicia.
    Si canvies la configuració, cal reiniciar Apache (sudo systemctl restart apache2).
  • Amb PHP-FPM (procés independent): cal reiniciar el servei PHP-FPM.
  • Via consola (php script.php): es llegeix a cada execució del programa.

On trobar el fitxer php.ini

El primer que hem de tenir clar és on es troba aquest fitxer. En l'execució amb Apache, es crea un php.ini específic.

D'aquesta manera, podem fer un set up específic per a l'execució de PHP sota Apache.

Si tenim multiversió de PHP, evidentment en tindrem un d'específic per cada versió.

Com trobar el fitxer php.ini

    find /etc -iname "*php.ini*" -print
    /etc/php/8.3/cli/php.ini
    /etc/php/8.3/apache2/php.ini

Com veure la configuració actual

Gràcies a la comanda del llenguatge php phpinfo(), via web, podem veure un resum visualment molt més clar del contingut del fitxer que ens afecta en cada moment.

<?php
    phpinfo();
?>

Estructura del fitxer php.ini

Dins el fitxer, cal tenir en compte que:

  • Les línies que comencen amb ;comentaris (no s’executen).
  • Les línies amb [ ]seccions o capçaleres (ex. [PHP], [Date], etc.).
  • Cada línia amb una assignació → directiva amb valor:
    memory_limit = 128M
    display_errors = Off
    

Fitxers de desenvolupament i producció

Per defecte, PHP està pensat per tenir dues línies de funcionament: desenvolupament i producció. Els fitxers es diuen php.ini-development i php.ini-production respectivament. En la nostra instal·lació això no és així, però es recomana.

Els dos fitxers tenen les mateixes directives, però un està configurat per entorns en producció i l'altre per entorns de desenvolupament. Un està preparat amb configuracions més segures i estrictes, i l'altre està preparat per testing i per mostrar més errors per pantalla de forma que facilita el debug.

  • php.ini-development → pensat per a entorns de prova (mostra errors, menys segur).
  • php.ini-production → pensat per a entorns reals (més segur, oculta errors).

Normalment, el fitxer actiu (php.ini) és una còpia del mode production.

Com canviar valors de configuració de PHP

A dins hi trobareu informació sobre els valors tal com estan per defecte, en entorns de desenvolupament i en entorns de producció. Així i tot, en molts casos, no tindrem accés al fitxer php.ini en un servidor que no sigui nostre.

Hi ha diverses formes de canviar valors PHP, segons el context:

Context Com es modifica
Fitxer global Editant /etc/php/8.1/apache2/php.ini
Fitxer .htaccess Amb php_value o php_flag (només algunes directives)
VirtualHost d’Apache Amb php_value, php_flag, php_admin_value, php_admin_flag
Codi PHP Amb la funció ini_set("directiva", "valor")

Només php_value i php_flag estan permeses dins .htaccess.

php_value upload_max_filesize 10M
php_flag display_errors On

Hem de tenir en compte, però, que normalment molts d'aquests sistemes estan bloquejats. Fins i tot ens podem trobar llocs on la comanda phpinfo() estigui desactivada.

Directives per canviar valors PHP en Apache

Quan utilitzem PHP com a mòdul d'Apache, i vulguem canviar els valors, hem d'utilitzar unes directives específiques:

  • php_value nom on|off

  • php_flag nom valor

  • php_admin_flag|value nom on|off

Compte perquè només la primera està permesa als fitxers .htaccess d'Apache.

Més informació a: https://www.php.net/manual/es/configuration.changes.php

Directives més importants i el seu significat

Hi ha moltíssimes directives a considerar, i encara més si afegim mòduls addicionals al PHP. De moment, però, en destaquem les més habituals.

Directiva Descripció Exemple
error_reporting Defineix quin tipus d’errors es registren error_reporting = E_ALL
display_errors Mostra errors per pantalla (només per desenvolupament) display_errors = Off
log_errors Desa els errors en un fitxer log_errors = On
error_log Ruta on es desa el log d’errors error_log = /var/log/php_errors.log
max_execution_time Temps màxim d’execució d’un script (segons) max_execution_time = 30
memory_limit Màxim de memòria per script memory_limit = 128M
file_uploads Permet pujar fitxers via formularis file_uploads = On
upload_max_filesize Mida màxima per fitxer pujat upload_max_filesize = 2M
post_max_size Mida màxima total de dades enviades via POST post_max_size = 8M
max_input_time Temps màxim per processar dades d’entrada max_input_time = 60

Per consultar ràpidament aquests valors:

grep -ir -e display_errors -e log_errors -e error_log -e max_execution_time \
-e memory_limit -e file_uploads -e upload_max_filesize -e post_max_size \
-e max_input_time /etc/php/8.1/* | grep -v ";"

Mostra de sortida:

/etc/php/8.1/apache2/php.ini:max_execution_time = 30
/etc/php/8.1/apache2/php.ini:max_input_time = 60
/etc/php/8.1/apache2/php.ini:memory_limit = 128M
/etc/php/8.1/apache2/php.ini:display_errors = Off
/etc/php/8.1/apache2/php.ini:log_errors = On
/etc/php/8.1/apache2/php.ini:post_max_size = 8M
/etc/php/8.1/apache2/php.ini:file_uploads = On
/etc/php/8.1/apache2/php.ini:upload_max_filesize = 2M
/etc/php/8.1/apache2/php.ini:max_file_uploads = 20
/etc/php/8.1/cli/php.ini:max_execution_time = 30
/etc/php/8.1/cli/php.ini:max_input_time = 60
/etc/php/8.1/cli/php.ini:memory_limit = -1
/etc/php/8.1/cli/php.ini:display_errors = Off
/etc/php/8.1/cli/php.ini:log_errors = On
/etc/php/8.1/cli/php.ini:post_max_size = 8M
/etc/php/8.1/cli/php.ini:file_uploads = On
/etc/php/8.1/cli/php.ini:upload_max_filesize = 2M
/etc/php/8.1/cli/php.ini:max_file_uploads = 20

Mòduls PHP

PHP és un llenguatge que incorpora diferents mòduls segons les nostres necessitats. Això implica que cal instal·lar-ne alguns segons les comandes que vulguem utilitzar.

PHP és modular: pots afegir funcionalitats amb extensions.
Exemples: treball amb bases de dades, imatges, XML, JSON, etc.

Per veure extensions disponibles o instal·lades:

php -m

Per instal·lar-ne una:

sudo apt install php-mysql   # per connectar amb bases de dades MariaDB/MySQL

La documentació oficial:

Exemples de CMS que requereixen mòduls PHP:

  • WordPress
  • Moodle
  • Joomla

Podem mirar, per exemple, les necessitats d'alguns CMS que treballen en llenguatge PHP de backend. Per exemple: