gzip压缩率测试以及PHP如何启用gzip

2017-8-16 chuang_no1

300条产品数据的二维数组,转JSON发送,原始数据158KB。然后在不同级别的gzip下测试结果如表:


gzip压缩级别 数据大小
0 158KB
1 11.2KB
2 10.5KB
3 10.1KB
4 9.3KB
5 8.7KB
9 7.3KB
10 158KB
-1 8.3KB


可见设为0就是关闭,和原始数据一样。设为1的时候,就已经可以节省93%的带宽和流量,然后每提升一档,其实效果已经非常有限了,但是据说CPU占用率会指数上涨,所以综合看下来,对于文本类的数据,压缩率1已经是完全可以满足要求且性能上最节省,没必要设定更高的压缩级别。也正是基于此原因,并没有进一步做效率测试,只打算使用级别1的压缩。


对于-1这个诡异的值,因为是启用gzip之前的默认值,也好奇测试了一下,得到介于5~9之间的值,似乎相当于官方的推荐值6的效果,不过实际使用中一般也只会设为正数。而对于10,完全没效果,看来超出了范围,所以压缩级别应该是1~9之间。


而对于多媒体的文件来说,本身已经非常固实,而且数据流巨大,压缩实在不划算,建议在配置文件里面仅仅指定针对文本类型的MIME开启gzip,指定MIME的方法这里不重复。


如何开启以及设定gzip压缩级别:


打开PHP的配置文件php.ini,找到开关


zlib.output_compression = off    //去掉前面的注释并将off改为on;


然后找到压缩级别


;zlib.output_compression_level = -1    //去掉前面的注释并将数字改为你希望的

重启服务器,搞定。


另外据说【;zlib.output_handler】必须保持被注释状态,因为此参数和前面的设置冲突——官方的说法。


评论(0) 浏览(57)

PHP中“非”、“空”类型值使用empty()或感叹号取反的区别,以及使用isset()、strlen()的运算结果

2017-6-22 chuang_no1

“是”类型的值比较容易理解,“非”、“空”类型的绕一下容易晕,这里做一下总结。


PHP中有8种变量类型:整数、浮点、字符串、布尔、数组、对象、资源和NULL空,我们分别用empty()、isset()、strlen()测试一下,这里先把结果丢出来,有兴趣的可以看详细操作。


先看PHP自带的变量查看函数var_dump()打个基础,记下类型和值:

赋值方式$var=... var_dump($var)结果
0 int(0)
'0' string(1) "0"
0.0 float(0)
'0.0' string(3) "0.0"
FALSE bool(false)
'FALSE' string(5) "FALSE"
'' string(0) ""
' ' string(1) " "
array() array(0) { }
new Demo object(Demo)#1 (0) { }
NULL NULL
'NULL' string(4) "NULL"


然后是常用的判断方法结果:

赋值方式$var=... gettype($var)结果 !$var的结果 empty($var)结果 isset($var)结果 strlen($var)结果 print_r($var)输出
0 integer TRUE TRUE TRUE 1 0
'0' string TRUE TRUE TRUE 1 0
0.0 double TRUE TRUE TRUE 1 0
'0.0' string FALSE FALSE TRUE 3 0.0
FALSE boolean TRUE TRUE TRUE 0
'FALSE' string FALSE FALSE TRUE 5 FALSE
'' string TRUE TRUE TRUE 0
' ' string FALSE FALSE TRUE 1
array() array TRUE TRUE TRUE
Warning: strlen() expects parameter 1 to be string, array given in...
Array ( )
new Demo object FALSE FALSE TRUE
Warning: strlen() expects parameter 1 to be string, object given in...
Demo Object ( )
NULL NULL TRUE TRUE FALSE 0
'NULL' string FALSE FALSE TRUE 4 NULL


可见if(!$var)和empty($var)的结果是一样一样的,他们都是针对变量的值进行运算,if(empty($var))和if(!$var)可以互相代用,效率问题不在本文讨论范文内。而isset()是针对变量本身是否存在进行运算的,除了NULL之外,只要变量在内存中创建了,无论什么值,都认为存在。而strlen()只接受字符串类型变量,其他类型变量则会先尝试转换为字符串再判断,关于PHP中变量类型隐式转换请百度。strlen()转换失败则会抛出错误提示信息。


整数、浮点、布尔比较好理解,与自然思维一致;字符串类型只有一个特例,“0”作为字符串存在占用1个字节长度能被检测到,同时在判断时又会被隐式转换为“非”、“空”的含义;复合变量中,数组如果没有元素,则也认为是“非”“空”结果;而对于对象来说,与数组又有些区别,只要创建了,即使没有任何方法和属性,也认为是“真”“是”类型的值。最后一个特殊类型NULL,没有值,或者认为它的值就是本身,任何情况下,进行运算时,都认为它是真正的“空”和“不存在”的。


也就是说,变量不仅仅需要关注其值,还要关注其类型,类型+值才是一个完整的变量。在使用等号运算时,如果只需要判断值相等或不等,使用“==”和“!=”,而需要值和类型都相等或都不等时,使用恒等符号“===”和“!==”。如果不关注值,只比较类型,则需要这样:if(gettype($var1)==gettype($var2))...


脚本代码:


<?php
//空类
class Demo{}

//建立各种类型变量数组,下标为了方便显示做了一些转义
$datas = array(

	'0'=>0,	//整数零
	'\'0\''=>'0',	//字符串零
	
	'0.0'=>0.0,	//浮点零点零
	'\'0.0\''=>'0.0',	//字符串零点零
	
	'FALSE'=>FALSE,	//布尔非
	'\'FALSE\''=>'FALSE',	//字符串非
	
	'\'\''=>'',	//空字符串
	'\' \''=>' ',	//空格
	
	'array()'=>array(),	//空数组
	
	'new Demo'=>new Demo,	//空对象
	
	'NULL'=>NULL,	//NULL空
	'\'NULL\''=>'NULL'	//字符串NULL
	
	//资源类型略,创建成功后一定为真,创建失败时即时返回布尔值FALSE或Exception类对象
	
);

//PHP中直接ECHO布尔值,会输出数字1和空字符串,所以这里用一个函数显式指定为TRUE和FALSE
function echoBoolen($boolen){
	if(is_bool($boolen)){
		if($boolen===TRUE){
			echo 'TRUE';
		}elseif($boolen===FALSE){
			echo 'FALSE';
		}
	}else{
		echo '警告:这不是布尔类型。';
	}
}

//循环输出var_dump()结果
foreach($datas as $key=>$value){
	echo '<tr><td>';
		echo $key;
	echo '</td><td>';
		var_dump($value);
	echo '</td></tr>'.PHP_EOL;
}

//循环输出常用判定方式的结果
foreach($datas as $key=>$value){
	echo '<tr><td>';
		echo $key;
	echo '</td><td>';
		echo gettype($value);
	echo '</td><td>';
		echoBoolen(!$value);
	echo '</td><td>';
		echoBoolen(empty($value));
	echo '</td><td>';
		echoBoolen(isset($value));
	echo '</td><td>';
		echo strlen($value);
	echo '</td><td>';
		print_r($value);
	echo '</td></tr>'.PHP_EOL;
}
?>


评论(0) 浏览(65)

关于为什么switch case语句不加break会继续执行不满足条件语句的坑与解释

2017-6-21 chuang_no1

遇到一个有点莫名的问题,看下代码:


<?php
$a = 0;
switch($a){
  case 0:
    $b='张三';
  case 1:
    $c='李四';
}
echo $b;
echo $c;

//执行结果为张三李四
?>


是不是很奇怪?明明$a=0时并不满足case 1,为什么会执行$c=1?

实际上,switch case语句的原理是:跳转到第一个满足case XX的条件,并执行剩余的语句(无论条件是否满足),直到执行完毕或遇到break/exit/die()/return等中断语句结束。

所以上面例子中,如果$a=1,则执行结果会是李四。如果希望执行到满足条件后不再执行,可以添加break;


<?php
$a = 0;
switch($a){
  case 0:
    $b='张三';
    break;
  case 1:
    $c='李四';
    break;
}
echo $b;
echo $c;

//执行结果为张三
?>


评论(0) 浏览(181)

在phpMyAdmin的表结构视图中添加显示注释

2016-12-20 chuang_no1

在phpMyAdmin中,查看表结构时,原本的设计是使用title标签显示注释的,只有当鼠标放到字段名上停留一会儿之后才能看到注释,这可真不是个方便的设计...作为一名程序猴,理应做出改进。

先看下修改后效果:
PMA查看结构时显示注释.jpg

相信大家已经看到过这个解决方案了:

找到phpmyadmin根目录文件tbl_structure.php中代码:<?php echo $field_name; ?>在其后加上代码:

<?php echo htmlspecialchars($comments_map[$row['Field']])!=""?"|".htmlspecialchars($comments_map[$row['Field']]):htmlspecialchars($comments_map[$row['Field']]);?>

有注释的情况下用|分隔

是不是感觉日了狗了?已经更新多少版了,这个陈旧的信息还在传播。好了,告诉大家2种新的修改方法,注意,这两种方法并不是随意二选一,而是根据自己的实际情况选用其一。

1、PMA版本号未知,我使用的是phpStudy,在PMA中显示的版本是phpStudy 2014,话说这样篡改真的不太好..此版本的修改方法是打开PMA根目录,找到tbl_structure.php,在大约340行附近:

//原版
$displayed_field_name = '<span class="commented_column" title="' . htmlspecialchars($comments_map[$row['Field']]) . '">' . $field_name . '</span>';

//修改后
$displayed_field_name = '<span class="commented_column" title="' . htmlspecialchars($comments_map[$row['Field']]) . '">' . $field_name . '</span><br /><span class="tblcomment">'.htmlspecialchars($comments_map[$row['Field']]).'</span>';

2、PMA4.4.15.7,大版本号与这个相同的话改法基本一样,这一版最大的变化是改为了面向对象的写法。修改方法是打开PMA根目录下的libraries/display_structure.inc.php,大约159行附近:

//原版
. $field_name . '</span>';

//修改后
. $field_name . '</span><br /><span class="tblcomment">'.htmlspecialchars($comments_map[$row['Field']]).'</span>';

如果你仔细看了,会发现原理其实是一样的,也很简单,加一个换行后显示注释即可,而且沿用PMA自带的样式,与查看表内容时一致。好了,刷新下页面看看效果吧。

标签: phpMyAdmin

评论(0) 浏览(692)

欢迎使用emlog

2016-10-25 chuang_no1

恭喜您成功安装了emlog,这是系统自动生成的演示文章。编辑或者删除它,然后开始您的创作吧!

评论(0) 浏览(1107)

Powered by emlog