; Wakdo - configuration PHP runtime (surcharge le php.ini par defaut) ; Charge en dernier via le prefixe zz- pour avoir le dernier mot. [PHP] ; --- Erreurs --- ; En dev : on affiche les erreurs a l'ecran. En prod : surcharge via override ; docker-compose.prod.yml qui remplace ce fichier (display_errors=0, log_errors=1). display_errors = On display_startup_errors = On error_reporting = E_ALL log_errors = On error_log = /proc/self/fd/2 ; --- Memoire et temps --- memory_limit = 256M max_execution_time = 30 max_input_time = 60 ; --- Upload images produits (voir .env UPLOAD_MAX_SIZE_MB=5) --- ; post_max_size >= upload_max_filesize + overhead des autres champs du form. file_uploads = On upload_max_filesize = 5M post_max_size = 8M max_file_uploads = 5 ; --- Timezone --- ; Cr technique : eviter les warnings et les decalages date silencieux. date.timezone = Europe/Paris ; --- Sessions --- ; Le nom du cookie et la lifetime sont surcharges par l'appli au runtime via ; session_set_cookie_params() a partir des variables SESSION_* du .env. ; Ce qui est fixe ici = les defaults securises. session.use_strict_mode = 1 session.use_cookies = 1 session.use_only_cookies = 1 session.cookie_httponly = 1 session.cookie_samesite = "Strict" session.cookie_secure = 1 ; session.save_path est laisse par defaut (/tmp dans le conteneur). ; Persistance inter-container non necessaire : chaque session est liee a une ; instance unique du service wakdo-app (pas de scale horizontal pour ce projet). ; session.gc_maxlifetime : filet de securite cote serveur (l'idle reel est ; pilote par l'appli via SESSION_LIFETIME_IDLE). 4h. session.gc_maxlifetime = 14400 ; IDs de session longs et a forte entropie (anti-prediction/fixation). session.sid_length = 48 session.sid_bits_per_character = 6 ; Pas de cache navigateur sur les pages avec session (anti-fuite via cache). session.cache_limiter = nocache ; --- Durcissement general (security-by-design, cf. PROJECT_CONTEXT 19) --- ; Expose_php = Off : ne pas leak la version PHP dans l'entete HTTP. expose_php = Off ; Anti RFI/SSRF : interdire l'ouverture d'URL distantes et leur inclusion. allow_url_fopen = Off allow_url_include = Off ; FPM : ne pas deviner le script a partir du PATH_INFO (anti exploitation ; d'upload mal route vers l'interpreteur). Le routage passe par le front controller. cgi.fix_pathinfo = 0 ; Interdire le chargement dynamique d'extensions au runtime. enable_dl = Off ; Ne pas inclure les arguments dans les stack traces (anti-fuite de secrets). zend.exception_ignore_args = On ; Desactiver les fonctions d'execution systeme : l'appli n'en a aucun usage ; legitime (anti-RCE en cas d'injection). Les scripts d'ops vivent cote cron/host. disable_functions = exec,passthru,shell_exec,system,proc_open,popen ; --- OPcache (perf + stabilite) --- [opcache] opcache.enable = 1 opcache.enable_cli = 0 opcache.memory_consumption = 128 opcache.interned_strings_buffer = 16 opcache.max_accelerated_files = 10000 opcache.validate_timestamps = 1 ; En dev : revalidate toutes les 2s pour prendre en compte les modifs du bind-mount. ; En prod : validate_timestamps=0 via override (invalidation manuelle au deploy). opcache.revalidate_freq = 2 opcache.fast_shutdown = 1 ; --- PDO / MySQL --- [PDO] ; Pas de persistent connections pour un projet a faible volume : plus simple ; a debugger et moins de risques de fuite de sessions BDD. [MySQLi] mysqli.default_host = wakdo-db mysqli.default_port = 3306