一个很有潜力的PHP扩展开发框架

一个很有潜力的PHP扩展开发框架

最近准备给新项目整合一个php的 dll扩展,今天在cu论坛很幸运发现一篇好帖:一个全新的c开发的PHP扩展框架,详细说明了扩展的开发过程
很有指导意义,下面转部分内容

Kiss – 用Php扩展实现的简单框架
代码简介:

  1. 我使用php v5.2.3,主要在64位的Ubuntu 7.10中开发,使用Apache 2.2.4,Php编译为Apache的模块;
  2. 同时在Windows XP Pro中使用VC6编译成功并测试可用;
  3. 由于不会用libtool,所以不知道如何将代码拆分到多个文件编译,请不要见笑我的代码管理方式^_^;
  4. 代码文件:
    • php_kiss.h – 模块头文件;
    • kiss.c – Php扩展相关代码;
    • kiss_inner.c – 实现基本功能,为kiss.c所#include;
    • kiss_const.c – 声明了太多的Php常量及相关macro,所以单放在此,为kiss.c所#include;
  • php_kiss.h:

    #ifndef PHP_KISS_H
    #define PHP_KISS_H

    extern zend_module_entry kiss_module_entry;
    #define phpext_kiss_ptr &kiss_module_entry

    /** … */

    #ifdef ZTS
    #define KISS_G(v) TSRMG(kiss_globals_id, zend_kiss_globals *, v)
    extern int kiss_globals_id;
    #else
    #define KISS_G(v) (kiss_globals.v)
    extern zend_kiss_globals kiss_globals;
    #endif

    #ifdef ZTS
    #include “TSRM.h”
    #endif

    #define KISS_VERSION “0.1”
    #define PHP_EXT “.php”
    #define CLASS_EXT “Controller”
    #define ACTION_EXT “Action”
    #define DEFAULT_MODULE “”
    #define DEFAULT_CONTROLLER “index”
    #define DEFAULT_ACTION “index”
    /** … */
    static PHP_FUNCTION(kiss_eval);

    static PHP_FUNCTION(kiss_status);
    static PHP_FUNCTION(kiss_set_rule);
    static PHP_FUNCTION(kiss_clear_rules);
    static PHP_FUNCTION(kiss_front_start);
    static PHP_FUNCTION(kiss_set_listener);
    static PHP_FUNCTION(kiss_forward);
    static PHP_FUNCTION(kiss_redirect);
    static PHP_FUNCTION(kiss_request_query);
    static PHP_FUNCTION(kiss_request_post);
    static PHP_FUNCTION(kiss_request_params);
    static PHP_FUNCTION(kiss_request_get);

    /** … */

    ZEND_BEGIN_MODULE_GLOBALS(kiss)
    /** life cycle: module */
    char dir_sep;
    char * cfg_file;
    zend_bool cfg_inited;
    HashTable hosts_rw; // TODO: 以后使用持久存储或者系统分配内存,以使用全局数据。

    HashTable hosts_ls; // TODO: 以后使用持久存储或者系统分配内存,以使用全局数据。

    zend_class_entry * action_ce;

    zend_class_entry * listener_ce;
    /* life cycle: request */
    kiss_status * status;
    zval * obj_cache;
    zval * ls_called;
    zval * ls_pre_disp;
    zval * ls_post_disp;
    kiss_request * request; // TODO: 考虑模块启动时候申请内存

    // kiss_response * response; // TODO: 考虑模块启动时候申请内存

    ZEND_END_MODULE_GLOBALS(kiss)

    #endif    /* PHP_KISS_H */

    kiss_const.c:

    #define KISS_CONST_CS_P (CONST_CS | CONST_PERSISTENT)

    #define KISS_EVAL ZEND_EVAL
    #define KISS_INCLUDE ZEND_INCLUDE
    #define KISS_INCLUDE_ONCE ZEND_INCLUDE_ONCE
    #define KISS_REQUIRE ZEND_REQUIRE
    #define KISS_REQUIRE_ONCE ZEND_REQUIRE_ONCE

    #define KISS_STATUS_PREFIX_CTL 1
    #define KISS_STATUS_SHARE_GP 4
    #define KISS_STATUS_USE_PORT 5
    #define KISS_STATUS_USE_CACHE 7
    #define KISS_STATUS_DISPATCH_TYPE 8
    #define KISS_STATUS_CLI_ROOT 16
    #define KISS_STATUS_EXT_PROC 9
    #define KISS_STATUS_EXT_PATH 10
    #define KISS_STATUS_DEFAULT_MDL 11
    #define KISS_STATUS_DEFAULT_CTL 12
    #define KISS_STATUS_DEFAULT_ACT 13
    #define KISS_STATUS_POSTFIX_CTL 14
    #define KISS_STATUS_POSTFIX_ACT 15

    #define KISS_E_READFILE 123
    #define KISS_E_ONLYCLI 124
    #define KISS_E_NEEDURI 125
    #define KISS_E_CFGFILE 126
    #define KISS_E_INITREQ 127
    #define KISS_E_ROUTE 128
    #define KISS_E_DISPATCH 129
    #define KISS_E_CLSFILE 130
    #define KISS_E_INSTANCE 131
    #define KISS_E_CALLFUNC 132
    #define KISS_E_CALLMTD 133
    #define KISS_E_EVAL 134
    #define KISS_E_NEEDROOT 135

    #define KISS_REQ_ALL (0xFF)
    #define KISS_REQ_METHOD (1<<0)
    #define KISS_REQ_HOST (1<<1)
    #define KISS_REQ_MODULE (1<<2)
    #define KISS_REQ_CONTROLLER (1<<3)
    #define KISS_REQ_ACTION (1<<4)
    #define KISS_REQ_FRAGMENT (1<<5)
    #define KISS_REQ_QUERY (1<<6)
    #define KISS_REQ_POST (1<<7)
    #define KISS_REQ_PARAMS ((1<<6)^(1<<7))

    #define KISS_DISPATCH_FUNCTION (1<<0)
    #define KISS_DISPATCH_METHOD (1<<1) // default

    #define KISS_LS_PRE_DISPATCH (1<<0) // default

    #define KISS_LS_POST_DISPATCH (1<<1)

    #define KISS_REGISTER_LONG_CONSTANT(k) REGISTER_LONG_CONSTANT(#k, k, KISS_CONST_CS_P); \

    #define KISS_EXPORT_CONST \
    KISS_REGISTER_LONG_CONSTANT(KISS_EVAL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_INCLUDE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_INCLUDE_ONCE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQUIRE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQUIRE_ONCE); \
    \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_PREFIX_CTL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_SHARE_GP); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_USE_PORT); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_USE_CACHE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_DISPATCH_TYPE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_CLI_ROOT); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_EXT_PROC); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_EXT_PATH); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_DEFAULT_MDL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_DEFAULT_CTL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_DEFAULT_ACT); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_POSTFIX_CTL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_STATUS_POSTFIX_ACT); \
    \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_ALL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_METHOD); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_HOST); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_MODULE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_CONTROLLER); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_ACTION); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_FRAGMENT); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_QUERY); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_POST); \
    KISS_REGISTER_LONG_CONSTANT(KISS_REQ_PARAMS); \
    \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_READFILE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_ONLYCLI); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_NEEDURI); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_CFGFILE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_INITREQ); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_ROUTE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_DISPATCH); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_CLSFILE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_INSTANCE); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_CALLFUNC); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_CALLMTD); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_EVAL); \
    KISS_REGISTER_LONG_CONSTANT(KISS_E_NEEDROOT); \
    \
    KISS_REGISTER_LONG_CONSTANT(KISS_DISPATCH_FUNCTION); \
    KISS_REGISTER_LONG_CONSTANT(KISS_DISPATCH_METHOD); \
    KISS_REGISTER_LONG_CONSTANT(KISS_LS_PRE_DISPATCH); \
    KISS_REGISTER_LONG_CONSTANT(KISS_LS_POST_DISPATCH);

发表评论

电子邮件地址不会被公开。 必填项已用*标注