ホームページ >バックエンド開発 >PHPの問題 >Memory_limitを使用してPHPプロセスのメモリ使用量を制限する方法

Memory_limitを使用してPHPプロセスのメモリ使用量を制限する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-06-23 16:24:393809ブラウズ

仮想ホスト PHP の

Memory_limit は、単一の PHP スクリプトの 1 回の実行で使用可能な最大メモリ制限です。デフォルトの制限は 256MB で、最大値は 512MB に調整できます。以下のエディタでは、memory_limit を使用して PHP プロセスのメモリ使用量を制限する方法を紹介します。

Memory_limitを使用してPHPプロセスのメモリ使用量を制限する方法

memory_limit 名前が示すように、PHP プロセスのメモリ使用量を制限します。例:

magento2 のシステム要件には、PHP のmemory_limit に関する制限があり、512M 未満にすることはできません。 (デフォルト値は128Mです。変更しないとmagentoのバックグラウンド処理ロジックが正常に実行されません)

PHP公式サイトの説明を見てください

これは、スクリプトが割り当てることができるメモリの最大量 (バイト単位)。これにより、不適切に作成されたスクリプトがサーバー上の利用可能なメモリを使い果たすことを防ぐことができます。メモリ制限を設けないようにするには、このディレクティブを -1.

## に設定することに注意してください。
#必須memory_limit の値が大きいほど、つまり、単一の PHP プロセスが占有するメモリが多くなるほど、システムが同時に処理できるリクエストが少なくなることに注意してください。たとえば、2G メモリを搭載したマシンの

memory_limit が 128M に設定されている場合、同時に最大 16 個のリクエストを処理でき、memory_limit が 256M に設定されている場合、最大 8 個のリクエストを同時に処理できます。 resource_limit を 512M に設定すると、同時に最大 4 つのリクエストを処理できます。

もちろんそうではありません。memory_limit の主な目的は、プログラムのバグや無限ループが大量のメモリを占有し、システムのダウンタイムを引き起こすのを防ぐことです。多数のサードパーティのプラグインやコードを導入する場合、メモリを制限することが非常に必要になります。

Memory_limit は、各 PHP プロセスが固定量のメモリを占有するようにしますか?

それとも、単に割り当てられたメモリの上限なのでしょうか?

アイデアをテストし、memory_limit を 10M に設定し、PHP リクエストで 2M/20M 文字列を初期化し、システム プロセスでのメモリ使用量を確認します。

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;
        }
}

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;;

テスト結果

$char_count が 2 の場合、2M のメモリを占有する文字列が初期化されて出力されます。結果は

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

$char_count は 20、つまり 20M のメモリを占有する文字列が初期化され、出力結果は

Current memory_limit value is: 10M.
Amount of memory allocated to PHP: 0.346M.

になります。HTTP ステータス コードは 500 であることに注意してください。これは、次のことを意味します。文字列が実行されます。初期化中に、PHP プロセスがシステムによって強制終了されました。

Nginx error.log に記録されたログ情報を確認してください。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"

実際のテスト結果では、memory_limit は各 PHP プロセスにメモリ使用量を割り当てるのではなく、各 PHP プロセスのメモリ使用量の上限を制限するだけであることがわかります。プロセス、固定メモリ。したがって、memory_limit の設定が大きくなったために同時実行数が減少することはありません。

memory_limit のデフォルト値は何ですか

PHP 5.2 より前は 8M
  • PHP 5.2 は 16M
  • PHP 5.2 以降のバージョンは 128M
  • 推奨学習:
  • php ビデオ チュートリアル

以上がMemory_limitを使用してPHPプロセスのメモリ使用量を制限する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsunzhongwei.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。