exinnet_个人页

个人头像照片 exinnet
91
70
0

个人介绍

淘宝技术专家

擅长的技术

获得更多能力
通用技术能力:

暂时未有相关通用技术能力~

云产品技术能力:

暂时未有相关云产品技术能力~

阿里云技能认证

详细说明
暂无更多信息
  • 发表了文章 2017-03-11

    大白话聊聊分布式事务

  • 发表了文章 2017-03-06

    以swoole为例,学习如何实现协程

  • 发表了文章 2017-02-13

    PHP7扩展开发之hello word

  • 发表了文章 2017-02-13

    PHP7扩展开发之传参与返回值

  • 发表了文章 2017-02-13

    PHP7扩展开发之类型处理

  • 发表了文章 2017-02-13

    PHP7扩展开发之数组处理

  • 发表了文章 2017-02-13

    PHP7扩展开发之创建变量

  • 发表了文章 2017-02-07

    PHP7扩展开发之字符串处理

  • 发表了文章 2017-02-07

    PHP7扩展开发之常量定义

  • 发表了文章 2017-02-07

    白话PHP7扩展开发之创建对象

  • 发表了文章 2016-11-14

    PHP7扩展开发之传参与返回值

  • 发表了文章 2016-08-16

    深入了解xhprof性能分析工具

  • 发表了文章 2016-06-28

    crond中使用flock命令的坑

  • 发表了文章 2016-06-28

    白话PHP7扩展开发之创建对象

  • 发表了文章 2016-06-27

    PHP7扩展开发之hello word

  • 发表了文章 2016-04-12

    小心!高效率的sql查询,它也会导致网站响应变慢

  • 发表了文章 2016-04-12

    如何找出发生SEGV内存错误的程序

  • 发表了文章 2016-04-12

    使用tcpdump排查mysql数据库tps飙升的问题

  • 发表了文章 2016-04-12

    tcpdump 和 wireshark组合拳,揪出有问题的机器

  • 发表了文章 2016-04-12

    线上PHP问题排查思路与实践

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2019-07-17

    socket_read,报错“Interrupted system call'”

    对socket_read的返回值做下判断。如果返回-1,则对errno多下判断。socket_last_error() 方法获取errno。
    给你一段用C语言写的示例。
    9_pic

    踩0 评论0
  • 提交了问题 2016-07-05

    socket_read,报错“Interrupted system call'”

  • 回答了问题 2019-07-17

    redis server went away

    执行命令 sestatus
    如果输出内容不是 disabled
    执行命令 setenforce disabled

    踩0 评论0
  • 提交了问题 2016-07-05

    redis server went away

  • 回答了问题 2019-07-17

    数组如果不进行unset方法,是不是会等到gc才会回收?

    一般编程语言都会有作用域的概念。如果,变量已经不再作用域了,变量所占用的资源还不释放,那就太浪费内存空间了。除非必要,否则会也不会干费力不讨好的事情。
    贴一段代码。
    _2016_06_14_7_37_50
    输出结果
    0

    踩0 评论0
  • 提交了问题 2016-06-14

    数组如果不进行unset方法,是不是会等到gc才会回收?

  • 回答了问题 2019-07-17

    怎样设置英国时区?

    不错啊

    踩0 评论0
  • 回答了问题 2019-07-17

    为什么要异地双写,感觉带来的成本比较高

    其实主要是为了容灾,把数据把多地保存多份。如果一个地方数据出现问题,尽量能做到无缝切换。

    踩0 评论0
  • 回答了问题 2019-07-17

    Can not connect to MySQL server 这个怎么处理

    你看下你的代码。连接数据库的时候主机名是不是写的 localhost? 如果是 你改成 127.0.0.1 试试。

    踩0 评论0
  • 回答了问题 2019-07-17

    reactphp谁用过?

    有过简单的了解,他和nodejsyou很多相同的特点。如
    1、事件驱动,异步执行,非阻塞IO
    2、单进程单线程
    更多信息可以查看 ReactPHP,PHP版的Node.js

    踩0 评论0
  • 提交了问题 2016-01-25

    reactphp谁用过?

  • 回答了问题 2019-07-17

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

    开始,把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扩展中如何定义线程安全的全局对象

    踩0 评论0
  • 提交了问题 2016-01-25

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

  • 回答了问题 2019-07-17

    在php扩展开发中如何使用pkg-config?

    闲话少说,直接上代码:
    下面是我在config.m4中写的自动加载opencv相关so库和头文件的代码。
    dnl # --with-tclip -> check with-path
    SEARCH_PATH="/usr/lib/pkgconfig" # 定义pkgconfig文件,即扩展名pc文件存放路径
    SEARCH_FOR="opencv.pc" # 要寻找的文件
    if test -r $PHP_TCLIP/$SEARCH_FOR; then #

     TCLIP_DIR=$PHP_TCLIP

    else # search default path list

     AC_MSG_CHECKING([for tclip files in default path])
     for i in $SEARCH_PATH ; do
       if test -r $i/$SEARCH_FOR; then
         TCLIP_DIR=$i
         AC_MSG_RESULT(found in $i)
       fi
     done

    fi
    dnl
    if test -z "$TCLIP_DIR"; then

     AC_MSG_RESULT([not found])
     AC_MSG_ERROR([Please reinstall the tclip distribution])

    fi

    OPENCV_FLAGS="pkg-config opencv --libs --cflags opencv"
    for i in $OPENCV_FLAGS;do

        if test ${i:0:2} = "-I" ;then
                PHP_ADD_INCLUDE(${i:2})
        elif test ${i:${#i}-3} = ".so" ;then
                dir_name=`dirname $i`
                file_name=${i/$dir_name/}
                file_name=${file_name/\/lib/}
                file_name=${file_name/.so/}
        PHP_ADD_LIBRARY_WITH_PATH($file_name,$dir_name,TCLIP_SHARED_LIBADD)
        fi

    done

    参考资料 在php扩展开发中如何使用pkg-config

    踩0 评论0
  • 提交了问题 2016-01-25

    在php扩展开发中如何使用pkg-config?

  • 回答了问题 2019-07-17

    如何能同时请求多个网址?

    示例代码:
    /*

    • @purpose: 使用curl并行处理url
    • @return: array 每个url获取的数据
    • @param: $urls array url列表
    • @param: $callback string 需要进行内容处理的回调函数。示例:func(array)
      */

    function curl($urls = array(), $callback = '')
    {

    $response = array();
    if (empty($urls)) {
        return $response;
    }
    $chs = curl_multi_init();
    $map = array();
    foreach($urls as $url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_NOSIGNAL, true);
        curl_multi_add_handle($chs, $ch);
        $map[strval($ch)] = $url;
    }
    do{
        if (($status = curl_multi_exec($chs, $active)) != CURLM_CALL_MULTI_PERFORM) {
            if ($status != CURLM_OK) { break; } //如果没有准备就绪,就再次调用curl_multi_exec
            while ($done = curl_multi_info_read($chs)) {
                $info = curl_getinfo($done["handle"]);
                $error = curl_error($done["handle"]);
                $result = curl_multi_getcontent($done["handle"]);
                $url = $map[strval($done["handle"])];
                $rtn = compact('info', 'error', 'result', 'url');
                if (trim($callback)) {
                    $callback($rtn);
                }
                $response[$url] = $rtn;
                curl_multi_remove_handle($chs, $done['handle']);
                curl_close($done['handle']);
                //如果仍然有未处理完毕的句柄,那么就select
                if ($active > 0) {
                    curl_multi_select($chs, 0.5); //此处会导致阻塞大概0.5秒。
                }
            }
        }
    }
    while($active > 0); //还有句柄处理还在进行中
    curl_multi_close($chs);
    return $response;

    }

    //使用方法
    function deal($data){

    if ($data["error"] == '') {
        echo $data["url"]." -- ".$data["info"]["http_code"]."\n";
    } else {
        echo $data["url"]." -- ".$data["error"]."\n";
    }

    }
    $urls = array();
    for ($i = 0; $i < 10; $i++) {

    $urls[] = 'http://www.baidu.com/s?wd=etao_'.$i;
    $urls[] = 'http://www.so.com/s?q=etao_'.$i;
    $urls[] = 'http://www.soso.com/q?w=etao_'.$i;

    }
    curl($urls, "deal");

    参考资料 php实现并发处理之curl篇

    踩0 评论0
  • 提交了问题 2016-01-25

    如何能同时请求多个网址?

  • 回答了问题 2019-07-17

    数据库分表后,id如何生成?

    有很多中方式,这里说一种cas的方式。
    其实这里并不是严格的CAS,而是使用了比较交换原子操作的思想。
    生成思路如下:
    每次生成全局id时,先从sequence表中获取当前的全局最大id。然后在获取的全局id上做加1操作。把加1后的值更新到数据库。更新时是关键。
    如加1后的值为203,表名是users,数据表结构如下:
    CREATE TABLE SEQUENCE (

    `name` varchar(30) NOT NULL COMMENT '分表的表名',
    `gid` bigint(20) NOT NULL COMMENT '最大全局id',
    PRIMARY KEY (`name`)

    ) ENGINE=InnoDB

    那么更新语句是。
    update sequence set gid = 203 where name = 'users' and gid < 203;
    sql语句的 and gid < 203 是为了保证并发环境下gid的值只增不减。
    如果update语句的影响记录条数为0说明,已经有其他进程提前生成了203这个值,并写入了数据库。需要重复以上步骤从新生成。
    代码实现如下:
    //$name 表名
    function next_id_db($name){

    //获取数据库全局sequence对象
    $seq_dao = Wk_Sequence_Dao_Sequence::getInstance();
    $threshold = 100; //最大尝试次数
    for($i = 0; $i < $threshold; $i++){
        $last_id = $seq_dao->get_seq_id($name);//从数据库获取全局id
        $id = $last_id +1;
        $ret = $seq_dao->set_seq_id($name, $id);
        if($ret){
            return $id;
            break;
        }
    }
    return false;

    }

    更多方式,可以查看 数据库分表后,并发环境下,生成全局id生成的几种方式

    踩0 评论0
  • 提交了问题 2016-01-25

    数据库分表后,id如何生成?

  • 回答了问题 2019-07-17

    如何限制百度等蜘蛛的抓取频率?

    nginx的ngx_http_limit_req_module模块限制了百度蜘蛛的抓取频率。每分钟允许百度蜘蛛抓取200次,多余的抓取请求返回503。
    nginx的配置:

    全局配置

    limit_req_zone $anti_spider zone=anti_spider:60m rate=200r/m;

    某个server中

    limit_req zone=anti_spider burst=5 nodelay;
    if ($http_user_agent ~* "baiduspider") {
    set $anti_spider $http_user_agent;
    }

    参数说明:
    指令limit_req_zone 中的rate=200r/m 表示每分钟只能处理200个请求。
    指令limit_req 中的burst=5 表示最大并发为5。即同一时间只能同时处理5个请求。
    指令limit_req 中的 nodelay 表示当已经达到burst值时,再来新请求时,直接返回503
    IF部分用于判断是否是百度蜘蛛的user agent。如果是,就对变量$anti_spider赋值。这样就做到了只对百度蜘蛛进行限制了。

    踩0 评论0
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息