Augmentation de la limite de mémoire PHP. À quel point est-il devenu fou?

Dans un système sur lequel je travaille actuellement, il existe un processus qui charge une grande quantité de données dans un tableau pour trier/agréger/quoi que ce soit. Je sais que ce processus a besoin d'être optimisé pour l'utilisation de la mémoire, mais à court terme, il doit juste fonctionner.

Compte tenu de la quantité de données chargées dans le tableau, nous continuons à atteindre la limite de mémoire. Il a été augmenté plusieurs fois, et je me demande s'il y a un point où l'augmenter devient généralement une mauvaise idée? ou est-il seulement une question de combien de RAM la machine a?

La machine a 2 Go de RAM et le memory_limit est actuellement fixé à 1,5 Go. Nous pouvons facilement ajouter plus de RAM à la machine (et sera de toute façon).

D'autres ont-ils rencontré ce genre de problème? et quelles étaient les solutions?

36
demandé sur Bob Aman 2009-09-15 08:39:19

3 réponses

La configuration pour le memory_limit de PHP en cours D'exécution en tant que module Apache sur les pages Web du serveur doit prendre en considération le nombre de processus Apache que vous pouvez avoir en même temps sur la machine-Voir l'option de configuration MaxClients pour Apache.

Si MaxClients est 100 et que vous avez 2 000 Mo ou RAM, un calcul très rapide montrera que vous ne devez pas utiliser plus de 20 Mo *(car 20 Mo * 100 clients = 2 Go ou RAM, c'est-à-dire la quantité totale de mémoire de votre serveur) * pour memory_limit valeur.

Et c'est sans considérer qu'il y a probablement d'autres choses qui s'exécutent sur le même serveur, comme MySQL, le système lui-même,... Et Qu'Apache utilise probablement déjà de la mémoire pour lui-même.

Ou bien sûr, c'est aussi un "pire scénario", qui considère que chaque page PHP utilise la quantité maximale de mémoire qu'elle peut.


Dans votre cas, si vous avez besoin d'une si grande quantité de mémoire pour un seul travail, je n'augmenterais pas le memory_limit pour PPP en cours d'exécution en tant que module Apache.

Au lieu de cela, je lancerais ce travail à partir de la ligne de commande (ou via un travail cron) , et spécifierais un memory_limit plus élevé spécifiquement dans ce seul et unique cas.

Cela peut être fait avec l'option -d de php, comme:

$ php -d memory_limit=1GB temp.php
string(3) "1GB"

Considérant, dans ce cas, que temp.php ne contient que:

var_dump(ini_get('memory_limit'));

À mon avis, c'est beaucoup plus sûr que d'augmenter memory_limit pour le module PHP pour Apache - et c'est ce que je fais habituellement quand j'ai un grand dataset, ou des choses vraiment lourdes que je ne peux pas optimiser ou paginer.


Si vous avez besoin de définir plusieurs valeurs pour L'exécution de PHP CLI, vous pouvez également lui dire d'utiliser un autre fichier de configuration, au lieu du php par défaut.ini, avec l'option -c:

php -c /etc/phpcli.ini temp.php

De Cette façon, vous avez :

  • /etc/php.ini pour Apache, avec un faible memory_limit, faible max_execution_time, ...
  • et /etc/phpcli.ini pour les lots exécutés à partir de la ligne de commande, avec pratiquement aucune limite

Cela garantit votre les lots pourront s'exécuter - et vous aurez toujours la sécurité de votre site web (memory_limit et max_execution_time étant des mesures de sécurité)


Pourtant, si vous avez le temps d'optimiser votre script, vous devriez; par exemple, dans ce genre de situation où vous devez traiter beaucoup de données, la pagination est un must-have; -)

54
répondu Pascal MARTIN 2009-09-15 05:00:27

Avez-vous essayé de diviser l'ensemble de données en parties plus petites et de traiter une seule partie à la fois?

Si vous récupérez les données d'un fichier disque, vous pouvezfread() Fonction pour charger des morceaux plus petits, ou certains sorte de requête db non tamponnée dans le cas de la base de données.

Je N'ai pas vérifié PHP depuis v3.quelque chose, mais vous pourriez aussi utiliser une forme de cloud computing. 1 Go dataset semble être assez grand pour être traité sur plusieurs machines.

2
répondu arul 2009-09-15 05:00:28

Étant donné que vous savez qu'il y a des problèmes de mémoire avec votre script qui doivent être corrigés et que vous ne cherchez que des solutions à court terme, alors je n'aborderai pas les façons dede profiler et de résoudre vos problèmes de mémoire. Il semble que vous allez obtenir de qui.

Donc, je dirais que les principales choses que vous devez garder à l'esprit sont:

  • Charge mémoire totale sur le système
  • capacités du système d'exploitation

PHP n'est qu'un petit composant du système. Si vous lui permettez de manger une grande quantité de votre RAM, puis les autres processus en souffriront, ce qui pourrait à son tour affecter le script lui-même. Notamment, si vous extrayez beaucoup de données d'une base de données, votre SGBD peut nécessiter beaucoup de mémoire afin de créer des ensembles de résultats pour vos requêtes. Comme solution rapide, vous pouvez identifier toutes les requêtes que vous exécutez et libérer les résultats dès que possible pour vous donner plus de mémoire pour une longue exécution de travail.

En termes de capacités du système D'exploitation, vous devez garder à l'esprit que les systèmes 32 bits, sur lesquels vous utilisez probablement, ne peuvent traiter que JUSQU'à 4 Go de RAM sans manipulation spéciale. Souvent, la limite peut être beaucoup moins selon la façon dont il est utilisé. Certains chipsets et configurations Windows peuvent en fait avoir moins de 3 Go disponibles pour le système, même avec 4 Go ou plus physiquement installé. Vous devriez vérifier pour voir combien votre système peut répondre.

Vous dites que vous avez augmenté la limite de mémoire plusieurs fois, donc évidemment ce travail est de plus en plus grandes et de plus grande portée. Si vous êtes jusqu'à 1.5 Gb, puis même installer 2Gb plus de RAM sonne comme il sera juste un court sursis.

D'autres ont-ils rencontré ce type de question? et quelles étaient les solutions?

Je pense que vous savez probablement déjà que la seule vraie solution est de tomber en panne et de passer le temps d'optimiser le script bientôt, sinon vous finirez avec un travail qui sera trop gros pour fonctionner.

1
répondu zombat 2009-09-15 05:13:42