# Σωστή ρύθμιση του memory_limit

> PHP memory_limit σωστά: τι κάνει η τιμή, πού ισχύει, τι συνιστά προσωρινά το php.net για το PHP2Shell και τι πρέπει να ισχύει ξανά μετά την ενημέρωση.

Πηγή: https://phpsos.de/el/blog/memory-limit-richtig-setzen/  
Ημερομηνία: 25/10/2026  
Πάροχος: PHP SOS, Επείγουσα βοήθεια PHP και ασφάλεια διακομιστών. Άμεση βοήθεια μέσω WhatsApp: https://wa.me/491736494914?text=%CE%93%CE%B5%CE%B9%CE%B1%20%CF%83%CE%B1%CF%82%2C%20PHP%20SOS%2C%20%CF%87%CF%81%CE%B5%CE%B9%CE%B1%CE%B6%CF%8C%CE%BC%CE%B1%CF%83%CF%84%CE%B5%20%CE%B2%CE%BF%CE%AE%CE%B8%CE%B5%CE%B9%CE%B1%20%CE%BC%CE%B5%20%CF%84%CE%BF%CE%BD%20%CE%B4%CE%B9%CE%B1%CE%BA%CE%BF%CE%BC%CE%B9%CF%83%CF%84%CE%AE%20PHP%20%CE%BC%CE%B1%CF%82.%20%CE%95%CF%84%CE%B1%CE%B9%CF%81%CE%B5%CE%AF%CE%B1%3A%20%E2%80%A6%20%CE%99%CF%83%CF%84%CF%8C%CF%84%CE%BF%CF%80%CE%BF%CF%82%3A%20%E2%80%A6

**Εν ολίγοις:** Το `memory_limit` ορίζει πόση μνήμη επιτρέπεται να δεσμεύσει ένα μεμονωμένο αίτημα PHP· η προεπιλογή είναι 128M. Στην κανονική λειτουργία ορίζετε μια πεπερασμένη τιμή που ταιριάζει στην εφαρμογή και την κλειδώνετε με `php_admin_value`. Όσο το PHP2Shell δεν έχει διορθωθεί, το php.net συνιστά προσωρινά `memory_limit=-1`, μη αντικαταστάσιμο και σε συνδυασμό με όριο μέσω container ή cgroup, όχι μέσω `RLIMIT_AS` ή `RLIMIT_DATA`. Μετά την ενημέρωση ισχύει ξανά πεπερασμένη τιμή.

## Μια ρύθμιση ρουτίνας που ξαφνικά αφορά την ασφάλεια

Επί χρόνια το `memory_limit` ήταν μια ρύθμιση για προγραμματιστές. Όταν ένας ιστότοπος αναφέρει «Allowed memory size exhausted», η τιμή αυξάνεται και το πρόβλημα λύνεται. Με το PHP2Shell έγινε ζήτημα ασφαλείας και η σύσταση του php.net φαίνεται εκ πρώτης όψεως παράδοξη: για τη μετάβαση πρέπει να καταργηθεί εντελώς το δικό της όριο μνήμης της PHP.

Το υπόβαθρο είναι η CVE-2026-109618. Σύμφωνα με το έργο PHP, μια κατάσταση Out-of-Memory μπορεί να διακόψει την PHP ενώ τα δεδομένα του αιτήματος έχουν αρχικοποιηθεί μόνο εν μέρει. Ο καθαρισμός του αιτήματος μπορεί τότε να αντιμετωπίσει άκυρα δεδομένα ως έγκυρα. Τεχνικές λεπτομέρειες υπάρχουν στο [CVE-2026-109618](https://phpsos.de/el/php2shell/cve-2026-109618/), τι συμβαίνει σε έλλειψη μνήμης στο εσωτερικό της PHP εξηγεί το [memory_limit και Out-of-Memory](https://phpsos.de/el/php/out-of-memory/). Για τους φορείς λειτουργίας μετράει το ερώτημα: ποια τιμή ισχύει πότε και πού πρέπει να βρίσκεται;

## Τι προσφέρει το memory_limit στην κανονική λειτουργία

Σύμφωνα με το εγχειρίδιο της PHP, το `memory_limit` περιορίζει τη μνήμη που επιτρέπεται να δεσμεύσει ένα σενάριο και προστατεύει έτσι τον διακομιστή από κακογραμμένο κώδικα. Η προεπιλογή είναι `128M`, το `-1` σημαίνει κανένα όριο. Επιτρέπονται συντομογραφίες όπως `256M` ή `1G`.

Δύο ιδιότητες έχουν σημασία για την ασφάλεια. Πρώτον, η τιμή μπορεί να αλλάξει παντού, ακόμη και κατά την εκτέλεση με `ini_set()`. Πολλά CMS και καταστήματα την αυξάνουν μόνα τους, για παράδειγμα για εισαγωγές ή επεξεργασία εικόνων. Όποιος θέλει να επιβάλει μια τιμή, πρέπει να την ορίσει με `php_admin_value`· σύμφωνα με το εγχειρίδιο, οι τιμές που ορίζονται έτσι δεν μπορούν να αντικατασταθούν με `ini_set()`. Δεύτερον, το εγχειρίδιο συνιστά το `memory_limit` να είναι μεγαλύτερο από το `post_max_size`.

Ποια τιμή ταιριάζει, εξαρτάται από την εφαρμογή. Μια ματιά στο log σφαλμάτων δείχνει αν εμφανίζονται μηνύματα για εξαντλημένη μνήμη και σε ποιες κλήσεις. Έχει αποδειχθεί να ορίζεται η τιμή ανά ιστότοπο στο δικό του pool FPM: πιο γενναιόδωρη για ένα κατάστημα με εισαγωγές, πιο περιορισμένη για μια απλή εταιρική σελίδα. Μια γενικά πολύ υψηλή τιμή για όλους τους ιστοτόπους χαρίζει την προστατευτική δράση, επειδή τότε ένα μεμονωμένο ελαττωματικό ή καταχρηστικό αίτημα μπορεί να δεσμεύσει πολλή μνήμη.

Από την PHP 8.5 υπάρχει επιπλέον το `max_memory_limit`. Αυτή η ρύθμιση μπορεί να οριστεί μόνο κατά την εκκίνηση και περιορίζει πόσο ψηλά επιτρέπεται καν να οριστεί το `memory_limit`. Υψηλότερες τιμές περικόπτονται με προειδοποίηση. Η προεπιλογή `-1` σημαίνει κανένα ανώτατο όριο.

## memory_limit μετά το PHP2Shell: το μεταβατικό μέτρο του php.net

Για διακομιστές που δεν έχουν ακόμη ενημερωθεί σε 8.5.12, 8.4.27, 8.3.36 ή 8.2.35 ή σε επιβεβαιωμένο backport, το php.net αναφέρει στην ανακοίνωση ασφαλείας της 21/10/2026 τα εξής βήματα. Μειώνουν τον κίνδυνο μεμονωμένων οδών επίθεσης, αλλά δεν καθιστούν μια εγκατάσταση ασφαλή σύμφωνα με το php.net:

1. **Ορίστε `memory_limit=-1`,** κατά το δυνατόν ώστε οι εφαρμογές να μην μπορούν να αντικαταστήσουν την τιμή, για παράδειγμα με `php_admin_value` στο pool FPM ή στη διαμόρφωση του Apache.
2. **Ελέγξτε ότι πουθενά δεν ορίζεται ξανά πεπερασμένο όριο,** ούτε σε άλλο pool, ούτε σε διαμόρφωση φακέλου, ούτε στην εφαρμογή.
3. **Ορίστε όριο μνήμης μέσω container ή cgroup,** ως προστασία της διαθεσιμότητας, κατά το δυνατόν ώστε σε υπέρβαση να τερματίζεται μόνο ο επηρεαζόμενος worker.
4. **Μη χρησιμοποιείτε `RLIMIT_AS` ή `RLIMIT_DATA`.** Αυτά τα όρια μπορούν σύμφωνα με το php.net να προκαλέσουν ακριβώς το ευάλωτο σφάλμα κατά την αίτηση μνήμης.

Το php.net εξηγεί ότι το `-1` αφαιρεί την εσκεμμένα προκαλούμενη επίτευξη του ορίου μνήμης της PHP, ένα σφάλμα μνήμης σε βαθύτερο επίπεδο μπορεί όμως να φτάσει ακόμη στην ευάλωτη διαδρομή. Η επισκόπηση όλων των μεταβατικών μέτρων υπάρχει στο [Άμεσα μέτρα όταν δεν μπορείτε ακόμη να εφαρμόσετε patch](https://phpsos.de/el/php2shell/sofortmassnahmen-ohne-patch/).

```ini
; Pool FPM, π.χ. /etc/php/8.3/fpm/pool.d/www.conf (μόνο μέχρι την ενημέρωση)
php_admin_value[memory_limit] = -1
```

```bash
# Πού ορίζεται παντού το memory_limit (μόνο ανάγνωση)
grep -rn 'memory_limit' /etc/php/ /etc/apache2/ 2>/dev/null
grep -rn --include='*.php' -E "ini_set\s*\(\s*['\"]memory_limit" /var/www | head -20
grep -rn --include='.user.ini' 'memory_limit' /var/www
```

Πώς ορίζετε το όριο cgroup για την υπηρεσία FPM, περιγράφει το [Ορισμός ορίων μνήμης με systemd και cgroups](https://phpsos.de/el/blog/speichergrenzen-systemd-cgroups/). Χωρίς αυτό το εξωτερικό όριο, ένα μεμονωμένο αίτημα μπορεί να φέρει ολόκληρο τον διακομιστή σε έλλειψη μνήμης.

> **Σημαντικό:**
> Μετά από κάθε αλλαγή επανεκκινήστε όλους τους workers της PHP. Ένας worker που εκτελείται διατηρεί τις παλιές τιμές του.

## Τι ισχύει μετά την ενημέρωση

Με τις διορθωμένες εκδόσεις έχει αλλάξει, σύμφωνα με το εγχειρίδιο της PHP, και η συμπεριφορά του `memory_limit`. Από τις 8.5.12, 8.4.27, 8.3.36 και 8.2.35 είναι ήπιο όριο: μια αίτηση μνήμης που το υπερβαίνει επιτρέπεται στις περισσότερες περιπτώσεις να ολοκληρωθεί, προτού προκληθεί το σφάλμα. Μια νέα ρύθμιση, το `memory_hard_limit_percent`, ορίζει ένα σκληρό όριο που δεν υπερβαίνεται ποτέ.

| Ρύθμιση | Τιμή | Αποτέλεσμα σύμφωνα με το εγχειρίδιο |
|---|---|---|
| `memory_hard_limit_percent` μη ορισμένο ή `-1` | προεπιλογή | σκληρό όριο διπλάσιο του `memory_limit` έως 1G, πάνω από αυτό `memory_limit` συν 1G |
| `memory_hard_limit_percent = 150` | παράδειγμα | με `memory_limit=128M` σκληρό όριο 192M |
| `memory_limit = -1` | κανένα όριο | τότε δεν υπάρχει ούτε σκληρό όριο |

Το εγχειρίδιο αναφέρει ένα πρακτικό σημείο ελέγχου: αν το `memory_hard_limit_percent` δεν αναγνωρίζεται, η χρησιμοποιούμενη έκδοση PHP επηρεάζεται και πρέπει να ενημερωθεί. Στα backports των διανομών ελέγχετε επιπλέον την κατάσταση μέσω του changelog του πακέτου.

```bash
# Γνωρίζει το δυαδικό αρχείο FPM τη νέα ρύθμιση; (προσαρμόστε τον αριθμό έκδοσης)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'
```

Μετά την ενημέρωση, το `memory_limit=-1` έχει εκπληρώσει τον σκοπό του. Επιστρέψτε σε μια πεπερασμένη τιμή που ταιριάζει στην εφαρμογή και κλειδώστε την με `php_admin_value`. Το όριο cgroup μπορεί να παραμείνει ως πρόσθετο προστατευτικό στρώμα.

## Πώς βοηθά συγκεκριμένα η PHP SOS;

- Εντοπίζουμε πού ορίζεται και πού αντικαθίσταται το `memory_limit` στον διακομιστή σας, συμπεριλαμβανομένων των εφαρμογών.
- Εφαρμόζουμε τα μεταβατικά μέτρα του php.net στο σωστό σημείο και προσθέτουμε όριο cgroup για την υπηρεσία FPM.
- Μέσω της [υπηρεσίας patch PHP](https://phpsos.de/el/leistungen/php-patch-service/) φέρνουμε την PHP σε διορθωμένη έκδοση και επανεκκινούμε όλους τους workers.
- Στη συνέχεια ορίζουμε ξανά μια κατάλληλη πεπερασμένη τιμή και τεκμηριώνουμε τις ρυθμίσεις.


## Συχνές ερωτήσεις

**Ποια είναι η προεπιλεγμένη τιμή του memory_limit;**  
Σύμφωνα με το εγχειρίδιο της PHP, 128M. Η τιμή περιορίζει πόση μνήμη επιτρέπεται να δεσμεύσει ένα μεμονωμένο σενάριο. Μπορεί να αλλάξει στο php.ini, στη διαμόρφωση του διακομιστή, στο pool FPM και κατά την εκτέλεση με ini_set(), εφόσον δεν έχει κλειδωθεί με php_admin_value.

**Γιατί το php.net συνιστά στο PHP2Shell memory_limit=-1;**  
Μία από τις ευπάθειες, η CVE-2026-109618, σχετίζεται με την κατάσταση σε έλλειψη μνήμης. Σύμφωνα με το php.net, το memory_limit=-1 αφαιρεί την εσκεμμένα προκαλούμενη επίτευξη του ορίου μνήμης της PHP, όχι όμως κάθε σφάλμα μνήμης. Το μέτρο δεν αποτελεί πλήρη προστασία και πρέπει να συνδυάζεται με όριο μνήμης μέσω container ή cgroup.

**Μπορώ να ορίσω το όριο αντί γι' αυτό με ulimit;**  
Όχι. Το php.net αποθαρρύνει ρητά τη χρήση των RLIMIT_AS ή RLIMIT_DATA ως υποκατάστατο, επειδή αυτά τα όρια μπορούν να προκαλέσουν ακριβώς το ευάλωτο σφάλμα κατά την αίτηση μνήμης. Συνιστάται όριο μέσω container ή cgroup.

**Τι ισχύει μετά την ενημέρωση σε διορθωμένη έκδοση PHP;**  
Σύμφωνα με το εγχειρίδιο, το memory_limit στις διορθωμένες εκδόσεις είναι ήπιο όριο, συμπληρωμένο από σκληρό όριο μέσω του memory_hard_limit_percent. Το μεταβατικό μέτρο με -1 έχει τότε εκπληρώσει τον σκοπό του και πρέπει να ισχύει ξανά μια πεπερασμένη τιμή, κατάλληλη για την εφαρμογή.

## Πηγές

- [php.net: ανακοίνωση ασφαλείας της 21/10/2026](https://www.php.net/)
- [Εγχειρίδιο της PHP: βασικές ρυθμίσεις (memory_limit)](https://www.php.net/manual/en/ini.core.php)
- [Εγχειρίδιο της PHP: διαμόρφωση FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
