1

コンピューターで次のPHPプログラムを実行した場合

echo memory_get_usage();
echo "|";
echo memory_get_usage();
echo "|";
echo memory_get_usage();

出力を取得します

635048|635080|635080

このことから、への最初の呼び出しmemory_get_usageは32KBのメモリを保持しているように見えます。echo私はステートメントなしでこれを試しました

echo memory_get_usage();
echo memory_get_usage();
echo memory_get_usage();

同様の結果が得られました

634504634536634536
//broken out 634504, 634536, 634536

ステートメントを削除するechoと、スクリプトの全体的なメモリ使用量が削減されますが、への最初の呼び出し後も32KBが保持されmemory_get_usageます。どうしてこれなの?

複数のコンピューターでこれを試しましたが、実際の数は異なりますが、ギャップは同じままです。

私が(私が思うに)この関数のソースを見ると

//File: php-5.3.19/ext/standard/var.c
PHP_FUNCTION(memory_get_usage) {
    zend_bool real_usage = 0;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &real_usage) == FAILURE) {
        RETURN_FALSE;
    }

    RETURN_LONG(zend_memory_usage(real_usage TSRMLS_CC));
}

そこには、必ずしも「この変数をメモリに保持する」と書かれているものは何もありません。しかし、私は何年も真剣にCを書いたことがなく、PHPソースを専門的にハッキングしたことはなく、実行を追跡する能力はまったくありません。

だから、私の質問は、その32KBのメモリを何が保持しているのか、そしてそれはPHPソースコードのどこで発生するのか、そして/またはmemory_get_usageエントリポイントからそれをどのように追跡できるのかということです。

4

1 に答える 1

1

これはおそらく、出力を作成する必要がある結果です。おそらく、いくつかの出力バッファリングが関係していますか?

コマンドプロンプトで:

[charles@lobotomy /tmp]$ php --version
PHP 5.4.9 (cli) (built: Nov 22 2012 12:59:04)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans
[charles@lobotomy /tmp]$ cat test.php
<?php
#echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';

[charles@lobotomy /tmp]$ php test.php
227024|227056|227056|

test.phpが最初の測定の前にエコーするように変更されると、次のようになります。

[charles@lobotomy /tmp]$ cat test.php
<?php
echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';
echo memory_get_usage();
echo '|';

[charles@lobotomy /tmp]$ php test.php
|227192|227192|227192|
于 2012-12-09T22:05:24.060 に答える