PHPでsnappyをxhprofに統合する方法

伊谢尔伦
リリース: 2016-11-21 14:43:09
オリジナル
1563 人が閲覧しました

オブジェクトの紹介
xhprof: Facebook が開発した PHP 拡張機能である PHP パフォーマンス分析ツール。PHP スクリプトの実行中の関数/クラス メソッドの呼び出しチェーン、各呼び出しに消費された時間、メモリ使用量、その他のデータを記録できます。 ;
snappy: Google が開発した文​​字列圧縮/解凍ツール。圧縮速度が速いのが特徴です。

目標
圧縮機能と解凍機能を実装するために、xhprof 拡張機能に 2 つの PHP 関数 xhprof_compress($str) と xhprof_uncompress($str) を提供します。

具体的なプロセス
1. xhprof ソースコードを php-5.6.24/ext/xhprof にダウンロードします
2. 通常の方法に従って、xhprof.so が正しく動作することを確認します
3.コードを php-5.6.24 /ext/xhprof/snappy
4. ファイル php-5.6.24/ext/xhprof/php_xhprof.h を編集し、次の行を追加します:

...
PHP_FUNCTION(xhprof_compress);
PHP_FUNCTION(xhprof_uncompress);
...

5. ファイル php-5.6.24/ext/xhprof/xhprof.c を編集し、次の行を追加します:

 ...
 #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);
 }
...
ログイン後にコピー

上記のコードはオリジナルではなく、snappy の PHP から取得したものです。拡張子: php-ext-snappy
6. config を編集します。snappy のコンパイル方法を指定します。 完全な config.m4 コードは次のとおりです。より良い方法は、最初に現在のホストに snappy がインストールされているかどうかを確認し、インストールされている場合はリンク ライブラリのパスを指定することです。これにより、snappy 関連の関数を xhprof.so にコンパイルする必要がなくなります。

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
ログイン後にコピー

上記のコードはオリジナルではなく、snappy の PHP 拡張機能 php-ext-snappy から取得したものです。 phpize を再実行した後、make を実行して新しい xhprof.so を生成します

コマンド nm xhprof.so を実行します。関数が正常にコンパイルされたかどうかは、以下に示すように、_snappy_compress、_snappy_uncompress などのメモリ アドレスがすべて空ではなく、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. PHP スクリプトで xhprof_compress() と xhrof_uncompress() を使用できます
関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!