所有由zhufenghua发布的文章

mysql同步到es之Canal和CloudCanal

Canal是一个开源的数据同步工具

CloudCanal是阿里巴巴基于Canal开发的,但并不开源,有免费和付费版本之分。

Canal基于binary log增量订阅和消费,canal可以做:

  • 数据库镜像
  • 数据库实时备份
  • 索引构建和实时维护
  • 业务cache(缓存)刷新
  • 带业务逻辑的增量数据处理

使用 Canal 可以将 mysql 数据增量同步到 es中。

php array_column返回多个列

默认不能返回多个列。

函数语法:

$arr = array_column($array, $key, $index_key);

第二个参数,可以是NULL,此时返回所有的列(通常用于修改 key )

除了 NULL,可以传递字符串,返回该列数据。

第三个参数,是返回的数组 key 的规则,默认是索引(数字)

如果希望使用关联数组,再指定字符串,用于指定key。

对于一次返回多个列,比如原本 5 列数据,只读取其中的2列,该函数默认是不可以的,需要手动写一个循环读取。

例如:

/**
 * 提取二维数组的一个或多个列(如果为一个值,则和 array_column 一模一样)
 * @param $input -- 原数组
 * @param null $column_keys
 * @param null $index_key
 * @return array
 */
function array_columns($input, $column_keys=null, $index_key=null){
    $result = array();

    //多个字符串用,分割 (可以直接传递array)
    if(is_string($column_keys)){
        $column_keys = explode(',', $column_keys);
    }
    //默认值
    $keys = $column_keys ?: array();

    if($input){
        foreach($input as $k=>$v){
            // 指定返回列
            if($keys){
                $tmp = array();
                //多列时带列名的数组
                if(count($keys)>1){
                    foreach($keys as $key){
                        $tmp[$key] = $v[$key];
                    }
                }
                //没有列名的基本元素(确保和 array_column 返回值一致)
                else{
                    $tmp = $v[$keys[0]];
                }
            }
            //返回所有列
            else{
                $tmp = $v;
            }
            //指定键名
            if(isset($index_key)){
                $result[$v[$index_key]] = $tmp;
            }
            //默认索引键名
            else{
                $result[] = $tmp;
            }
        }
    }

    return $result;
}

英文词汇 nearby

nearby 的翻译

词性翻译反向翻译频率help_outline
副词附近nearby, about, hereabouts, hereabout
就近nearby, in the neighborhood, without having to go so far
近旁地nearby
在附近nearby
形容词附近的by, nearby, vicinal
合宜的accessible, adjacent, available, commodious, near at hand, nearby
近旁的nearby

php fun_get_args函数

获取函数的参数列表。(类似js)

fun_num_args取得参数数量

fun_get_args取得参数列表

function foo(){    
    $numargs = func_num_args(); //参数数量    
    echo "参数个数是: $numargs<br />\n";    
    if ($numargs >= 2) {        
        echo "第二个参数的值:" . func_get_arg(1) . "<br />\n";    
    }   
    $arg_list = func_get_args();    
    for ($i = 0; $i < $numargs; $i++) {        
        echo "第{$i}个参数值:{$arg_list[$i]}<br />\n";    
    }} 
foo(1, 'd', 3,4);

mysql字符串拼接

方法一:concat直接把string1和string2等等的字符串拼接起来

concat 语法:

CONCAT(string1,string2,...)

说明:此方法在拼接的时候如果有一个值为NULL,则返回NULL

方法二:concat_ws 带分隔符拼接

concat_ws语法:

CONCAT_WS(separator,string1,string2,...)

说明:string1,string2代表的是字符串,而separator代表的是连接其他参数的分隔符,可以是符号,也可以是字符串。如果分隔符为NULL,则结果为NULL。此方法参数可以为NULL。

方法三:group_concat([distinct] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

SELECT id,GROUP_CONCAT(type) FROM log_sys_interview GROUP BY type ;

其他:如果直接使用 + ,则被当作数字进行相加。

php 去除html标签

去除标签使用 strip_tags 函数

去掉字符串str的所有html标签。参数二是可保留的标签列表

strip_tags($str[, $allow]);

参数二,使用字符串表示。比如 strip_tags($str, “<p><b>”) 则表示保留p和b标签。

此函数要求字符串中的标签正确闭合,否则解析后的字符串不正常。

另外,对于&nbsp;等字符实体,不会自动转换。如果需要,则使用 str_replace 把 &nbsp; 替换为 ”

strip_tags(str_replace('&nbsp;','',$str));

批量替换为空字符串:

str_replace(array("&nbsp;","&amp;nbsp;","\t","\r\n","\r","\n"),"")

正则消除标签:

$str=preg_replace("/<s*imgs+[^>]*?srcs*=s*(''|")(.*?)\1[^>]*?/?s*>/i","", $str); //过滤img标签

  

$str=preg_replace("/s+/","", $str); //过滤多余回车

  

$str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格)

  

$str=preg_replace("/<!--.*?-->/si","",$str); //注释

  

$str=preg_replace("/<(!.*?)>/si","",$str); //过滤DOCTYPE

  

$str=preg_replace("/<(/?html.*?)>/si","",$str); //过滤html标签

  

$str=preg_replace("/<(/?head.*?)>/si","",$str); //过滤head标签

  

$str=preg_replace("/<(/?meta.*?)>/si","",$str); //过滤meta标签

  

$str=preg_replace("/<(/?body.*?)>/si","",$str); //过滤body标签

  

$str=preg_replace("/<(/?link.*?)>/si","",$str); //过滤link标签

  

$str=preg_replace("/<(/?form.*?)>/si","",$str); //过滤form标签

  

$str=preg_replace("/cookie/si","COOKIE",$str); //过滤COOKIE标签

  

$str=preg_replace("/<(applet.*?)>(.*?)<(/applet.*?)>/si","",$str); //过滤applet标签

  

$str=preg_replace("/<(/?applet.*?)>/si","",$str); //过滤applet标签

  

$str=preg_replace("/<(style.*?)>(.*?)<(/style.*?)>/si","",$str); //过滤style标签

  

$str=preg_replace("/<(/?style.*?)>/si","",$str); //过滤style标签

  

$str=preg_replace("/<(title.*?)>(.*?)<(/title.*?)>/si","",$str); //过滤title标签

  

$str=preg_replace("/<(/?title.*?)>/si","",$str); //过滤title标签

  

$str=preg_replace("/<(object.*?)>(.*?)<(/object.*?)>/si","",$str); //过滤object标签

  

$str=preg_replace("/<(/?objec.*?)>/si","",$str); //过滤object标签

  

$str=preg_replace("/<(noframes.*?)>(.*?)<(/noframes.*?)>/si","",$str); //过滤noframes标签

  

$str=preg_replace("/<(/?noframes.*?)>/si","",$str); //过滤noframes标签

  

$str=preg_replace("/<(i?frame.*?)>(.*?)<(/i?frame.*?)>/si","",$str); //过滤frame标签

  

$str=preg_replace("/<(/?i?frame.*?)>/si","",$str); //过滤frame标签

  

$str=preg_replace("/<(script.*?)>(.*?)<(/script.*?)>/si","",$str); //过滤script标签

  

$str=preg_replace("/<(/?script.*?)>/si","",$str); //过滤script标签

  

$str=preg_replace("/javascript/si","Javascript",$str); //过滤script标签

  

$str=preg_replace("/vbscript/si","Vbscript",$str); //过滤script标签

  

$str=preg_replace("/on([a-z]+)s*=/si","On\1=",$str); //过滤script标签

  

$str=preg_replace("/&#/si","&#",$str); //过滤script标签

去除 < 和 > 包裹的标签:

function delhtml($str){  //清除html标签

$st=-1; //开始

$et=-1; //结束

$stmp=array();

$stmp[]=" ";

$len=strlen($str);

for($i=0;$i<$len;$i++){

  $ss=substr($str,$i,1);

  if(ord($ss)==60){ //ord("<")==60

  $st=$i;

  }

  if(ord($ss)==62){ //ord(">")==62

  $et=$i;

  if($st!=-1){

   $stmp[]=substr($str,$st,$et-$st+1);

  }

  }

}

$str=str_replace($stmp,"",$str);

return $str;

}

纯正则消除标签和字符实体:

function clear_html_label($html) 

{ 

$search = array ("''<script[^>]*?>.*?</script>''si", "''<[/!]*?[^<>]*?>''si", "''([rn])[s]+''", "''&(quot|#34);''i", "''&(amp|#38);''i", "''&(lt|#60);''i", "''&(gt|#62);''i", "''&(nbsp|#160);''i", "''&(iexcl|#161);''i", "''&(cent|#162);''i", "''&(pound|#163);''i", "''&(copy|#169);''i", "''&#(d+);''e"); 

$replace = array ("", "", "1", """, "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(1)");

return preg_replace($search, $replace, $html); 

}

无线网卡有几种类型?

无线网卡可根据不同的接口类型来区分,第

  • 一种是 USB无线上网卡,是目前最常见的;
  • 第二种是台式机专用的 PCI 接口无线网卡;
  • 第三种是笔记本电脑专用的 PCMCIA 接口无线网卡;
  • 第四种是笔记本电脑内置的 MINI-PCI 无线网卡。

笔记本通常不需要额外的无线网卡,一般只有台式机需要。

较新的台式机主板,已经开始内置wifi,台式机可以使用USB或PCIE无线网卡,两者的价格相近,都是几十元左右。