Maison >développement back-end >Problème PHP >Comment limiter l'utilisation de la mémoire du processus PHP en utilisant memory_limit

Comment limiter l'utilisation de la mémoire du processus PHP en utilisant memory_limit

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-06-23 16:24:393798parcourir

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.

Comment limiter l'utilisation de la mémoire du processus PHP en utilisant memory_limit

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(&#39;memory_limit&#39;));
echo sprintf(&#39;<br/>Amount of memory allocated to PHP: %0.3fM.&#39;, memory_get_usage() / $M);
$s = str_repeat("a", $M * $char_count);
//sleep(30);
echo sprintf(&#39;<br/>Amount of memory allocated to PHP: %0.3fM.&#39;, memory_get_usage() / $M);
echo sprintf(&#39;<br/>Total memory allocated from system: %0.3fM.&#39;, memory_get_usage($real_usage=true) / $M);
echo &#39;<br/>success&#39;;

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 php

Ce 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer