私はいつも PHP 拡張機能の開発を学びたいと思っていました。大量の C コードを見るたびに、どこから始めればよいのかわからないように感じます。かつて、Hello World を開発するためにそれを使用しました。しかし、まだよくわかりません。
最近、ランダムな文字列を生成するメソッドが必要です。ネイティブ PHP の生成は少し遅いと感じます (主な理由は、拡張機能の作成を学習できたら試してみたいからです)。そこで、zehphir を使用して拡張機能を作成しました。
さあ、アッシ。速度は純正より遅いです。以前に zephir もテストしたことがありますが、PHP ネイティブ関数が呼び出されないと、何度も速度が低下するようです。したがって、ゼフィールを学習したい場合は、ゼフィールをコード暗号化方法として扱う必要があります。
そこで、C の使用を考えてみましょう。では、どうやって開発すればよいのでしょうか?
Baidu、Google などで多くのチュートリアルを見つけることができます。多くの人は、最初に def ファイルを作成すると言います。初めて作ったときにこの方法で作りました。しかし、今回はdefの書き方のチュートリアルが見つかりませんでした。そこでチュートリアルを探しました。
最終的に、拡張機能を作成するには、主に定義を追加したり、いくつかの場所に関数を追加したりする必要があることがわかりました。もちろん、これは単なる単純な機能です。クラスを開発する方法はまだわかりません。情報を持っている友人がいくつか提供してくれるでしょう。
まず、ext_skelは拡張コードを生成します。
./ext_skel --extname=phpext
次に、phpext ディレクトリに入ると、php_phpext.h と phpext.c が表示されます。次に、まず php_phpext.h を開いて次のコードを見つけます
PHP_MINFO_FUNCTION(phpext);
以下に追加したい関数を追加します。関数名は英語の文字列でカスタマイズする必要があります
PHP_FUNCTION(函数名称)
次に、phpext.c を開いて次のコードを見つけますコード。これは PHP エントリ関数です。どのような関数があるかを PHP に伝える必要があります。
const zend_function_entry ukey_functions[] = {}
追加した PHP 関数の名前を入力してください
PHP_FE(函数名称, NULL)
次のステップは、トリックを拡大することです。関数の機能を追加します。関数
PHP_FUNCTION(函数名称){//这里填写功能if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) //这里获取一个整形的 参数 。length需要前面定义,这里获取到的参数赋值给length{ RETURN_NULL();//返回null }}
PHP 組み込みの return 関数
#define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value, l)#define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b)#define RETVAL_NULL() ZVAL_NULL(return_value)#define RETVAL_LONG(l) ZVAL_LONG(return_value, l)#define RETVAL_DOUBLE(d) ZVAL_DOUBLE(return_value, d)#define RETVAL_STRING(s, duplicate) ZVAL_STRING(return_value, s, duplicate)#define RETVAL_STRINGL(s, l, duplicate) ZVAL_STRINGL(return_value, s, l, duplicate)#define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value)#define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)#define RETVAL_FALSE ZVAL_BOOL(return_value, 0)#define RETVAL_TRUE ZVAL_BOOL(return_value, 1)#define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }#define RETURN_NULL() { RETVAL_NULL(); return;}#define RETURN_LONG(l) { RETVAL_LONG(l); return; }#define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }#define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return; }#define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }#define RETURN_FALSE { RETVAL_FALSE; return; }#define RETURN_TRUE { RETVAL_TRUE; return; }
PHP でパラメータを受け取り、フォーマットする関数
b Booleanl Integer 整型d Floating point 浮点型s String 字符串r Resource 资源a Array 数组o Object instance 对象O Object instance of a specified type 特定类型的对象z Non-specific zval 任意类型~Z zval**类型f 表示函数、方法名称,PHP5.1里貌似木有... .