linux+apache+mysql环境下,gzip压缩后的效果

先说一下我的环境。linux+apache+mysql 并且已经安装了gzip组建。
飞飞没有后台直接看起gzip的按钮,就要通过.htaccess来实现。
只需要在.htaccess添加下面一段代码就OK了

AddOutputFilterByType DEFLATE text/html text/css image/gif image/jpeg image/png text/plain text/xml application/x-httpd-php application/x-javascript

直接就能够实现gzip压缩。
压缩率根据页面大概是65%-75%

是否压缩 是
压缩类型 gzip
原始文件大小 68399 字节
压缩后文件大小 9847 字节
压缩率(估计值) 85.6%

开源中最好的Web开发的资源

学习HTML 5编程和设计

继续阅读…

如何使用Sphinx来实现全文检索(搜索)功能

前年(2009)在参与开发CMSTOP系统时,就知道此CMS使用Sphinx实现进行全文检索功能。但那时候自己并没有这功能的开发。不过了解了Sphinx的全文搜索的强大功能。这次,在新的公司,也要做一个全文搜索功能。第一时间就想到了Sphinx来进行功能的实现。

当然在实际上,Sphinx对中文的分词功能并不好。可是很庆幸地是,Coreseek很好地帮我们解决了这一个问题。在这里很感谢此团队为开源事业做出的贡献。Sphinx能得到很多人的认同与用使用,很大一部分功劳和这团队关系。关于此团队更多信息可查看Coreseek首页。

下面我就基本地简介一下如何使用Sphinx来实现全文检索功能,当然大部分安装信息都是在Coreseek主站上直接copy下来,因为他们写的实在太详细了。让我没有任何可发挥的地方。

1.下载Sphinx 支持中文分词Coreseek  http://www.coreseek.cn/news/11/52/

2.进行安装:参考http://www.coreseek.cn/products-install/install_on_bsd_linux/
##下载coreseek:coreseek 3.2.14:点击下载、coreseek 4.0.1:点击下载

$ wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
$ 或者 http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.0.1-beta.tar.gz
$ tar xzvf coreseek-3.2.14.tar.gz 或者 coreseek-4.0.1-beta.tar.gz
$ cd coreseek-3.2.14 或者 coreseek-4.0.1-beta

##安装mmseg

$ cd mmseg-3.2.14
$ ./bootstrap    #提示中如无error可以不用理会
$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
$ cd ..

##安装coreseek,需提前安装mysql依赖库及操作系统基础开发库以支持mysql数据源和xml数据源

$ cd csft-3.2.14 或者 cd csft-4.0.1
$ sh buildconf.sh    #提示中如无error可以不用理会
$ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/
--with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql    ##如果提示mysql问题,可以查看MySQL数据源安装说明
$ make && make install
$ cd ..

##测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)

$ cd testpack
$ cat var/test/test.xml    #此时应该正确显示中文
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml
$ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all

 

3.增加Sphinx增量索引

a.先建立一个计数表

CREATE TABLE sph_counter(
  		counter_id INTEGER PRIMARY KEY NOT NULL,
  		max_doc_id INTEGER NOT NULL
     );

b.修改sphinx.conf

#主要数据源
      source main
	{
    	type                    = mysql

    	sql_host                = localhost
    	sql_user                = oophp
    	sql_pass                = oophp.cn
    	sql_db                    = oophp
    	sql_port                = 3306
    	sql_query_pre            = SET NAMES utf8
    	sql_query_pre	    =REPLACE INTO sph_counter SELECT 1, MAX(id) FROM dede_archives
    	sql_query                = Select  *  From article where channel=3 AND id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
                                                              	#sql_query第一列id需为整数
                                                              	#title、content作为字符串/文本字段,被全文索引
    	#sql_attr_uint            =id           #从SQL读取到的值必须为整数
    	#sql_attr_timestamp        =pubdata_attr #从SQL读取到的值必须为整数,作为时间属性

    	sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
    	sql_query_info = Select * From article WHERE channel=3  AND id=$id
	}

       #增量数据源
	source delta : main
	{
		sql_query_pre =SET NAMES utf8
        	sql_query = Select * From article  where  channel=3 AND \
	id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
	}

	#主索引生成
	index main
	{
    	source            = main             #对应的source名称
    	path            = /usr/local/coreseek/data/main/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    	docinfo            = extern
    	mlock            = 0
    	morphology        = none
    	min_word_len        = 1
    	html_strip                = 0
    	ngram_len=0
    	#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    	charset_dictpath = /usr/local/mmseg3/etc/   #BSD、Linux环境下设置,/符号结尾
    	#charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    	charset_type        = zh_cn.utf-8
    	#charset_type        = utf-8
    	#charset_table        = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
    	#ngram_chars        = U+3000..U+2FA1F

	}

       #增量索引
	index delta : main
	{
    		source            = delta             #对应的source名称
    		path            = /usr/local/coreseek/data/delta/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
	}
	#全局index定义
	indexer
	{
    		mem_limit            = 128M
	}

	#searchd服务定义
	searchd
	{
    		listen                  =   9312
    		read_timeout        = 5
    		max_children        = 30
    		max_matches            = 1000
    		seamless_rotate        = 0
    		preopen_indexes        = 0
    		unlink_old            = 1
    		pid_file = /var/log/searchd.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    		log = /var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    		query_log = /var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    		binlog_path =                                #关闭binlog日志
	}

 

c.启动sphinx服务,并生成主索引

#/usr/local/coreseek/bin/searchd
 # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf main --rotate

d.建立生成主索引和增量索引shell脚本

build_main_index.sh脚本:
		#!/bin/sh
		#/usr/local/coreseek/bin/searchd --stop
		/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf main --rotate 

build_delta_index.sh脚本:
		#!/bin/sh
		#/usr/local/coreseek/bin/searchd --stop
		/usr/local/coreseek/bin/indexer  -c /usr/local/coreseek/etc/sphinx.conf  delta --rotate
		/usr/local/coreseek/bin/indexer  -c /usr/local/coreseek/etc/sphinx.conf --merge main delta --merge-dst-range deleted 0 0 --rotate
		#/usr/local/coreseek/bin/searchd

e.写入cron计划任务中,生成增量索引,并重新建立主索引

//每10分钟生成一次索引
*/10 * * * *  /bin/sh /usr/local/coreseek/build_delta_index.sh >/dev/null 2>&1  

//每天凌晨3点过5分,重新建立一次主索引
5 3 * * *  /bin/sh /usr/local/coreseek/build_main_index.sh > /dev/null 2>&1

参考网站:

http://sphinxsearch.com/

http://www.coreseek.cn/

http://www.sphinxsearch.org/archives/category/sphinx

http://blog.c1gstudio.com/archives/730

PHP中跳出多重循环使用break,continue,goto,return,exit的区别

今天在写一段PHP程序时,犯了一个小错误结果耽误了很长时间,后来发现原来是多重循环没有控制好的问题。后来整理了在PHP中跳出循环的各种用法,以及它们的区别,与大家分享。

PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式:

continue

continue 是用来用在循环结构中,控制程序放弃本次循环continue语句之后的代码并转而进行下一次循环。continue本身并不跳出循环结构,只是放弃这一次循环。如果在非循环结构中(例如if语句中,switch语句中)使用continue,程序将会出错。

例如在下面的这段PHP代码片段中:
<?php
for($i = 1;$i <= 100; $i++ ){
if($i % 3 == 0 || $i % 7 == 0){
continue;
}
& #160;  else{
echo”$i \n<br/>”;
}
}
?>

PHP的代码片段的作用是输出100以内,既不能被7整除又不能被3整除的那些自然数,循环中先用if条件语句判断那些能被整除的数,然后执行continue;语句,就直接进入了下个循环。不会执行下面的输出语句了。

break

break是被用在上面所提的各种循环和switch语句中的。他的作用是跳出当前的语法结构,执行下面的语句。break语句可以带一个参数n,表示跳出循环的层数,如果要跳出多重循环的话,可以用n来表示跳出的层数,如果不带参数默认是跳出本重循环。

看下面这个多重循环嵌套的例子:
for($i = 1;$i <= 10; $i++ ){
for($j = 1;$j <= 10;$j++){
$m = $i * $i + $j * $j;
echo”$m \n<br/>”;
if($m < 90 || $m > 190) {
break 2;
}
}
}

这里使用了break 2跳出了两重循环,你可以试验一眼,将2去掉,得到的结果是完全不一样的。如果不使用参数,跳出的只是本次循环,第一层循环会继续执行下去。

goto

goto实 际上只是一个运算符,和其他语言一样,PHP中也不鼓励滥用goto,滥用goto会导致程序的可读性严重下降。goto的作用是将程序的执行从当前位置 跳转到其他任意位置,goto本身并没有要结束的循环的作用,但其跳转位置的作用使得其可以作为跳出循环使用。但PHP5.3及以上版本停止了对goto 的支持,所以应该尽量避免使用goto。
下面的是一个使用了goto跳出循环的例子
for($i = 1000;$i >= 1 ; $i– ){
if( sqrt($i) <= 29){
goto a;
}
echo “$i”;
}
a:
echo” this is the end”;

例子中使用了goto来跳出循环,这个例子用来检测1000以内,那些数的平方根大于29。

exit

exit是用来结束程序执行的。可以用在任何地方,本身没有跳出循环的含义。exit可以带一个参数,如果参数是字符串,PHP将会直接把字符串输出,如果参数是integer整形(范围是0-254),那个参数将会被作为结束状态使用。

<?php
for($i = 1000;$i >= 1 ; $i– ){
if( sqrt($i) >= 29){
echo”$i \n<br/>”;
}
else{
exit;
}
}
echo”本行将不会被输出”;
?>

上面这个例子中直接在从循环里结束了代码的运行,这样会导致后面的代码都不会被执行,如果是在一个php web 页面里面,甚至连exit后面的html代码都不会被输出。

return

return 语句是用来结束一段代码,并返回一个参数的。可以从一个函数里调用,也可以从一个include()或者require()语句包含的文件里来调用,也可 以是在主程序里调用,如果是在函数里调用程序将会马上结束运行并返回参数,如果是include()或者require()语句包含的文件中被调用,程序 执行将会马上返回到调用该文件的程序,而返回值将作为include()或者require()的返回值。而如果是在主程序中调用,那么主程序将会马上停 止执行

<?php
for($i = 1000;$i >= 1 ; $i– ){
if( sqrt($i) >= 29){
echo”$i \n<br/>”;
}
else{
return;
}
}
echo”本行将不会被输出”;
?>

这里的例子和上面使用exit的效果是一样的。

在循环结束条件,自然跳出

这个当然是最好理解了,当循环满足循环临界条件时就是自己退出。

以上是PHP中跳出循环的几种方式的简单总结。

PHP字符串操作入门教程

无论哪种语言,字符串操作都是一个重要的基础,往往是简单而重要。正像人说话一样,一般有形体(图形界面),有语言(print 字符串?),显然字符串能解释更多的东西。PHP提供了大量的字符串操作函数,功能强大,使用也比较简单,详细请参看 http://cn2.php.net/manual/zh/ref.strings.php . 以下将简单的讲述它的功能和特性。
弱类型
PHP是弱类型语言,所以其它类型的数据一般可以直接应用于字符串操作函数里,而自动转换成字符串类型,进行处理,如:

PHP:


echo substr("1234567", 1, 3);

PHP:


echo substr(123456,1, 3);

是一样的

定义
一般用双引号或单引号标识一个字符串。比如

PHP:


$str = "i love u";
$str = 'i love u';

它者两者是有一些区别的。后者将一切单引号的内容都会当作字符处理;前者则不然。比如

PHP:


$test = "iwind";
$str = "i love $test";
$str1 = 'i love $test';
echo $str; //将得到 i love iwind
echo $str1; //将得到 i love $test

同样的以下两个例子的行为也不一样的:

PHP:


echo "i love \test"; // 将得到 i love est,已经将\t视为转义
echo 'i love \test'; // 将得到 i love \test

从而可以简单认为双引号里的内容是经过“解释”过的,单引号的是“所见即所得”的。显而易见,双引号形式的更为灵活一些,当然单引号会适用于一些特殊的场合,这里就不作阐述了。

输出
PHP里的输出最常用的是echo,print.两者都不是真正的函数,而是语言构造,所以调用时不必用双括号(比如echo(“test”);print(“test”)).在输出的时候两者都可以实现赋值:

PHP:


echo $str="test"; //一方面输出test,一方面把"test"赋给字符串变量 $str
print $str="test";

两者除了名字不一样外,还是有其它区别的。print具有返回值,一直返回1,而echo没有,所以echo比print要快一些:

PHP:


$return = print "test";
echo $return; // 输出1

也正因为这个原因,print能应用于复合语句中,而echo不能:

PHP:


isset($str) or print "str 变量未定义"; // 将输出"str 变量未定义"
isset($str) or echo "str 变量未定义";// 将提示分析错误

echo一次可输出多个字符串,而print则不可以:

PHP:


echo "i ","love ","iwind"; // 将输出 "i love iwind"
print "i ","love ","iwind"; // 将提示错误

echo,print还可以输出被称作“文档句法”的字符串,句法如:

PHP:


echo <<< 标签名称
...
字符串内容
...
标签名称;

比如

PHP:


echo <<< test
i love iwind
test;

要注意的是语句开始和结束的两个标签名称是一样的,且后一个标签名称前不能有空白,即要顶格写。文档句法输出的内容识别变量名称和常用符号,大致形同双引号的作用。

输出echo,print外,PHP还提供了一些格式化字符串的函数,比如printf,sprintf,vprintf,vsprintf,在这里不作详解。

连接
两个以上的字符串连接用”.”操作符,依字符串的顺序形成新的字符串。

PHP:


$str = "i " . "love " . "iwind";
这里的$str 就是 "i love iwind";字符串。当然,还可以使用 .= 操作符:
$str = ""; // 初始化
$str .= "i love iwind";

这里用到了初始化,是因为未定义变量在使用时会产生一个notice错误,”"或者null可以简单地代表空字符串。

长度
PHP提供strlen函数来计算字符串的长度:

PHP:


$str = "test";
echo strlen($str); // 将输出 4

有点奇怪的是strlen将中日等汉字以及全角字符都当作两个或四个长度计算。好在mbstring或icon两个函数可以帮助解决这个问题,比如:

PHP:


$len = iconv_strlen($str, "GBK");
$len = mb_strlen($str, "GBK");

注:mbstring模块提供了大量的对含有多字节字符的字符串的处理函数,推荐多加应用,由于这篇文章讲的是字符串入门,所以不打算详细解说。

分隔与连接
PHP允许你把一个字符串按照一个分隔符进行分隔成一个数组,或者将一个数组组合成一个字符串。看下面的例子:

PHP:


$str = "i love iwind";
$array = explode(" ", $str);

上面的explode函数,就把$str字符串按空格字符进行分隔,结果返回一个数组 $array:array(“i”, “love”, “iwind”).与explode函数有类似功能的有:preg_split(), spliti(), split()等函数。

与此相反的,implode和join则能把一个数组结合成一个字符串,他们是具有完全相同功能的函数。

PHP:


$array = array("i", "love", "iwind");
$str = implode(" ", $array);
例中的implode函数将数组$array的每个元素用空格字符进行连接,返回一个字符串 $str: "i love iwind".

裁剪
一个字符串首和尾,可能不是你想要的部分,就可以用trim,rtrim,ltrim等函数,分别去除一个字符串两端空格,一个字符串尾部空格,一个字符串首部空格。

PHP:


echo trim(" i love iwind "); // 将得到 "i love iwind"
echo rtrim(" i love iwind "); // 将得到 " i love iwind"
echo ltrim(" i love iwind "); // 将得到 "i love iwind "

其实这三个参数不仅可以去除字符串首尾的空格,还可以去除它们的第二个参数指定的字符,如:

PHP:


echo trim(",1,2,3,4,", ","); // 将得到 1,2,3,4 两端的","号被裁掉了。

有时还会看到有人使用chop这个函数,其实它是rtrim的同义函数。

大小写
对于英文字母来说,可以用strtoupper,strtolower将其转变成大写或小写。

PHP:


echo strtoupper("i love iwind"); // 将得到 I LOVE IWIND
echo strtolower("I LOVE IWIND"); // 将得到 i love iwind

比较
一般可以用 !=, == 比较两个对象是否相等,只所以说是两个对象,是因为它们不一定全部为字符串,也可以为整型等等。比如

PHP:


$a = "joe";
$b = "jerry";
if ($a != $b)
{
echo "不相等";
}
else
{
echo "相等";
}

如果用 !==,===(可以看到多了一个等号)比较的话,两个对象的类型要严格相等才能返回true;否则用==,!=则会将字符串自动转换成相应的类型,以便进行比较.

PHP:


22 == "22"; // 返回 true
22 === "22"; // 返回false
//正因为这样,所以我们的程序时常会发生一些想不到的"意外":
0 == "我爱你"; // 返回true
1 == "1 我爱你";// 返回true

PHP里还有这样一组用于字符串比较的函数:strcmp,strcasecmp,strncasecmp(), strncmp(),它们都是如果前者比后者大,则返回大于0的整数;如果前者比后者小,则返回小于0的整数;如果两者相等,则返回0.它们比较的原理与其它语言的规则都是一样的。
strcmp是用于区分大小写(即大小写敏感)的字符串比较:

PHP:


echo strcmp("abcdd", "aBcde"); // 返回 1 (>0), 比较的是 "b"和"B"

strcasecmp用于不区分大小写的字符串比较:

PHP:


echo strcasecmp("abcdd", "aBcde"); // 返回 -1 (<0), 比较的是"d"和"e"

strncmp用于比较字符串的一部分,从字符串的开头开始比较,第三个参数,为要比较的长度:

PHP:


echo strncmp("abcdd", "aBcde", 3); // 返回 1 (>0), 比较了 abc 和 aBc

strncasecmp用于不区分大小写的比较字符串的一部分,从字符串的开头开始比较,第三个参数,为要比较的长度:

PHP:


echo strncasecmp("abcdd", "aBcde", 3); // 返回 0, 比较了 abc 和 aBc,

由于不区分大小写,所以两者是相同的。

还有一种情况是单单比较字符串大小,达不到我们预定的要求,比如照常理 10.gif 会比 5.gif 大,但如果应用上面几个函数,就会返回 -1,即表示 10.gif比5.gif,针对这种情况,PHP提供了两个自然对比的函数strnatcmp,strnatcasecmp:

PHP:


echo strnatcmp("10.gif", "5.gif"); // 返回 1 (>0)
echo strnatcasecmp("10.GIF", "5.gif"); // 返回 1 (>0)

替换
替换的意义在于将一个字符串的一部分进行改变,使之成为别外一个新的字符串,以满足新的要求。PHP里通常用str_replace(“要替换的内容”, “要取代原内容的字符串”, “原字符串”)进行替换。

PHP:


echo str_replace("iwind", "kiki", "i love iwind, iwind said"); // 将输出 "i love kiki, kiki said"

即将 原字符串中的所有”iwind”都替换成了”kiki”.

str_replace是大小写敏感的,所以对你不能设想用 str_replace(“IWIND”, “kiki”,…)替换原字符串中的”iwind”.

str_replace还可以实现多对一,多对多的替换,但无法实现一对多的替换:

PHP:


echo str_replace(array("iwind", "kiki"), "people", "i love kiki, iwind said");

将会输出
i love people, people said
第一个参数中的array(“iwind”, “kiki”)都被替换成了”people”

PHP:


echo str_replace(array("iwind", "kiki"), array("gentle man", "ladies"), "i love kiki, iwind said");

输出 i love ladies, gentle man said 。也就是说第一个数组中的元素被第二个数组中的相对应的元素替换掉了,如果有一个数组比另一个数组元素数要少,那么不足的都会当作空来处理。

与此有些类似的是strtr,用法请参阅手册,它们的比较请参阅 http://diary.4kiki.net/index.php?action=info&id=372 .

此外,PHP还提供了substr_replace,实现替换一部分的字符串。语法如下:
substr_replace (原字符串, 要替代的字符串, 开始替换的位置 [, 替换的长度])
其中,开始替换的位置从0开始计算,应该小于原字符串的长度。要替换的长度是可选的。

PHP:


echo substr_replace("abcdefgh", "DEF", 3); // 将输出 "abcDEF"
echo substr_replace("abcdefgh", "DEF", 3, 2); // 将输出 "abcDEFfgh"

第一个例子中,从第三个位置(即”d”)开始替换,从而把 “defgh”都替换成了“DEF”
第二个例子中,也是从第三个位置(即”d”)开始替换,但只能替换2个长度,即到e,所以就把”de”替换成了”DEF”.

PHP还提供了preg_replace,preg_replace_callback,ereg_replace,eregi_replace等函数应用正则表达式来完成字符串替换,用法请参考手册。

查找与匹配
PHP里用于查找或者匹配或者定位的函数非常多,它们都有不同的意义。这里只讲述用得比较多的strstr,stristr.后者与前者的功能,返回值都一样,只是不区分大小写。
strstr(“母字符串”, “子字符串”)用来查找子字符串在母字符串中第一次出现的位置,并返回母字符串中从子字符串开始到母字符串结束的部分。比如
echo strstr(“abcdefg”, “e”); //将输出 “efg”
如果找不到子字符串,则返回空。因为可以用来判断一个字符串中是否含有另外一个字符串:

PHP: [Copy to clipboard]


$needle = "iwind";
$str = "i love iwind";
if (strstr($str, $needle))
{
echo "里面有 iwind";
}
else
{
echo "里面没有 iwind";
}
将会输出"里面有 iwind"

HTML相关
1,htmlspecialchars($string)
这是它的最简单用法,将字符串中的一些特殊字符(顾名思义)&,’,”<,>转换成它们对应的HTML实体形式:

PHP:


$str = "i love <font color=\"red\">kiki</font>, iwind said.";
echo htmlspecialchars($str);

将会输出
i love &lt;font color=&quot;red&quot;&gt;kiki&lt;/font&gt;, iwind said.

2,htmlentities($string)
将所有能转换成实体形式的字符都转换成实体形式。

3,html_entity_decode($string);
PHP4.3.0以后加入的具有与htmlentities($string)相反的功能。

4,nl2br($string)
将字符串中所有换行符转变成<br /> + 换行符。如:

PHP:


$str = "i love kiki,\n iwind said.";
echo nl2br($str);

将会输出
i love kiki,<br />
iwind said.

加密
加密字符串最常用的就是md5了,它将一个字符串转换成一个长32位的唯一的字符串。

PHP:


echo md5("i love iwind"); // 将输出 "2df89f86e194e66dc54b30c7c464c21c"

PHP5给md5加了第二个参数,从而使它可以输出16位的加密后的字符串。

到这里,这篇字符串操作入门教程就算结束了,但上面讲的这些还只是它的冰山一角,特别是PHP5之后增加了大量的新功能,所以需要我们不断的去学习它才有可能很好的应用。