8
votes

Comment provoquer intentionnellement une "erreur fatale: la taille de la mémoire autorisée des octets xxx épuisés"

Chaque fois que j'ai reçu cette erreur, j'ai juste augmenté la mémoire pour le réparer. J'ai un cas où, à des fins de test, je veux causer une page à utiliser toute la mémoire si gros que j'ai défini le Memory_Limit.

Je n'ai aucune idée de la façon de le faire.

ÉDITER: J'ai essayé ceci: xxx

mais il n'a pas écrasé. À la fin, il vient d'imprimer "StartStart" qui est étrange qu'il a été imprimé deux fois ...

Je voudrais un exemple de code simple, le "mettre beaucoup de choses en mémoire" .. bien je sache beaucoup.


2 commentaires

Soyez créatif, c'est tout ce que je peux dire.


La prochaine fois, commencez par la publication de ce que vous essayez et avez essayé.


8 Réponses :


1
votes

Vous pouvez faire une boucle infinie, même si je conseillerais contre cela.

Vous pouvez également ouvrir / lire dans des fichiers de mémoire de mémoire qui dépasserait la limite de mémoire, vous pouvez également écrire une boucle qui générerait une chaîne avec la quantité d'octets qui dépasserait la limite de mémoire.

Quel est le meilleur, aucun indice. Mais il y a quelques options à votre disposition.


0 commentaires

21
votes

devrait manger toute la mémoire.

$a = 'x';
while (true) {
    $a = $a.$a;
}


4 commentaires

Prend <1 sec pour épuiser ma mémoire


J'ai essentiellement essayé que, même s'il est légèrement plus efficace, cela n'a fourni aucun meilleur résultat.


@Phazei: Voir ma réponse. Vous avez eu $ test = "A" + $ test; qui est très différent de $ test = "A". $ test;


$ a. = $ A est plus concis et plus facile à taper. :)



1
votes
  1. Téléchargez toutes les images Google Maps.
  2. puis les redimensionnez-les à l'aide de GD dans une échelle 1-1.

0 commentaires

1
votes

Écrivez une fonction PHP qui essaie de trouver un motif dans / dev / aléatoire


0 commentaires

8
votes

Voici le problème:

$test = "a" . $test;


2 commentaires

se frappe à la tête avec le clavier plusieurs fois (je savais que ... trop de JS dernièrement)


@Hazei: Pas de problème, je l'ai fait à plusieurs reprises et je suis codé PHP depuis 2000!



1
votes
<?php
$limit = ini_get('memory_limit');
$last = strtolower($limit[strlen($limit)-1]);
switch($last) {
    case 'g':
        $limit *= 1024;
    case 'm':
        $limit *= 1024;
    case 'k':
        $limit *= 1024;
}
$limit = $limit + 1;//not needed actually, I assume the script has consumed 1 byte of memory by now...
$foo = `dd if=/dev/zero bs=$limit count=1`;
//or, if you don't like the command line:
$bar = str_repeat($a,$limit);

5 commentaires

En fait, que +1 sur limite est nécessaire. Ne s'est pas écrasé autrement.


Ici, il y a plus de frais généraux puis 0 octets, comme pour les paramètres d'instance sont chargés, etc. Je suis plutôt surpris que vous disposez d'une surcharge de 0 octet sur des scripts PHP, mais bien sûr, je ne peux pas discuter avec vos résultats.


Avec votre script, j'obtiens l'erreur "Taille de la mémoire autorisée épuisée". Mais je viens de réaliser si ça fait un moment (1) {$ octet = $ octet. $ Octet} Je reçois une erreur "hors de mémoire" longtemps avant de frapper la limite autorisée que l'ancienne erreur heurte. Une quelconque idée du pourquoi?


Nope, aucune idée de quelle est la différence entre ces 2. Vous voudrez peut-être vouloir Grep dans la source PHP pour vérifier dans quelles conditions elles se produisent. Cela pourrait avoir quelque chose à voir avec l'obtention de la mémoire d'un programme extérieur ou de pouvoir prédire que doubler une longueur de chaîne entraînera une utilisation beaucoup de mémoire. Bien que ici les deux erreurs soient les mêmes «épuisées» (PHP 5.3.2)


S'est révélé être un problème de mémoire avec les processus enfants sur Apache. $ FOO a causé une "sortie de mem" tandis que $ bar causée "autorisée mem épuisée". Aussi tandis que (1) {$ titulaire [] = str_repeat ($ octet, 1024 * 1024); } a causé un "hors de membre". Il s'avère que tout était à cause de RLIMITMEM et RLIMITCPU dans httpd.conf, définissait une limite de mémoire dure sur les processus d'enfants. Il semble que la barre $ aurait également dû causer une erreur "hors du membre", mais comme il a essayé de l'attribuer en une seule étape, il doit s'agir d'un bogue où il est possible de contourner le réglage RLIMITMEM.



7
votes
str_pad("",PHP_INT_MAX);

0 commentaires

1
votes

J'aime des solutions simples, donc je suis souvent juste à cette ligne qui fonctionne comme un charme.

str_repeat('a', PHP_INT_MAX);


0 commentaires