2010-05-05 5 views
0

HI, Je télécharge mon script de test php sur le serveur vps en ligne juste maintenant. Le script utilisé pour analyser un fichier XML de grande taille (environ 4M, 7000Lines). Mais mon explorateur IE affiche le message d'erreur en ligne ci-dessous.Erreur fatale: Taille de la mémoire allouée épuisée

Erreur fatale: taille maximale autorisée pour la mémoire de 16777216 octets épuisé (a essayé d'allouer 77 octets) dans /var/www/test/result/index.php en ligne 26

Je suis sûr que je l'ai déjà testé la script PHP sur localhost avec succès.

Y a-t-il une configuration à activer/modifier sur mon VPS? Comme php.ini ou un paramètre pour le serveur apache? Je viens de vérifier qu'il y a environ 200M d'utilisation de la mémoire disponible pour mon VPS. Comment puis-je réparer cela?

...... 
function startElementHandler ($parser,$name,$attrib){ 
    global $usercount; 
    global $userdata; 
    global $state; // Line #26; 
    //Debug 
    //print "name is: ".$name."\n"; 
    switch ($name) { 
     case $name=="_ID" : { 
     $userdata[$usercount]["first"] = $attrib["FIRST"]; 
     $userdata[$usercount]["last"] = $attrib["LAST"]; 
     $userdata[$usercount]["nick"] = $attrib["NICK"]; 
     $userdata[$usercount]["title"] = $attrib["TITLE"]; 
     break; 
     } 

     ...... 

     default : {$state=$name;break;} 
    } 
} 
+2

garder à l'esprit qu'un jour votre XML peut devenir trop grand mémoire disponible ... – Axarydax

+1

quelle bibliothèque utilisez-vous pour analyser le fichier? Si c'est un gros fichier, vous pouvez envisager d'utiliser XMLReader plutôt que toute autre bibliothèque, car il n'a pas besoin de charger tout le document en mémoire en premier. – Gordon

+0

@Gordon, je n'ai pas utilisé de bibliothèque, je viens de trouver le tutoriel 'codehelp.co.uk/php/xmlparse1.php' et je l'ai pratiqué avec mon fichier XML. Et j'apprendrais XMLReader plus tard. Merci. –

Répondre

3

Votre configuration PHP limite PHP à seulement 16 mégaoctets de mémoire. Vous devez modifier la directive de configuration memory_limit dans php.ini pour l'augmenter.

Recherchez la ligne dans le fichier php.ini qui ressemble à ceci:

memory_limit = 16M 

... et passer à une valeur élevée (16M = 16 méga-octets, vous pouvez l'augmenter à quelque chose comme 64M 64 mégaoctets, et cetera). Si vous ne trouvez aucune ligne comme celle-ci, ajoutez-la.

Si vous préférez ne faire que l'augmenter au niveau du script, vous pouvez également utiliser ini_set() pour modifier la valeur de ce script uniquement.

+0

Je pense qu'il serait préférable de le définir plus grand uniquement pour ce fichier, mais laissez la valeur la plus basse pour la configuration par défaut. –

+0

@Dav, j'ai modifié la valeur à 64M, et cela fonctionne bien. Plus tard, j'apprendrais plus de connaissances PHP et XML et j'améliorerais mon code. @All, merci. –

1
ini_set("memory_limit","XXM"); 

s'il vous plaît notez que certains serveurs empêchent de travailler (bien que dans un VPS cela ne devrait pas être un problème, il est surtout un problème d'hébergement Web).

modifier: au lieu de "XX" écrire la taille réelle, comme 128M

+0

+1 Si vous pouvez alors utiliser ceci juste pour le code qui a besoin de la mémoire supplémentaire plutôt que de la rendre globale. –

+0

@ Lo'oris, j'ai essayé d'insérer 'ini_set (" memory_limit "," 128M ");' dans mon fichier index.php. Mais ça ne marche toujours pas. a montré le même message d'erreur. Je suppose que mon VPS ne peut pas supporter la fonction. Je ne peux que modifier php.ini et redémarrer mon service web :-(Merci ' –

1

Assurez-vous que vous avez spécifié les paramètres corrects acceptables pour:

  • file_uploads
  • upload_max_filesize
  • max_input_time
  • memory_limit
  • max_execution_time
  • post_max_size

Vous pouvez appeler la fonction phpinfo() pour trouver l'emplacement de votre fichier php.ini, il sera également vous dire les valeurs actuelles pour les paramètres que vous devez modifier.

Vous pouvez également utiliser la fonction ini_set pour définir certaines de ces valeurs à partir de votre script.

VOIR:

Howto optimize your PHP installation to handle large file uploads.

2

Vous pouvez également utiliser memory_get_peak_usage() pour savoir quelle partie du programme est en train de manger votre mémoire.

2

Utilisez un analyseur SAX au lieu d'un analyseur DOM, et vous ne manquerez pas de mémoire. DOM occupe 8 à 10 fois plus de mémoire que le flux de documents réel, alors que SAX a une charge constante raisonnable quelle que soit la taille du document.

1

Il est sale mais dans certains cas avec de gros fichiers XML, il est plus rapide d'obtenir les valeurs via des expressions régulières! Et si c'est un format XML bien formaté, il ne devrait pas y avoir de problème!

code pseudo:

preg_match('+<title>(.*)</title>+', $xml_content, $matches); 
var_dump($matches); 
0

pour l'hébergement partagé mettre cette ligne pour vous index.php

ini_set("memory_limit","128M"); 
Questions connexes