3

私はajaxリクエスト用のページを使用しており、その中にexit();を追加します。これはajaxリクエストであるため、テンプレートのロードを停止する関数。

問題は、exit()を追加するたびに、メモリが解放されないことです。私はこのようにメモリをチェックしました:

//mypage.php
echo memory_get_usage(); exit(); // This results to memory to climb up for every page refresh.
===============================
//mypage.php
echo memory_get_usage(); // The memory is ok

//For clarification the above codes are executed at different times.

何が問題なのですか?終了時にメモリを解放するにはどうすればよいですか?助けてくださいありがとう!

4

4 に答える 4

2

これはPHPの既知の側面のようであり、私よりも間違いなくはるかに多くの知識を持っている人々によると、それは一種の意図的なものです。誰かがまったく同じ質問をしました(http://comments.gmane.org/gmane.comp.php.devel/77918)、そして彼らは故意にそれをしていることがわかりました:

リクエストの最後にプールアロケータに依存して物事をワイプするという意図的なリークがいくつかあります。そのため、リクエストの途中で1つ見つかった場合よりも、リクエストの終了時に表示される内容については心配していません。

これがあなたの質問にいくらかの光を当てることを願っています。

于 2013-02-26T23:53:50.893 に答える
1

エラーを再現できた唯一の方法は、値をに格納し、その長さを毎回$_SESSION2倍にすることです。これが私のコードです:

<?php

session_start();

if (!isset($_SESSION['test'])) {
    $_SESSION['test'] = 'abcdefghij';
}
else {
    $_SESSION['test'] .= $_SESSION['test'];
}
$_SESSION['memory'][] = memory_get_usage();

print_r($_SESSION['memory']);
exit;

ページを24回更新した後、ようやくメモリが不足しました。

Array
(
    [0] => 231768
    [1] => 232088
    [2] => 232248
    [3] => 232424
    [4] => 232640
    [5] => 232728
    [6] => 233200
    [7] => 233984
    [8] => 235376
    [9] => 238136
    [10] => 243392
    [11] => 253768
    [12] => 274384
    [13] => 315480
    [14] => 397536
    [15] => 561512
    [16] => 889328
    [17] => 1544952
    [18] => 2855808
    [19] => 5477384
    [20] => 10720400
    [21] => 21206296
    [22] => 42177952
    [23] => 84121128
)
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 83886344 bytes) in Unknown on line 0

ページが更新されるたびにメモリ使用量が増加することがわかります。

PHPに指示するとexit、コード内でそれ以上何も実行されません。私の推測では、あなたがした後のどこかでexit、あなたも次のようなことをします:

$_SESSION['test'] = 'something else';

ページをexit作成すると、これは実行されないため、指数関数的に増加するループにスローされ、毎回メモリ使用量が増加します。このようなものが見つからない場合は、Xdebugを調べて、何が起こっているのかをよりよく把握することをお勧めします。

于 2013-02-27T00:47:43.030 に答える
0

メモリリークの原因について間違っていると思います。exitコードを以下に変更しようとすると、呼び出し後に何も実行されないことがわかります。

echo memory_get_usage(); exit(); // This results to memory to climb up for every page refresh.

echo "I will never echo". PHP_EOL;
echo memory_get_usage(); // The memory is ok

これを適切にデバッグするには、次のようにすべてのインラインデバッグに追加のデバッグコンテキストを含めることをお勧めします。

echo "before database call: ". memory_get_usage() . PHP_EOL;

そしてそれらからメモリ使用量が上昇し始める場所を見つけ出します

于 2013-02-26T23:54:34.400 に答える
0

みんな助けてくれてありがとう、本当に感謝しています。幸運なことに、問題が見つかりました。これはおそらく、ob_start()を含む私のテンプレートクラスのrender()メソッドです。したがって、exit()関数がmypage.php(render()に含まれている)で呼び出された場合。出力バッファが使い果たされている可能性があります。これが問題になる可能性があるかどうかはわかりませんが、template-> render()の実行順序を変更することで問題を解決できました。

みんなありがとう!!

于 2013-02-27T01:06:06.517 に答える