La configuration de l memory_limit
de PHP s'exécutant en tant que module Apache pour le serveur de pages web doit prendre en compte le nombre de processus Apache que vous pouvez avoir en même temps sur la machine -- voir la page MaxClients
option de configuration pour Apache.
Si MaxClients
est de 100 et que vous disposez de 2 000 Mo de RAM, un calcul très rapide montrera que vous ne devez pas utiliser plus de 20 Mo *(car 20 Mo * 100 clients = 2 Go de RAM, c'est-à-dire la quantité totale de mémoire dont dispose votre serveur)* pour la valeur de memory_limit.
Et ceci sans tenir compte du fait qu'il y a probablement d'autres choses qui fonctionnent 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.
Bien sûr, il s'agit également d'un "scénario du pire", 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 une seule tâche, je n'augmenterais pas la valeur de l'espace mémoire de l'ordinateur. memory_limit
pour PHP fonctionnant comme un module Apache.
Au lieu de cela, je lancerais ce travail à partir de la ligne de commande (ou via une tâche cron) et spécifier une valeur plus élevée memory_limit
spécifiquement dans ce seul et unique cas.
Cela peut être fait avec le -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 la limite de mémoire du module PHP d'Apache - et c'est ce que je fais habituellement lorsque j'ai un grand ensemble de données, ou des données vraiment lourdes que je ne peux pas optimiser ou paginer.
Si vous devez définir plusieurs valeurs pour l'exécution du CLI PHP, vous pouvez également lui demander d'utiliser un autre fichier de configuration, au lieu du php.ini par défaut, avec l'option -c
option :
php -c /etc/phpcli.ini temp.php
De cette façon, vous avez :
-
/etc/php.ini
pour Apache, avec de faibles memory_limit
, faible max_execution_time
, ...
- et
/etc/phpcli.ini
pour les lots exécutés en ligne de commande, avec pratiquement aucune limite
Cela garantit que vos lots pourront être exécutés - et que vous aurez toujours la sécurité pour votre site web ( memory_limit
et max_execution_time
étant des mesures de sécurité)
Néanmoins, si vous avez le temps d'optimiser votre script, vous devriez le faire ; par exemple, dans ce genre de situation où vous devez traiter beaucoup de données, la pagination est indispensable ;-)
6 votes
Honnêtement, vous ne devriez pas vous préoccuper de fixer une limite de mémoire, mais plutôt de déterminer où se trouve votre fuite de mémoire et de la réparer. Ce n'est pas une solution de simplement augmenter la limite de mémoire, c'est éviter un problème dans le code. Examinez les objets pour lesquels vous définissez et supprimez des valeurs afin d'éliminer une fuite.
0 votes
Pouvez-vous être précis quant à la quantité de données ? Qu'entendez-vous par grande quantité ?
8 votes
@Frederico : L'OP n'essaie pas de réparer une fuite de mémoire, il demande une solution pour gérer de très grands ensembles de données en PHP.
0 votes
Je suis conscient que ce n'est pas une réponse idéale, mais je cherche des conseils jusqu'à ce que nous ayons la possibilité de faire mieux. @Jergason Il s'agit de données tabulaires provenant d'une requête de base de données, ~500k lignes, 15 colonnes. La taille est relative à la mémoire disponible, mais c'est suffisant pour atteindre la limite de mémoire à 1,5 Go actuellement. Je ne suis pas sûr de la taille finale, d'où la question "quand est-ce que c'est trop ?".
0 votes
Pouvez-vous nous donner des informations sur la tâche que script exécute ? Nous pourrons peut-être vous aider à optimiser l'algo pour éliminer la consommation excessive de mémoire.