Εν συντομία: Το php.ini είναι το κεντρικό αρχείο διαμόρφωσης της PHP. Η PHP το διαβάζει κατά την εκκίνηση, στις μονάδες διακομιστή μία φορά, στο CGI και στο CLI σε κάθε κλήση. Προστίθενται πρόσθετα αρχεία από έναν κατάλογο σάρωσης, ρυθμίσεις στο pool του FPM ή στον Apache, .htaccess ή .user.ini και ini_set() στον κώδικα. Ποιο επίπεδο επιτρέπεται να αλλάξει μια τιμή, ορίζει ο τρόπος αλλαγής της, για παράδειγμα INI_SYSTEM ή INI_PERDIR. Τιμές μέσω php_admin_value δεν μπορεί πλέον να τις παρακάμψει η εφαρμογή.
Τι είναι το php.ini;
Το php.ini είναι ένα αρχείο κειμένου με εγγραφές της μορφής name = wert. Ορίζει πώς συμπεριφέρεται η PHP: πόση μνήμη επιτρέπεται να χρησιμοποιεί ένα σενάριο, αν τα σφάλματα εμφανίζονται στον browser, πώς λειτουργούν οι συνεδρίες και ποιες επεκτάσεις φορτώνονται. Τα σχόλια ξεκινούν με τον χαρακτήρα ; (semicolon).
Σύμφωνα με το εγχειρίδιο της PHP, το αρχείο διαβάζεται κατά την εκκίνηση της PHP. Σε μονάδες διακομιστή όπως το mod_php αυτό συμβαίνει μόνο μία φορά, κατά την εκκίνηση του διακομιστή ιστού, στο CGI και στο CLI σε κάθε κλήση. Το PHP-FPM διαβάζει τη διαμόρφωσή του κατά την εκκίνηση και κατά την επαναφόρτωση της υπηρεσίας. Μια αλλαγή χωρίς επανεκκίνηση ή reload δεν ισχύει γι' αυτό συνήθως.
Από την PHP 8.3 μια εγγραφή μπορεί σύμφωνα με το εγχειρίδιο να παραπέμπει σε μεταβλητή περιβάλλοντος με εναλλακτική τιμή:
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Πού αναζητά η PHP το php.ini;
Το εγχειρίδιο περιγράφει μια σταθερή σειρά. Πρώτα ισχύει μια ρητά ορισμένη διαδρομή, για παράδειγμα το PHPIniDir στον Apache ή η επιλογή -c στο CGI και στο CLI. Διαφορετικά η PHP χτίζει μια διαδρομή αναζήτησης από:
- τη μεταβλητή περιβάλλοντος
PHPRC, - στα Windows την εγγραφή μητρώου
IniFilePath, - τον τρέχοντα κατάλογο εργασίας, εκτός από SAPI που το απενεργοποιούν, όπως το CLI,
- τον κατάλογο του δυαδικού αρχείου PHP ή της μονάδας,
- τη διαδρομή
--with-config-file-pathπου ορίστηκε κατά τη μεταγλώττιση.
Σε αυτή τη διαδρομή αναζήτησης η PHP ψάχνει πρώτα ένα αρχείο php-SAPI.ini, για παράδειγμα php-cli.ini, και μόνο μετά το php.ini. Στη συνέχεια η PHP διαβάζει όλα τα αρχεία .ini από τον κατάλογο σάρωσης, που ορίζεται μέσω του PHP_INI_SCAN_DIR ή κατά τη μεταγλώττιση μέσω του --with-config-file-scan-dir, με αλφαβητική σειρά. Ποια αρχεία φορτώθηκαν, δείχνει το php --ini ή η συνάρτηση php_ini_scanned_files().
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
Και οι δύο εντολές δείχνουν την κατάσταση της γραμμής εντολών. Για τον ιστότοπο μπορεί να ισχύει άλλο αρχείο, επειδή κάθε SAPI μπορεί να έχει τη δική του διαμόρφωση· περισσότερα στη σελίδα Το SAPI εξηγημένο.
Τρόποι αλλαγής: ποιος επιτρέπεται να ορίσει ποια τιμή;
Δεν επιτρέπεται κάθε ρύθμιση να οριστεί παντού. Το εγχειρίδιο αντιστοιχίζει κάθε οδηγία σε έναν τρόπο αλλαγής:
| Τρόπος | Πού επιτρέπεται να οριστεί η τιμή |
|---|---|
INI_USER |
σε σενάρια με ini_set(), στο μητρώο των Windows και στο .user.ini |
INI_PERDIR |
στο php.ini, στο .htaccess, στο httpd.conf ή στο .user.ini |
INI_SYSTEM |
μόνο στο php.ini ή στο httpd.conf |
INI_ALL |
παντού |
Παραδείγματα από το εγχειρίδιο: το memory_limit έχει τρόπο INI_ALL και προεπιλογή 128M, το post_max_size έχει INI_PERDIR και προεπιλογή 8M, το upload_max_filesize έχει INI_PERDIR και προεπιλογή 2M. Το expose_php επιτρέπεται να βρίσκεται μόνο στο php.ini.
Τα αρχεία .user.ini διαβάζονται σύμφωνα με το εγχειρίδιο μόνο από τα SAPI CGI και FastCGI, άρα και από το PHP-FPM. Η PHP τα αναζητά από τον κατάλογο του σεναρίου προς τα πάνω έως το Document Root και τα ξαναδιαβάζει από προεπιλογή το πολύ κάθε 300 δευτερόλεπτα (user_ini.cache_ttl). Στο mod_php αυτόν τον ρόλο αναλαμβάνει το .htaccess.
Ποια τιμή ισχύει στο τέλος; Τα επίπεδα κατά προτεραιότητα
Απλοποιημένα ισχύει: όσο αργότερα ενεργεί ένα επίπεδο, τόσο πιθανότερο είναι να επικρατήσει η τιμή του, εφόσον το επιτρέπει ο τρόπος αλλαγής.
- php.ini του εκάστοτε SAPI
- Πρόσθετα αρχεία από τον κατάλογο σάρωσης, αλφαβητικά
- Διαμόρφωση διακομιστή: pool FPM με
php_valueήphp_admin_value, VirtualHost του Apache - Επίπεδο καταλόγου:
.htaccessστο mod_php,.user.iniστο FPM και στο CGI - Χρόνος εκτέλεσης:
ini_set()στον κώδικα της εφαρμογής
Η εξαίρεση είναι καθοριστική: τιμές μέσω php_admin_value ή php_admin_flag δεν μπορούν σύμφωνα με το εγχειρίδιο να παρακαμφθούν με ini_set(). Έτσι οι διαχειριστές κλειδώνουν ρυθμίσεις σχετικές με την ασφάλεια απέναντι στην εφαρμογή. Αναλυτική περιγραφή υπάρχει στη σελίδα php_admin_value: κλείδωμα ρυθμίσεων απέναντι σε παράκαμψη.
Το php.ini μετά το PHP2Shell: τι άλλαξε
Τα προσωρινά μέτρα του php.net για το PHP2Shell είναι σχεδόν όλα ρυθμίσεις INI: memory_limit=-1 κλειδωμένο απέναντι σε παράκαμψη, περιορισμένο post_max_size, session.upload_progress.enabled=0 και στην PHP 8.5 fatal_error_backtraces=0. Το php.net τονίζει ότι το session.upload_progress.enabled δεν πρέπει να οριστεί μέσω ini_set() ή .user.ini, αλλά στο php.ini, στο pool του FPM ή στη διαμόρφωση του διακομιστή, με επακόλουθη επανεκκίνηση όλων των workers. Η πλήρης λίστα βρίσκεται στη σελίδα Άμεσα μέτρα όταν δεν μπορείτε ακόμη να εφαρμόσετε patch.
Με τις διορθωμένες εκδόσεις 8.5.12, 8.4.27, 8.3.36 και 8.2.35 άλλαξε σύμφωνα με το εγχειρίδιο και το memory_limit: είναι πλέον ένα ήπιο όριο. Η νέα ρύθμιση memory_hard_limit_percent ορίζει ένα αυστηρό όριο. Χωρίς δική σας τιμή ισούται με το διπλάσιο του memory_limit, για περισσότερα από 1G με την τιμή συν 1G. Αν ξεπεραστεί, η διεργασία τερματίζεται αμέσως με κατάσταση εξόδου 137. Πώς θα επιλέξετε λογικά και τα δύο όρια, εξηγεί η σελίδα Σωστός ορισμός του memory_limit.
Σύμφωνα με το εγχειρίδιο ισχύει: αν μια έκδοση PHP δεν αναγνωρίζει το memory_hard_limit_percent, επηρεάζεται από τα CVE-2026-109618 και CVE-2026-109619. Σε διανομές με backports την κατάσταση αποδεικνύει επιπλέον το changelog του πακέτου.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Εντοπισμός ισχυουσών τιμών: Διαβάζουμε για κάθε SAPI ποια αρχεία φορτώνονται και ποια τιμή ισχύει στο τέλος.
- Τακτοποίηση επιπέδων: Αφαιρούμε αντικρουόμενες εγγραφές από πάνελ, pools,
.htaccessκαι.user.ini. - Ορισμός κλειδωμάτων: Στο πλαίσιο της θωράκισης διακομιστή ορίζουμε τιμές σχετικές με την ασφάλεια μέσω
php_admin_value. - Τεκμηρίωση: Καταγράφουμε τις ρυθμίσεις και την επανεκκίνηση, ώστε η κατάσταση να αποδεικνύεται αργότερα.
Συχνές ερωτήσεις
Πού βρίσκεται το php.ini;
Εξαρτάται από το λειτουργικό σύστημα, το πακέτο και το SAPI. Σε Debian και Ubuntu υπάρχουν ξεχωριστοί φάκελοι ανά έκδοση και SAPI, για παράδειγμα /etc/php/8.3/fpm/php.ini και /etc/php/8.3/cli/php.ini. Στη γραμμή εντολών το php --ini δείχνει τα φορτωμένα αρχεία, για τον ιστότοπο βοηθά το php_ini_loaded_file() σε ένα προσωρινό αρχείο ελέγχου.
Με ποια σειρά διαβάζονται τα αρχεία στον φάκελο conf.d;
Σύμφωνα με το εγχειρίδιο της PHP, η PHP διαβάζει όλα τα αρχεία με κατάληξη .ini στον κατάλογο σάρωσης με αλφαβητική σειρά. Τα μεταγενέστερα αρχεία παρακάμπτουν τιμές των προηγούμενων. Γι' αυτό πολλά αρχεία έχουν στο όνομά τους αριθμούς όπως 20- ή 99-.
Γιατί δεν ισχύει η αλλαγή μου στο php.ini;
Συχνοί λόγοι: αλλάχθηκε το αρχείο άλλου SAPI, δεν έγινε επανεκκίνηση της υπηρεσίας, μια τιμή στο pool του FPM, στη διαμόρφωση του Apache ή σε ένα .user.ini την παρακάμπτει, ή ένα πάνελ φιλοξενίας ξαναγράφει το αρχείο στην επόμενη αποθήκευση.
Τι είναι το memory_hard_limit_percent;
Μια νέα ρύθμιση, που σύμφωνα με το εγχειρίδιο της PHP εισήχθη με τις εκδόσεις ασφαλείας της 21.10.2026. Ορίζει ένα αυστηρό όριο μνήμης ως ποσοστό του memory_limit. Το εγχειρίδιο επισημαίνει ότι μια έκδοση PHP που δεν γνωρίζει αυτή τη ρύθμιση επηρεάζεται από τις ευπάθειες του PHP2Shell.