Objekteinführung
xhprof: PHP-Leistungsanalysetool, eine von Facebook entwickelte PHP-Erweiterung, die die Aufrufkette der Funktions-/Klassenmethode während der Ausführung von PHP-Skripten sowie die von jedem Aufruf verbrauchte Zeit aufzeichnen kann Speichernutzung und andere Daten;
snappy: ein von Google entwickeltes String-Komprimierungs-/Dekomprimierungstool. Der Vorteil ist eine schnelle Komprimierungsgeschwindigkeit.
Ziel
Stellen Sie zwei PHP-Funktionen xhprof_compress($str) und xhprof_uncompress($str) in der xhprof-Erweiterung bereit, um Komprimierungs- und Dekomprimierungsfunktionen zu implementieren.
Spezifischer Prozess
1. Laden Sie den xhprof-Quellcode auf php-5.6.24/ext/xhprof herunter
2. Folgen Sie dem normalen Weg./configure, stellen Sie sicher, dass xhprof.so funktioniert ordnungsgemäß
3. Laden Sie den Snappy-Quellcode nach php-5.6.24/ext/xhprof/snappy herunter
4. Bearbeiten Sie die Datei php-5.6.24/ext/xhprof/php_xhprof.h und fügen Sie die folgenden Zeilen hinzu:
...
PHP_FUNCTION(xhprof_compress);
PHP_FUNCTION(xhprof_uncompress);
...
5. Bearbeiten Sie die Datei php-5.6.24/ext/xhprof /xhprof.c und fügen Sie die folgenden Zeilen hinzu:
... #include "snappy/snappy-c.h" ... zend_function_entry xhprof_functions[] = { ... PHP_FE(xhprof_compress, NULL) PHP_FE(xhprof_uncompress, NULL) ... }; PHP_FUNCTION(xhprof_compress) { zval *data; char *output; size_t output_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &data) == FAILURE) { RETURN_FALSE; } if (Z_TYPE_P(data) != IS_STRING) { zend_error(E_WARNING, "snappy_compress : expects parameter to be string."); RETURN_FALSE; } output_len = snappy_max_compressed_length(Z_STRLEN_P(data)); output = (char *)emalloc(output_len); if (!output) { zend_error(E_WARNING, "snappy_compress : memory error"); RETURN_FALSE; } if (snappy_compress(Z_STRVAL_P(data), Z_STRLEN_P(data), output, &output_len) == SNAPPY_OK) { #if ZEND_MODULE_API_NO >= 20141001 RETVAL_STRINGL(output, output_len); #else RETVAL_STRINGL(output, output_len, 1); #endif } else { RETVAL_FALSE; } efree(output); } PHP_FUNCTION(xhprof_uncompress) { zval *data; char *output = NULL; size_t output_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &data) == FAILURE) { RETURN_FALSE; } if (Z_TYPE_P(data) != IS_STRING) { zend_error(E_WARNING, "snappy_uncompress : expects parameter to be string."); RETURN_FALSE; } if (snappy_uncompressed_length(Z_STRVAL_P(data), Z_STRLEN_P(data), &output_len) != SNAPPY_OK) { zend_error(E_WARNING, "snappy_uncompress : output length error"); RETURN_FALSE; } output = (char *)emalloc(output_len); if (!output) { zend_error(E_WARNING, "snappy_uncompress : memory error"); RETURN_FALSE; } if (snappy_uncompress(Z_STRVAL_P(data), Z_STRLEN_P(data), output, &output_len) == SNAPPY_OK) { #if ZEND_MODULE_API_NO >= 20141001 RETVAL_STRINGL(output, output_len); #else RETVAL_STRINGL(output, output_len, 1); #endif } else { zend_error(E_WARNING, "snappy_uncompress : data error"); RETVAL_FALSE; } efree(output); } ...
Der obige Code ist nicht original und stammt aus der PHP-Erweiterung von snappy: php-ext-snappy
6 Bearbeiten Sie die Datei config.m4 Geben Sie die Kompilierungsmethode von Snappy an
Vervollständigen Sie den config.m4-Code Wie folgt: Snappy wird direkt in xhprof.so bearbeitet. Eine bessere Möglichkeit wäre, zunächst zu prüfen, ob Snappy auf dem aktuellen Host installiert ist. Wenn ja, geben Sie den Pfad der Linkbibliothek an, damit keine Notwendigkeit besteht, Snappy-bezogene Funktionen in xhprof.so zu kompilieren.
PHP_ARG_ENABLE(xhprof, whether to enable xhprof support, [ --enable-xhprof Enable xhprof support]) dnl compiler C++: PHP_REQUIRE_CXX() dnl snappy SNAPPY_MAJOR="1" SNAPPY_MINOR="1" SNAPPY_PATCHLEVEL="3" AC_PROG_CXX AC_LANG([C++]) AC_C_BIGENDIAN AC_CHECK_HEADERS([stdint.h stddef.h sys/mman.h sys/resource.h windows.h byteswap.h sys/byteswap. h sys/endian.h sys/time.h]) AC_CHECK_FUNC([mmap]) AC_MSG_CHECKING([if the compiler supports __builtin_expect]) AC_TRY_COMPILE(, [ return __builtin_expect(1, 1) ? 1 : 0 ], [ snappy_have_builtin_expect=yes AC_MSG_RESULT([yes]) ], [ snappy_have_builtin_expect=no AC_MSG_RESULT([no]) ]) if test x$snappy_have_builtin_expect = xyes ; then AC_DEFINE([HAVE_BUILTIN_EXPECT], [1], [Define to 1 if the compiler supports __builtin_expect.]) fi AC_MSG_CHECKING([if the compiler supports __builtin_ctzll]) AC_TRY_COMPILE(, [ return (__builtin_ctzll(0x100000000LL) == 32) ? 1 : 0 ], [ snappy_have_builtin_ctz=yes AC_MSG_RESULT([yes]) ], [ snappy_have_builtin_ctz=no AC_MSG_RESULT([no]) ]) if test x$snappy_have_builtin_ctz = xyes ; then AC_DEFINE([HAVE_BUILTIN_CTZ], [1], [Define to 1 if the compiler supports __builtin_ctz and friends.]) fi if test "$ac_cv_header_stdint_h" = "yes"; then AC_SUBST([ac_cv_have_stdint_h], [1]) else AC_SUBST([ac_cv_have_stdint_h], [0]) fi if test "$ac_cv_header_stddef_h" = "yes"; then AC_SUBST([ac_cv_have_stddef_h], [1]) else AC_SUBST([ac_cv_have_stddef_h], [0]) fi if test "$ac_cv_header_sys_uio_h" = "yes"; then AC_SUBST([ac_cv_have_sys_uio_h], [1]) else AC_SUBST([ac_cv_have_sys_uio_h], [0]) fi AC_SUBST([SNAPPY_MAJOR]) AC_SUBST([SNAPPY_MINOR]) AC_SUBST([SNAPPY_PATCHLEVEL]) AC_CONFIG_FILES([snappy/snappy-stubs-public.h]) AC_OUTPUT dnl Check for stdc++ LIBNAME=stdc++ AC_MSG_CHECKING([for stdc++]) AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE( [ #include <string> using namespace std; ],[ string dummy; ],[ AC_MSG_RESULT(yes) PHP_ADD_LIBRARY($LIBNAME, , XHPROF_SHARED_LIBADD) ],[ AC_MSG_ERROR([wrong stdc++ library not found]) ]) AC_LANG_RESTORE PHP_SUBST(XHPROF_SHARED_LIBADD) dnl Sources SNAPPY_SOURCES="snappy/snappy-c.cc snappy/snappy.cc snappy/snappy-stubs-internal.cc snappy/ snappy-sinksource.cc" if test "$PHP_XHPROF" != "no"; then PHP_NEW_EXTENSION(xhprof, xhprof.c $SNAPPY_SOURCES, $ext_shared) fi
Der obige Code ist nicht original und stammt aus der PHP-Erweiterung von snappy: php-ext-snappy
7 Führen Sie nach der erneuten Ausführung von phpize make aus, um eine neue xhprof.so zu generieren
8. Führen Sie den Befehl nm xhprof.so aus, um zu überprüfen, ob die Snappy-bezogenen Funktionen erfolgreich kompiliert wurden. Wie unten gezeigt, sind die Speicheradressen von _snappy_compress, _snappy_uncompress usw. nicht leer, was darauf hinweist, dass sie kompiliert wurden xhprof.so.
➜ xhprof nm modules/xhprof.so 0000000000008a98 s GCC_except_table10 0000000000008ad8 s GCC_except_table11 0000000000008b24 s GCC_except_table12 0000000000008b70 s GCC_except_table13 0000000000008bb0 s GCC_except_table14 0000000000008bfc s GCC_except_table16 0000000000008c48 s GCC_except_table18 0000000000008cbc s GCC_except_table19 0000000000008d4c s GCC_except_table23 00000000000088f4 s GCC_except_table5 0000000000008934 s GCC_except_table7 0000000000008a0c s GCC_except_table8 0000000000008a4c s GCC_except_table9 ... 0000000000002510 T _restore_cpu_affinity 0000000000003f00 T _snappy_compress 0000000000003f60 T _snappy_max_compressed_length 0000000000003f70 T _snappy_uncompress 0000000000003fe0 T _snappy_uncompressed_length 0000000000004000 T _snappy_validate_compressed_buffer ... U _zend_register_long_constant U _zend_unregister_ini_entries 00000000000013a0 T _zif_xhprof_compress 0000000000001090 T _zif_xhprof_disable 0000000000001350 T _zif_xhprof_dump 0000000000001040 T _zif_xhprof_enable 0000000000001200 T _zif_xhprof_sample_disable 00000000000011e0 T _zif_xhprof_sample_enable 0000000000001470 T _zif_xhprof_uncompress 0000000000001700 T _zm_activate_xhprof 0000000000001720 T _zm_deactivate_xhprof 0000000000001960 T _zm_info_xhprof 0000000000001660 T _zm_shutdown_xhprof 0000000000001560 T _zm_startup_xhprof 0000000000001f00 t _zval_dump U _zval_used_for_init
9. Sie können xhprof_compress() und xhrof_uncompress() in PHP-Skripten verwenden