Salta el contingut

MP08 - UF1: 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.

Però en el nostre cas, si executem PHP com a mòdul d'Apache, es llegeix en carregar el mòdul en memòria, de manera que si fem canvis a la configuració del PHP, ens caldrà fer un reinici d'Apache per recarregar el mòdul.

En el cas de treballar amb el servei php-fpm, caldrà reiniciar aquest servei.

Via consola per exemple, es llegeix a cada execució.

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

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

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.

Dins el fitxer, cal tenir en compte que:

  • Tot el que comença amb ; és un comentari i, per tant, és ignorat pel que fa a interpretació

  • Tot el que va entre [ ] (com per exemple [PHP]) indica una capçalera de secció

  • Cada línia indica una directiva de configuració

  • Aquestes estan configurades per la paraula clau de la directiva, que la identifica, i el seu valor de configuració

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.

El php.ini que configureu parteix del php.ini-production.

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.

PHP permet sobreescriptura d'alguns valors en particular. Si feu accediu a un fitxer php, per la web, amb la comanda phpinfo(), ho veureu diferenciat amb les columnes Master Value i Local Value. Aquests valors es poden sobreescriure a través de la comanda ini_set, en Apache, dins de la configuració del VirtualHost i dins un fitxer .htaccess.

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.

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

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.

Control d'errors

El control d'errors, sobretot en entorns de test, és clau.

Aquest es controla a través de la directiva error_reporting.

Els errors es divideixen en 4 categories: parsing, notices, warning i fatal.

A través de la directiva display_errors podem decidir mostrar-los o no per pantalla.

Amb la directiva log_errors i error_log els podem capturar a un fitxer enlloc de la pantalla.

Per evitar que un script de PHP no finalitzi mai, tenim la directiva max_execution_time i així forçar que finalitzi.

També és interessant controlar-ne l'ús de memòria per evitar que saturi el sistema. Ho podem fer amb la directiva memory_limit.

Podem controlar també la pujada d'arxius i de dades als formularis a través de POST. Per fer-ho tenim les directives file_uploads, upload_max_filesize i post_max_size. Per controlar també que la pujada no sigui infinita, tenim la directiva max_input_time.

Paràmetres actuals
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 ";"
/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.

Quan hem instal·lat php no hem especificat cap mòdul, però és molt normal que necessitem la instal·lació d'alguns d'ells per a algunes especificacions. Caldrà tenir-ho en compte.

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