web-dev-qa-db-fra.com

Limite supérieure de mémoire pour PHP / Apache

Je reçois l'erreur lorsque j'exécute mon script PHP ....

Fatal error: Out of memory (allocated 1827405824) (tried to allocate 88800 bytes)

J'ai ajouté cette ligne à mon PHP ..

ini_set("memory_limit","3000M");

Cette déclaration semble contrôler correctement l'utilisation de la mémoire, mais je ne semble pas être en mesure de l'obtenir au-dessus d'environ 1,8 Go. C'est comme si la limite de mémoire supérieure était restreinte ailleurs. J'ai également ajouté au php.ini ...

memory_limit = 3000M

Est-ce que quelqu'un sait si la mémoire est restreinte ailleurs?

J'exécute un serveur local avec Xampp. J'ai Windows 7, 64 bits avec 4 Go de RAM. Mon script utilise la bibliothèque d'images Gd de PHP et j'obtiens l'erreur lorsque j'essaie d'allouer une référence d'image avec ImageCreateTrueColor ().

(Je sais que c'est une énorme quantité de mémoire - mais ce n'est qu'un script unique, et c'est beaucoup plus facile de le faire de cette façon.)

Merci.

Mettre à jour....

@elusive @Orbling Je m'attends à ce que tout le monde s'ennuie avec cette question, mais voici le code simplifié qui illustre le problème.

<?php
    ini_set("memory_limit","4000000000");
    echo "ini_get = " . ini_get('memory_limit') . "<br>\n";
    echo "memory_get_usage = " . memory_get_usage(true) . "<br>\n";
    $bigImageHandle = imagecreatetruecolor(22200, 24800);  //this is line 5
?>

Sortie du navigateur ...

ini_get = 4000000000
memory_get_usage = 524288

Fatal error: Out of memory (allocated 1843396608) (tried to allocate 88800 bytes) in
E:\User\My_Webs\experiments\houseshunting\temp\osMaps\t1.php on line 5

J'ai testé cela avec un plus petit ensemble de tuiles et la mémoire utilisée par imagecreatetruecolor () et j'estime que j'ai besoin de 2,7 Go

20
spiderplant0

Vous utilisez un système d'exploitation 64 bits, mais Apache et PHP sont probablement encore 32 bits. Si vous utilisez mod_php, Apache serait le facteur limitant ici.

Les processus 32 bits sont limités à environ 2 Go de RAM sauf si vous avez utilisé le commutateur/3GB et que le logiciel est conscient de la prise en charge de 3GB.

Cela laisse encore environ 200 Mio qui semble inutilisé, mais suffisamment petit pour pouvoir être utilisé par diverses bibliothèques qui doivent toutes être chargées en mémoire

Pour autant que je sache, l'utilisation de la bibliothèque n'apparaîtra pas dans la mémoire validée, mais compte toujours pour la limite de 2 Go (tout comme la mémoire de l'appareil compte pour la limite de 4 Go sur les fenêtres 32 bits. Lorsque l'installation de 2 GiB carte graphique vous ramène à moins de 2 Go de RAM utilisable).

La solution la plus probable? Installez un PHP 64 bits, puis envoyez-le à cela (en utilisant un appel system (), peut-être)

9
Reece45

En utilisant Acquia Dev Desktop, j'ai eu de nombreux plantages de limite de mémoire.

Après avoir augmenté la limite de mémoire en PHP.ini.

php_value memory_limit                  1024M
php_value max_execution_time            3000

Ce problème était moins fréquent mais se produisait toujours (en particulier avec Feature Recreate)

Dans mon httpd.conf, j'ai augmenté le StackThread à 16M

ThreadStackSize 16*1024*1024

Et cela a résolu le problème de crash mémoire. J'espère que cela peut aider

8
thenrion

Quelle version PHP version utilisez-vous?

La variable memory_limit est, ou était, contenue dans un entier 32 bits, elle ne peut donc pas dépasser 2 Go.

Voir: http://bugs.php.net/bug.php?id=39132&edit=1

D'après le commentaire du bas sur ce rapport de bogue, il peut s'agir de la routine qui traduit la forme lisible par l'homme en un nombre, essayez de le mettre en chiffres.

1
Orbling

Vérifiez votre configuration Apache (par exemple, httpd.conf). Il y a probablement une directive RLimitMEM limitant la mémoire permettant aux processus enfants de gérer les demandes.

Ainsi, vous pouvez définir votre PHP limiter tout ce que vous voulez, si Apache engendre le processus avec une limite de mémoire, vous ne pouvez pas dépasser cela.

Si vous êtes sur un service hébergé et avez un serveur partagé, vous n'avez probablement pas accès à cette configuration et devez travailler avec votre fournisseur. Comme vous pouvez le voir, c'est la configuration qui s'applique à l'ensemble du serveur ... vous n'allez probablement pas leur faire changer cela. Là encore, si vous cherchez à générer des processus supérieurs à 1.5Gig, vous devriez soit résoudre le problème d'une manière différente (d'autres l'ont suggéré) ou obtenir un serveur dédié d'une certaine sorte (par exemple EC2).

Par exemple:

/usr/local/Apache/conf
#RLimitMEM 85643200 104857600   # Limit to: 80Mb / process, 100Mb total
RLimitMEM 134217728 537395200   # Limit to: 128Mb / Process, 512Mb total
1
JTigger

Le problème est probablement dû à l'exécution d'Apache 32 bits et de php. Essayez de les mettre à niveau vers des binaires 64 bits et voyez si cela résout le problème.

1
Glitch Desire

Essaye ça

set_time_limit(300);
ini_set('memory_limit', '20000M');
0
Vahan Margaryan