Я собираюсь предположить, что я не подтвердил это, но, прочитав текст по предоставленной вами ссылке GC, у меня не сложилось впечатление, что memory_get_peak_usage()
должен возвращать дополнительную информацию, основанную на компиляции PHP с флагом DGC_BENCH
. В руководстве сказано, что оно возвращает int, поэтому я подозреваю, что оно всегда возвращает int.
Что он говорит , однако это:
Когда вы снова запустите приведенный выше пример кода с недавно построенным PHP
двоичный, вы увидите следующее после завершения PHP
выполнение:
Это не очень понятно, но у меня сложилось впечатление, что дополнительные детали GC будут напечатаны в stdout
или stderr
, а не возвращены в memory_get_peak_usage()
или напечатаны как дополнительный вывод в ваш PHP-скрипт. .
Попробуйте вызвать только что созданный исполняемый файл PHP из командной строки и посмотреть, выводится ли информация GC на консоль после завершения сценария.
Вы можете попробовать назвать его так: /path/to/custom/php testfile.php
Я не уверен, что имеет смысл выводить эту информацию, если вы запускаете PHP как модуль Apache или обработчик FastCGI, поэтому я подозреваю, что вы сможете увидеть его только при вызове скрипта из консоли, но я мог бы совершенно неправильно там.
UPDATE:
Я проверил, что флаг компиляции GC_BENCH
все еще активен, и это так.
Zend / zend.c
905 #if GC_BENCH
906 fprintf(stderr, "GC Statistics\n");
907 fprintf(stderr, "-------------\n");
908 fprintf(stderr, "Runs: %d\n", GC_G(gc_runs));
909 fprintf(stderr, "Collected: %d\n", GC_G(collected));
910 fprintf(stderr, "Root buffer length: %d\n", GC_G(root_buf_length));
911 fprintf(stderr, "Root buffer peak: %d\n\n", GC_G(root_buf_peak));
912 fprintf(stderr, " Possible Remove from Marked\n");
913 fprintf(stderr, " Root Buffered buffer grey\n");
914 fprintf(stderr, " -------- -------- ----------- ------\n");
915 fprintf(stderr, "ZVAL %8d %8d %9d %8d\n", GC_G(zval_possible_root), GC_G(zval_buffered), GC_G(zval_remove_from_buffer), GC_G(zval_marked_grey));
916 fprintf(stderr, "ZOBJ %8d %8d %9d %8d\n", GC_G(zobj_possible_root), GC_G(zobj_buffered), GC_G(zobj_remove_from_buffer), GC_G(zobj_marked_grey));
917 #endif
Затем я скомпилировал PHP 5.3.9 для Apache2 и CLI. Прежде чем принять решение об установке тестовой версии, я запустил новое приложение PHP CLI из консоли:
./sapi/cli/php -v
PHP 5.3.9 (cli) (built: Feb 22 2012 19:03:02)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
GC Statistics
-------------
Runs: 0
Collected: 0
Root buffer length: 0
Root buffer peak: 7
Possible Remove from Marked
Root Buffered buffer grey
-------- -------- ----------- ------
ZVAL 15 7 7 0
ZOBJ 0 0 0 0
Он имеет вывод GC, хотя я не вызывал PHP. Затем я grep'd libphp5.so
и увидел, что в нем действительно есть бит статистики GC, поэтому я решил установить его вживую и сделать вызов из Apache. Нет вывода GC в браузере, error_log, access_log или любых других файлах журнала.
Теперь интересная часть , я создал файл test.php, который выводит строку и создает освобождает несколько переменных ...
root@vm:/php539# php test.php
This is a test
root@vm:/php539# php < test.php
This is a test
GC Statistics
-------------
Runs: 0
Collected: 0
Root buffer length: 0
Root buffer peak: 7
Possible Remove from Marked
Root Buffered buffer grey
-------- -------- ----------- ------
ZVAL 16 7 7 0
ZOBJ 0 0 0 0
root@vm:php539#
Вывод:
Когда PHP скомпилирован с параметром GC_BENCH
, у вас не будет доступа к информации о тесте при вызове из браузера или при анализе файлов PHP с помощью параметра -f
или при передаче имени файла для анализа. Вы действительно получите информацию о тестах, если вы вызываете php в интерактивном режиме, или выполняете скрипт через PHP, читая его из stdin
.