Maison >développement back-end >Problème PHP >Comment limiter l'utilisation de la mémoire du processus PHP en utilisant memory_limit
Memory_limit dans l'hôte virtuel PHP est la limite maximale de mémoire disponible pour une seule exécution d'un seul script PHP ; la limite par défaut est de 256 Mo et le maximum peut être ajusté à 512 Mo. L'éditeur ci-dessous explique comment utiliser memory_limit pour limiter l'utilisation de la mémoire du processus PHP.
memory_limit Comme son nom l'indique, il limite l'utilisation de la mémoire du processus PHP. Par exemple :
La configuration système requise de magento2 a des restrictions sur la limite de mémoire PHP, qui ne peut pas être inférieure à 512 Mo. (La valeur par défaut est 128M. Si elle n'est pas modifiée, la logique de traitement en arrière-plan de Magento ne s'exécutera pas normalement)
Regardez l'explication sur le site officiel de PHP
.Cela définit la valeur maximale quantité de mémoire en octets qu'un script est autorisé à allouer. Cela permet d'éviter que des scripts mal écrits consomment toute la mémoire disponible sur un serveur. Notez que pour n'avoir aucune limite de mémoire, définissez cette directive sur -1.
Obligatoire Notez que plus la valeur de memory_limit est élevée, c'est-à-dire plus un seul processus PHP occupe de mémoire, moins le système peut traiter de requêtes simultanément. Par exemple, si une machine avec 2 Go de mémoire
memory_limit est définie sur 128 Mo, elle peut gérer jusqu'à 16 requêtes en même temps. Si memory_limit est définie sur 256 Mo, elle peut gérer jusqu'à 8 requêtes en même temps. time. Si memory_limit est défini sur 512 M, il peut gérer jusqu'à 4 requêtes en même temps. Requêtes
Est-ce que plus la valeur de memory_limit est grande, mieux c'est ?
Bien sûr que non, memory_limit sert principalement à empêcher les bugs du programme ou les boucles infinies d'occuper une grande quantité de mémoire, provoquant des temps d'arrêt du système. Lors de l'introduction d'un grand nombre de plug-ins ou de codes tiers, il est indispensable de limiter la mémoire.
memory_limit fera en sorte que chaque processus PHP occupe une quantité fixe de mémoire ?
Ou est-ce simplement la limite supérieure de la mémoire allouée ? Testez l'idée
, définissez memory_limit sur 10M et initialisez une chaîne 2M/20M dans la requête PHP pour voir l'utilisation de la mémoire dans le processus système.
Configuration Nginx
server { listen 8093; root /home/zhongwei/work/test/memory_limit/; index index.php index.html index.htm; server_name localhost; location / { # try_files $uri $uri/ =404; try_files $uri $uri/ /index.php?q=$uri&$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param PHP_VALUE "memory_limit = 10M"; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } }
Fichier de test PHP
<?php $char_count = 2; $M = 1024 * 1024; echo sprintf("Current memory_limit value is: %s.", ini_get('memory_limit')); echo sprintf('<br/>Amount of memory allocated to PHP: %0.3fM.', memory_get_usage() / $M); $s = str_repeat("a", $M * $char_count); //sleep(30); echo sprintf('<br/>Amount of memory allocated to PHP: %0.3fM.', memory_get_usage() / $M); echo sprintf('<br/>Total memory allocated from system: %0.3fM.', memory_get_usage($real_usage=true) / $M); echo '<br/>success';
Résultat du test
Lorsque $char_count vaut 2, une chaîne occupant 2 Mo de mémoire est initialisée et affiche le le résultat est
Current memory_limit value is: 10M. Amount of memory allocated to PHP: 0.344M. Amount of memory allocated to PHP: 2.348M. Total memory allocated from system: 4.004M. success
Lorsque $char_count vaut 20, une chaîne occupant 20 Mo de mémoire est initialisée et le résultat de sortie est
Current memory_limit value is: 10M. Amount of memory allocated to PHP: 0.346M.
Notez que le code d'état HTTP est 500, ce qui signifie que la chaîne est exécuté Lors de l'initialisation, le processus PHP a été tué par le système.
Regardez les informations du journal enregistrées dans Nginx error.log
2017/03/01 10:41:23 [error] 6903#6903: *39 FastCGI sent in stderr: "PHP message: PHP Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 20971552 bytes) in /home/zhongwei/work/test/memory_limit/index.php on line 8 PHP message: PHP Stack trace: PHP message: PHP 1. {main}() /home/zhongwei/work/test/memory_limit/index.php:0 PHP message: PHP 2. str_repeat() /home/zhongwei/work/test/memory_limit/index.php:8" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "localhost:8093"
Les résultats réels des tests montrent que memory_limit limite uniquement la limite supérieure d'utilisation de la mémoire pour chaque processus PHP, plutôt que de l'allouer à chacun processus. Mémoire fixe. Par conséquent, le nombre de simultanéités ne diminuera pas car le paramètre memory_limit est plus grand. Quelle est la valeur par défaut de memory_limit ? >
La version après PHP 5.2 est de 128 Mo
Apprentissage recommandé :
Tutoriel vidéo phpCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!