开发者社区> 问答> 正文

php扩展中如何定义线程安全的全局对象?

已解决

php扩展中如何定义线程安全的全局对象?

展开
收起
exinnet 2016-01-25 17:31:04 5507 0
1 条回答
写回答
取消 提交回答
  • 淘宝技术专家
    采纳回答

    开始,把php_tclip.h中的全局变量声明部分修改为如下:

    ZEND_BEGIN_MODULE_GLOBALS(tclip)

    CascadeClassifier face_cascade;
    char *face_config_path;

    ZEND_END_MODULE_GLOBALS(tclip)
    结果报如下错误:

    error: ‘CascadeClassifier’ does not name a type

    看来这个类没有在头文件中声明。那就另辟蹊径,改为其它方式。把代码改为

    ZEND_BEGIN_MODULE_GLOBALS(tclip)

    void *face_cascade;
    char *face_config_path;

    ZEND_END_MODULE_GLOBALS(tclip)
    然后在tclip.c中进行了如下修改:

    1.首先定义了一个全局变量。

    static CascadeClassifier face_cascade;
    2.修改PHP_MINIT_FUNCTION(tclip)。代码如下:

    PHP_MINIT_FUNCTION(tclip)
    {

    /* If you have INI entries, uncomment these lines */
    REGISTER_INI_ENTRIES();
    
    string face_config_path = (TCLIP_G(face_config_path) == "" || TCLIP_G(face_config_path) == NULL)? "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" :TCLIP_G(face_config_path);
    if( !face_cascade.load( face_config_path ) ){ 
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "can not load classifier file!%s", face_config_path.c_str());
        return FAILURE; 
    }
    TCLIP_G(face_cascade) = &face_cascade;
    return SUCCESS;

    }

    调用全局对象的方式如下:

    ((CascadeClassifier *)TCLIP_G(face_cascade))->detectMultiScale( img_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
    注意,php扩展想线程安全,那就用相关宏来访问全局变量。如上面的TCLIP_G(face_cascade)。

    参考资料 php扩展中如何定义线程安全的全局对象

    2019-07-17 18:26:31
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载