Php。拡張子。既存の PHP 関数を呼び出す



c php-extension (1)

関数の仕組みを理解する最も簡単な方法は、lxr.php.netで関数を検索することです。 最初の例はreadlineにあります: http://lxr.php.net/xref/PHP_TRUNK/ext/readline/readline.c#474 : http://lxr.php.net/xref/PHP_TRUNK/ext/readline/readline.c#474

mailの使用は類似している。 引数をzvals( to_zvalfrom_zvalmsg_zval )とすると、呼び出しは非常に簡単です。

zval *params = { to_zval, from_zval, msg_zval };
zend_uint param_count = 3;
zval *retval_ptr;

zval function_name;
INIT_ZVAL(function_name);
ZVAL_STRING(&function_name, "mail", 1);

if (call_user_function(
        CG(function_table), NULL /* no object */, &function_name,
        retval_ptr, param_count, params TSRMLS_CC
    ) == SUCCESS
) {
    /* do something with retval_ptr here if you like */
}

/* don't forget to free the zvals */
zval_ptr_dtor(&retval_ptr);
zval_dtor(&function_name);

パラメータが既にzvalsとして存在しない場合は、 MAKE_STD_ZVALZVAL_STRINGを使用してパラメータを作成できます。

だから私はPHPの拡張機能を書くことにしました。 私はちょっとした問題に取りつかない限り、すべてがうまくいくようです。

私はphp-5.4.9ソースコードを持っています。 すばらしい関数を持つext/standard/mail.cファイルがあります

PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char *extra_cmd TSRMLS_DC)

私の拡張では、 acme.c

...
#include "php.h"
#include "ext/standard/php_mail.h"
#include "php_ini.h"
...

だからphp_mailは気持ちが良く、うまく動作します。 しかし、明らかに、私は101行目から189行目( http://pastie.org/5444192 mail.cペースト中の対応する行)のmail.cのコードを使いたいと思います。 だから、 PHP_FUNCTION(mail)を呼び出さないようにするのはPHP_FUNCTION(mail)ですね。 その瞬間、私はそのマクロを見つけることができず、実際にそのアイディアを実装する最良の方法を知りたいと思います。

私の内側のzendエンジニア(これは初心者です)は私にcall_user_function

ZEND_API int call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, zend_uint param_count, zval *params[] TSRMLS_DC);

しかし、私はそれを呼び出す方法を理解することはできません。

質問! PHP_FUNCTION定義された関数をどのように呼び出すか( mail関数を使用した例が大歓迎です)





php-extension