ホームページ  >  記事  >  バックエンド開発  >  PHP 拡張機能 - ローリング ロギングを実装するための C 拡張機能

PHP 拡張機能 - ローリング ロギングを実装するための C 拡張機能

WBOY
WBOYオリジナル
2016-08-08 09:23:441047ブラウズ

はじめに

最初は何事も大変です、そうです! !

実際に PHP 拡張機能を開発する前は、CC++ の基礎はある程度持っていましたが、PHP 拡張機能の開発は非常に遠いものだと感じていました。そのために、今回は最終的に PHP 拡張クラス ライブラリを構築することにしました。週末に取り組んだ後、最終的に以前のログ書き込みクラス ライブラリを PHP 拡張フォームにカプセル化しました。 PHP 拡張機能の開発への入門としてここで共有します。これはソース コードです。シングルトン モードでログインするための PHP 拡張機能です。

開発

私が開発したのは、ログを作成するための PHP 拡張機能です。基本的には数日前の PHP ローリング ログと同じで、これもサンプル モードで実行されます。

開発中に注意すべき点をいくつか記録します。

ここではほんの一部ですが、詳細については、ソースコードを参照してください。自分でやり方がわからない人は確認してみてください、記憶が深まります

zval構造を理解しましょう、zvalはPHPカーネルで定義されているデータ構造です
<code>//定义在Zend/zend_types.h:55 和 Zend/zend.h:322行
typedef struct _zval_struct zval;
struct _zval_struct {
    /* Variable information */
    zvalue_value value;     /* value */
    zend_uint refcount;
    zend_uchar type;    /* active type */
    zend_uchar is_ref;
};
typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value */
    zend_object_value obj;
} zvalue_value;

//其中的zval.type表示变量的类型,基本类型有下面几种,定义在Zend/zend.h:583中
#define IS_NULL		0
#define IS_LONG		1
#define IS_DOUBLE	2
#define IS_BOOL		3
#define IS_ARRAY	4
#define IS_OBJECT	5
#define IS_STRING	6

//部分常用的zval相关函数或者宏,定义在Zend/zend_operators.h:441行
Z_LVAL_P(zval_p)	//获取zval_p指针所指向的zval结构的值,值得类型为LONG
Z_STRVAL_P(zval_p)</code>
関数にパラメータを渡す方法
<code>PHP扩展中接受参数的时候通过函数zend_parse_parameters,类似下面的形式进行传参:
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &msg, &msg_len);
第二个参数是要传入参数类型的列表,有下面规范</code>

PHP 拡張機能 - ローリング ロギングを実装するための C 拡張機能

<code>从PHP5.3开始, zend_parse_paramters_函数新增了如下几个新的类型描述符:
f - function or array containing php method call info (returned as zend_fcall_info and zend_fcall_info_cache)
H - array or HASH_OF(object) (returned as HashTable)
L - long, limits out-of-range numbers to LONG_MAX/LONG_MIN (long)
Z - the actual zval (zval**)</code>
サーフェスクラスライブラリを開発するときによく使われるいくつかの関数
メモリリークを防ぐためにメモリの解放に注意してください。開発が完了した後、メモリリークが発生していることがわかりました。 valgrind を使用してメモリ リークをチェックし、不要になったメモリを解放します。そうしないと、大量のメモリが使用され、エラーが発生することがあります。

  1. また、Niao 兄弟の YAF ソース コードを参照してください。これは、学習の初期には単に「猫を真似てトラを描いた」だけでした。
  2. 効果を見てみましょう

開発完了後、ログを10万回(正確には30万回、debug、msg、errを各10万回)出力するスクリプトを書いて試してみたのが以下です。環境と結果

環境:

<code>zend_declare_property_null(mylogs_ce, ZEND_STRL("level"), ZEND_ACC_PRIVATE TSRMLS_CC);	
//类似上面的函数是类进行初始化的时候设置变量
zend_declare_class_constant_long(mylogs_ce, ZEND_STRL("LOG_DEBUG"), 0 TSRMLS_CC);
//类似上面的函数是类型进行初始化的时候设置常量
zend_read_property(mylogs_ce, instance, ZEND_STRL("level"), 0 TSRMLS_CC);
//上面的是从实例instance中读取变量的值
zend_hash_find(&ce->constants_table, ZEND_STRS("LOG_DEBUG"), (void **)&_level);
//上面的是从mylogs_ce这个类中读取常量
zend_update_property_long(mylogs_ce, instance, ZEND_STRL("level"), level TSRMLS_CC);
//上面的是从instance中读取变量level</code>

回初めて2回目平均 PHP拡張機能を使用すると、元の速度の約1/4だけ速度が向上することがわかります。最適化の余地はたくさんあります。頑張ってください~~
PHPコード PHP拡張機能
8.83秒 6.13秒
8.60秒 6.14秒
8.72秒 6.14秒

すべてのコードを github に置きました:

シングルトン モード ロギング PHP 拡張機能

参考記事

C/C++ で PHP を拡張する - Laruence

In - Depth PHP 変数ストレージ構造 - Wen Daxia

5/24/2015 3:10:45 PM

この記事の著作権は作者 ifforever (luluyrt@163.com) に帰属します。著者の同意なしに記事を掲載することは禁止されており、著者と原文へのリンクを記事ページのわかりやすい位置に表示する必要があります。そうでない場合、当社は法的責任を追及する権利を留保します。

上記では、ローリング ロギングを実装するための PHP extension-C 拡張機能をその内容も含めて紹介していますが、PHP チュートリアルに興味のある友人にとって役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。