在PHP网站开发过程中,如果你建立的网站涉及大量的图片处理,必然涉及到图片上传,缩放,而如何保持图片不失真,是很多初级PHP网站开发者比较头疼的一件事,今天David就和大家分享一下如何进行图片缩放。使用之前你需要下载安装GD库,以支持PHP图片处理。下面我们结合代码讲解具体的PHP图片缩放处理的思路。
参数说明:
$im 图片对象,应用函数之前,你需要用imagecreatefromjpeg()读取图片对象,如果PHP环境支持PNG,GIF,也可使用imagecreatefromgif(),imagecreatefrompng();
$maxwidth 定义生成图片的最大宽度(单位:像素)
$maxheight 生成图片的最大高度(单位:像素)
$name 生成的图片名
$filetype 最终生成的图片类型(.jpg/.png/.gif)
代码注释:
第3~4行:读取需要缩放的图片实际宽高
第8~26行:通过计算实际图片宽高与需要生成图片的宽高的压缩比例最终得出进行图片缩放是根据宽度还是高度进行缩放,当前程序是根据宽度进行图片缩放。如果你想根据高度进行图片缩放,你可以将第22行的语句改成$widthratio>$heightratio
第28~31行:如果实际图片的长度或者宽度小于规定生成图片的长度或者宽度,则要么根据长度进行图片缩放,要么根据宽度进行图片缩放。
第33~34行:计算最终缩放生成的图片长宽。
第36~45行:根据计算出的最终生成图片的长宽改变图片大小,有两种改变图片大小的方法:ImageCopyResized()函数在所有GD版本中有效,但其缩放图像的算法比较粗糙。ImageCopyResamples(),其像素插值算法得到的图像边缘比较平滑,但该函数的速度比ImageCopyResized()慢。
第47~49行:最终生成经过处理后的图片,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()
第51~56行:如果实际图片的长宽小于规定生成的图片长宽,则保持图片原样,同理,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()。
特别说明:
GD库1.6.2版以前支持GIF格式,但因GIF格式使用LZW演算法牵涉专利权,因此在GD1.6.2版之后不支持GIF的格式。如果你是 WINDOWS的环境,你只要进入PHP.INI文件找到extension=php_gd2.dll,将#去除,重启APACHE即可,如果你是 Linux环境,又想支持GIF,PNG,JPEG,你需要去下载libpng,zlib,以及freetype字体并安装。
OK,PHP图片压缩函数完成,最后我们概述一下整个处理的思路:
通过计算实际图片的长宽与规定生成图片的长宽之间的缩放比例,根据实际的需求(按照宽度还是按照高度进行图片缩放)计算出最终生成图片的大小,然后应用PHP图片处理函数对图片进行处理,最后输出图片。
以上就是关于PHP图片处理中如何对图片进行压缩并保持不失真的函数说明,有疑问或者好的建议欢迎给我留言,下次我将分享在PHP网站开发建设完成后,由于图片目录没有规划好,我们该如何对图片进行迁移的思路。
来源:http://www.leapsoul.cn/?p=118
他人原创:php类-resizeimage类-图片生成缩略图
http://blog.csdn.net/borsam/article/details/2200918
[codes=php]
<?php
class resizeimage
{
//图片类型
var $type;
//实际宽度
var $width;
//实际高度
var $height;
//改变后的宽度
var $resize_width;
//改变后的高度
var $resize_height;
//是否裁图
var $cut;
//源图象
var $srcimg;
//目标图象地址阅读全文
function resizeImage($im,$maxwidth,$maxheight,$name,$filetype)
{
$pic_width = imagesx($im);
$pic_height = imagesy($im);
if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))
{
if($maxwidth && $pic_width>$maxwidth)
{
$widthratio = $maxwidth/$pic_width;
$resizewidth_tag = true;
}
if($maxheight && $pic_height>$maxheight)
{
$heightratio = $maxheight/$pic_height;
$resizeheight_tag = true;
}
if($resizewidth_tag && $resizeheight_tag)
{
if($widthratio<$heightratio)
$ratio = $widthratio;
else
$ratio = $heightratio;
}
if($resizewidth_tag && !$resizeheight_tag)
$ratio = $widthratio;
if($resizeheight_tag && !$resizewidth_tag)
$ratio = $heightratio;
$newwidth = $pic_width * $ratio;
$newheight = $pic_height * $ratio;
if(function_exists("imagecopyresampled"))
{
$newim = imagecreatetruecolor($newwidth,$newheight);
imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
else
{
$newim = imagecreate($newwidth,$newheight);
imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
$name = $name.$filetype;
imagejpeg($newim,$name);
imagedestroy($newim);
}
else
{
$name = $name.$filetype;
imagejpeg($im,$name);
}
}
{
$pic_width = imagesx($im);
$pic_height = imagesy($im);
if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))
{
if($maxwidth && $pic_width>$maxwidth)
{
$widthratio = $maxwidth/$pic_width;
$resizewidth_tag = true;
}
if($maxheight && $pic_height>$maxheight)
{
$heightratio = $maxheight/$pic_height;
$resizeheight_tag = true;
}
if($resizewidth_tag && $resizeheight_tag)
{
if($widthratio<$heightratio)
$ratio = $widthratio;
else
$ratio = $heightratio;
}
if($resizewidth_tag && !$resizeheight_tag)
$ratio = $widthratio;
if($resizeheight_tag && !$resizewidth_tag)
$ratio = $heightratio;
$newwidth = $pic_width * $ratio;
$newheight = $pic_height * $ratio;
if(function_exists("imagecopyresampled"))
{
$newim = imagecreatetruecolor($newwidth,$newheight);
imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
else
{
$newim = imagecreate($newwidth,$newheight);
imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
$name = $name.$filetype;
imagejpeg($newim,$name);
imagedestroy($newim);
}
else
{
$name = $name.$filetype;
imagejpeg($im,$name);
}
}
参数说明:
$im 图片对象,应用函数之前,你需要用imagecreatefromjpeg()读取图片对象,如果PHP环境支持PNG,GIF,也可使用imagecreatefromgif(),imagecreatefrompng();
$maxwidth 定义生成图片的最大宽度(单位:像素)
$maxheight 生成图片的最大高度(单位:像素)
$name 生成的图片名
$filetype 最终生成的图片类型(.jpg/.png/.gif)
代码注释:
第3~4行:读取需要缩放的图片实际宽高
第8~26行:通过计算实际图片宽高与需要生成图片的宽高的压缩比例最终得出进行图片缩放是根据宽度还是高度进行缩放,当前程序是根据宽度进行图片缩放。如果你想根据高度进行图片缩放,你可以将第22行的语句改成$widthratio>$heightratio
第28~31行:如果实际图片的长度或者宽度小于规定生成图片的长度或者宽度,则要么根据长度进行图片缩放,要么根据宽度进行图片缩放。
第33~34行:计算最终缩放生成的图片长宽。
第36~45行:根据计算出的最终生成图片的长宽改变图片大小,有两种改变图片大小的方法:ImageCopyResized()函数在所有GD版本中有效,但其缩放图像的算法比较粗糙。ImageCopyResamples(),其像素插值算法得到的图像边缘比较平滑,但该函数的速度比ImageCopyResized()慢。
第47~49行:最终生成经过处理后的图片,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()
第51~56行:如果实际图片的长宽小于规定生成的图片长宽,则保持图片原样,同理,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()。
特别说明:
GD库1.6.2版以前支持GIF格式,但因GIF格式使用LZW演算法牵涉专利权,因此在GD1.6.2版之后不支持GIF的格式。如果你是 WINDOWS的环境,你只要进入PHP.INI文件找到extension=php_gd2.dll,将#去除,重启APACHE即可,如果你是 Linux环境,又想支持GIF,PNG,JPEG,你需要去下载libpng,zlib,以及freetype字体并安装。
OK,PHP图片压缩函数完成,最后我们概述一下整个处理的思路:
通过计算实际图片的长宽与规定生成图片的长宽之间的缩放比例,根据实际的需求(按照宽度还是按照高度进行图片缩放)计算出最终生成图片的大小,然后应用PHP图片处理函数对图片进行处理,最后输出图片。
以上就是关于PHP图片处理中如何对图片进行压缩并保持不失真的函数说明,有疑问或者好的建议欢迎给我留言,下次我将分享在PHP网站开发建设完成后,由于图片目录没有规划好,我们该如何对图片进行迁移的思路。
来源:http://www.leapsoul.cn/?p=118
他人原创:php类-resizeimage类-图片生成缩略图
http://blog.csdn.net/borsam/article/details/2200918
[codes=php]
<?php
class resizeimage
{
//图片类型
var $type;
//实际宽度
var $width;
//实际高度
var $height;
//改变后的宽度
var $resize_width;
//改变后的高度
var $resize_height;
//是否裁图
var $cut;
//源图象
var $srcimg;
//目标图象地址阅读全文
窗口(windows) -> 首选项(preferences) -> 常规(general) -> 外观(apprearcn) -> 颜色和字体(color and font) -> 基本 -> 文本字体(text font)
解决办法:
Window -> Preferences -> General -> Appearance -> Colors and Fonts -> Basic -> Text Font -> Change
选择 BitStream Vera Sans Mono (其他几个BitStream的字体应该也可以)
安装Aptana3中高亮显示相同变量(实践OK)
Window -> preferences -> Aptana Studio -> Editors -> PHP
选中 Mark occurrences with background color 其中选项 Global variables 就是高亮显示相同变量
==================================================================
解决办法:
Window -> Preferences -> General -> Appearance -> Colors and Fonts -> Basic -> Text Font -> Change
选择 BitStream Vera Sans Mono (其他几个BitStream的字体应该也可以)
安装Aptana3中高亮显示相同变量(实践OK)
Window -> preferences -> Aptana Studio -> Editors -> PHP
选中 Mark occurrences with background color 其中选项 Global variables 就是高亮显示相同变量
==================================================================
“这是一个最好的时代,也是一个最坏的时代”。若要用一句话来概括现在我们所处的这个时代,狄更斯在《双城记》中的这句名言怕是最合适不过了。
为什么这么说呢?其实,时代是无所谓好坏的,只不过人永远只能活在当下,而又总是向往生活在别处,于是便尤其觉得所处的这个时代瑕疵斑斑,就象诗人于坚所形容的,我们是“站在餐桌旁的一代”。然而我始终认为,作为个体、作为平凡人,你改变不了这个时代,你也无须试图去改变这个时代。你所要做的,只是坚守内心、建立自己的精神生活,不被物欲横流的时代症候所盅惑。
穿过时光的眼,让我们回到卡夫卡所在的那个时代,看看这个文学大师是怎样度过他生命中的某一天的。
1914年4月2日,卡夫卡的日记里只有两句话:“德国俄国宣战。——下午游泳。”这是非常奇特的,他把一个无关紧要的个人生活细节与重大的世界崩溃的事件联系在一起,有力地体现出了卡夫卡的写作与生存不被集体记忆或社会公论所左右,他坚定的是个人的对世界的立场。
同样的,张爱玲在她的那个时代,在那个宏大叙事的时代,也绝对是个异数,当大家都在揽时代变迁、社会变革为己任、全身投入革命洪流的时候,张爱玲却在看着手指尖的指甲红而自怨自艾着、她宣扬的是与时代精神格格不入的物质主义、宣扬的是“成名要趁早”,更要命的是,她还和一个著名的汉奸开始了一段感情。还有比这更离经叛道的吗?
可是,你得承认,时至今日,那些普罗文学、那些高、大、全、打着深深时代烙印的革命文学都被遗忘和淹没在故纸堆了,而张爱玲具有普遍意义的小我叙事,却穿越时空,留存了下来,成为30年代上海孤岛文学的最珍贵资料,成为那个革命时代里最弥足珍贵的个体生活史,而她的文学,也继续影响和打动着我们。
所以,永远不要去责备时代的丑恶或者不完美,去求证个人的渺小或者时代的强大。是的,这确实是一个快餐时代,人们都在消费着速食爱情,是的,这确实是一个精神荒芜的年代。人们都在逃避崇高、物化精神,可是这又有什么关系?人类永远会有糟糕的儿童期和糨糊一样的青春期,正如我们现在所处的这样一个怀疑一切、破坏一切的时代。没有由衷的信仰,其实又何尝不是一种契机,或许我们将由此进入人类的成人时期。
为什么这么说呢?其实,时代是无所谓好坏的,只不过人永远只能活在当下,而又总是向往生活在别处,于是便尤其觉得所处的这个时代瑕疵斑斑,就象诗人于坚所形容的,我们是“站在餐桌旁的一代”。然而我始终认为,作为个体、作为平凡人,你改变不了这个时代,你也无须试图去改变这个时代。你所要做的,只是坚守内心、建立自己的精神生活,不被物欲横流的时代症候所盅惑。
穿过时光的眼,让我们回到卡夫卡所在的那个时代,看看这个文学大师是怎样度过他生命中的某一天的。
1914年4月2日,卡夫卡的日记里只有两句话:“德国俄国宣战。——下午游泳。”这是非常奇特的,他把一个无关紧要的个人生活细节与重大的世界崩溃的事件联系在一起,有力地体现出了卡夫卡的写作与生存不被集体记忆或社会公论所左右,他坚定的是个人的对世界的立场。
同样的,张爱玲在她的那个时代,在那个宏大叙事的时代,也绝对是个异数,当大家都在揽时代变迁、社会变革为己任、全身投入革命洪流的时候,张爱玲却在看着手指尖的指甲红而自怨自艾着、她宣扬的是与时代精神格格不入的物质主义、宣扬的是“成名要趁早”,更要命的是,她还和一个著名的汉奸开始了一段感情。还有比这更离经叛道的吗?
可是,你得承认,时至今日,那些普罗文学、那些高、大、全、打着深深时代烙印的革命文学都被遗忘和淹没在故纸堆了,而张爱玲具有普遍意义的小我叙事,却穿越时空,留存了下来,成为30年代上海孤岛文学的最珍贵资料,成为那个革命时代里最弥足珍贵的个体生活史,而她的文学,也继续影响和打动着我们。
所以,永远不要去责备时代的丑恶或者不完美,去求证个人的渺小或者时代的强大。是的,这确实是一个快餐时代,人们都在消费着速食爱情,是的,这确实是一个精神荒芜的年代。人们都在逃避崇高、物化精神,可是这又有什么关系?人类永远会有糟糕的儿童期和糨糊一样的青春期,正如我们现在所处的这样一个怀疑一切、破坏一切的时代。没有由衷的信仰,其实又何尝不是一种契机,或许我们将由此进入人类的成人时期。
《醉翁亭记》滁州白话版作者:Yacht
阅读全文
阅读全文
在firefox下使用js清空file控件的value非常简单, 即:obj.value=""; 就可以了,但在ie下,由于出于安全等方面考虑,file的value被设为了只读,所以js对其不能直接地控制,因此我们只能使用一些变通的方法来解决,网上对此也有好些方法,在此我谈谈自己认为最好的几种。
阅读全文
阅读全文
今天发现一个函数很奇怪,没有在php里面写,感觉是一个扩展,于是通过膘哥哥的这个提示后写出如下:
果然是c写的扩展,牛!!!
来源:膘叔,Jackxiang,版权所有:)
addTime:2021-03-05
php --re gd|grep imagettfbbox
--re <name> Show information about extension <name>.
php --re gd|grep images
Function [ <internal:gd> function imagesetstyle ] {
Function [ <internal:gd> function imagesetthickness ] {
Function [ <internal:gd> function imagesavealpha ] {
Function [ <internal:gd> function imagesettile ] {
Ps:
膘叔(19129540) 17:07:32
get_defined_functions
回忆未来(372647693) 17:10:04
[~]# php -r "var_dump(get_defined_functions());"|grep qp_pt2vkey_verify
string(17) "qp_pt2vkey_verify"
回忆未来(372647693) 17:10:43
膘哥你是天上太阳,没有你就没有地球,没有海洋。没有鸟笼山。。。
纯月(88659854) 17:11:01
去帮彪哥点广告去
回忆未来(372647693) 17:11:35
今天我从村里赶来,来唱这首歌,。。。
PHP5→(404926006) 17:11:55
膘叔是我们榜样,我们要像膘叔学习。
PHP5→(404926006) 17:12:49
虽然他那么猥*,虽然他那么*龊,但是我们都不在乎。。。
PHP5→(404926006) 17:13:19
只因为一个原因,因为他是我们的膘叔。
[~]# php -r "print_r(get_defined_functions());"|grep qp_pt2vkey_verify
[1198] => qp_pt2vkey_verify
[1198] => qp_pt2vkey_verify
果然是c写的扩展,牛!!!
来源:膘叔,Jackxiang,版权所有:)
addTime:2021-03-05
php --re gd|grep imagettfbbox
--re <name> Show information about extension <name>.
php --re gd|grep images
Function [ <internal:gd> function imagesetstyle ] {
Function [ <internal:gd> function imagesetthickness ] {
Function [ <internal:gd> function imagesavealpha ] {
Function [ <internal:gd> function imagesettile ] {
Ps:
膘叔(19129540) 17:07:32
get_defined_functions
回忆未来(372647693) 17:10:04
[~]# php -r "var_dump(get_defined_functions());"|grep qp_pt2vkey_verify
string(17) "qp_pt2vkey_verify"
回忆未来(372647693) 17:10:43
膘哥你是天上太阳,没有你就没有地球,没有海洋。没有鸟笼山。。。
纯月(88659854) 17:11:01
去帮彪哥点广告去
回忆未来(372647693) 17:11:35
今天我从村里赶来,来唱这首歌,。。。
PHP5→(404926006) 17:11:55
膘叔是我们榜样,我们要像膘叔学习。
PHP5→(404926006) 17:12:49
虽然他那么猥*,虽然他那么*龊,但是我们都不在乎。。。
PHP5→(404926006) 17:13:19
只因为一个原因,因为他是我们的膘叔。
目的:官方PHP7.3.12版本的代码的memcached/memcache的扩展有些不是官方的,打包后需要简单测试一下:
centos6.x:
php-7.3.12-200119174731.el6.x86_64
memcached-php73-3.1.5-200120160443.el6.x86_64
memcache-php73-4.0.5-200120133708.el6.x86_64
redis-php73-3.1.2-200120134324.el6.x86_64
centos7.x:
memcached-php73-3.1.5-200120155225.el7.centos.x86_64.rpm
php-7.3.12-191219193316.el7.centos.x86_64.rpm
memcache-php73-4.0.5-200119152756.el7.centos.x86_64.rpm
redis-php73-3.1.2-191218163944.el7.centos.x86_64.rpm
一)memcace扩展代码成功如下:
php bar.php
TK
telnet 10.71.11.4* 11211
Trying 10.71.11.4*...
Connected to 10.71.11.4*.
Escape character is '^]'.
get name
VALUE name 0 2
TK
END
set name 0 0 4
jack
STORED
get name
VALUE name 0 4
jack
END
php bar.php # //$memcache->set('name', 'TK');
jack
更多telnet 的操作:
https://jackxiang.com/post/2484/
二)memcached扩展下的PHP测试代码如下:
php memcached.php
int(1)
telnet 10.71.11.40 11211
Trying 10.71.11.40...
Connected to 10.71.11.40.
Escape character is '^]'.
get 123
VALUE 123 1 1
1
END
==========================================EOF================================
PHP代码保存数组片段如下:
<?php
date_default_timezone_set ('Asia/Shanghai');
//连接
$mem = new Memcache;
$mem->connect("10.70.33.1", 11211);
//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br />";
// 替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//保存数组
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//关闭连接
$mem->close();
?>
如果正常的话,浏览器将输出:
php memcacheTest.php
Get key1 value: This is first value<br />Get key1 value: This is replace value<br />Get key2 value: Array
(
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
)
<br />Get key1 value:
<br />
程序代码分析
初始化一个Memcache的对象:
连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:
保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:
从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:
现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:
同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出
现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果
最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接
Memcache的使用
使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。
centos6.x:
php-7.3.12-200119174731.el6.x86_64
memcached-php73-3.1.5-200120160443.el6.x86_64
memcache-php73-4.0.5-200120133708.el6.x86_64
redis-php73-3.1.2-200120134324.el6.x86_64
centos7.x:
memcached-php73-3.1.5-200120155225.el7.centos.x86_64.rpm
php-7.3.12-191219193316.el7.centos.x86_64.rpm
memcache-php73-4.0.5-200119152756.el7.centos.x86_64.rpm
redis-php73-3.1.2-191218163944.el7.centos.x86_64.rpm
一)memcace扩展代码成功如下:
php bar.php
TK
telnet 10.71.11.4* 11211
Trying 10.71.11.4*...
Connected to 10.71.11.4*.
Escape character is '^]'.
get name
VALUE name 0 2
TK
END
set name 0 0 4
jack
STORED
get name
VALUE name 0 4
jack
END
php bar.php # //$memcache->set('name', 'TK');
jack
更多telnet 的操作:
https://jackxiang.com/post/2484/
二)memcached扩展下的PHP测试代码如下:
php memcached.php
int(1)
telnet 10.71.11.40 11211
Trying 10.71.11.40...
Connected to 10.71.11.40.
Escape character is '^]'.
get 123
VALUE 123 1 1
1
END
==========================================EOF================================
PHP代码保存数组片段如下:
<?php
date_default_timezone_set ('Asia/Shanghai');
//连接
$mem = new Memcache;
$mem->connect("10.70.33.1", 11211);
//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br />";
// 替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//保存数组
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//关闭连接
$mem->close();
?>
如果正常的话,浏览器将输出:
php memcacheTest.php
Get key1 value: This is first value<br />Get key1 value: This is replace value<br />Get key2 value: Array
(
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
)
<br />Get key1 value:
<br />
程序代码分析
初始化一个Memcache的对象:
$mem = new Memcache;
连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:
$mem->connect("192.168.0.200", 12000);
保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:
$mem->set(‘key1‘, ‘This is first value’, 0, 60);
从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:
$val = $mem->get(’key1′);
echo "Get key1 value: " . $val;
echo "Get key1 value: " . $val;
现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:
$mem->replace(‘key1′, ‘This is replace value’, 0, 60);
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val;
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val;
同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出
$arr = array(‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’);
$mem->set(‘key2′, $arr, 0, 60);
$val2 = $mem->get(‘key2′);
print_r($val2);
$mem->set(‘key2′, $arr, 0, 60);
$val2 = $mem->get(‘key2′);
print_r($val2);
现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果
$mem->delete(‘key1′);
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val . "<br>";
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val . "<br>";
最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接
$mem->flush();
$val2 = $mem->get(‘key2′);
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
$val2 = $mem->get(‘key2′);
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
Memcache的使用
使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。
现象:
VMware启动进入系统后,XP通过SecureCRT进行SSH进行登陆,结果怎么都登不上去。。。
在虚拟机里面用netstat看了一下,Suse上的22端口已经在侦听了,可是就是从XP上登不上去,ping都没问题。
root 身份执行:
原来是防火墙的原因!
首先,打开/etc/sysconfig/SuSEfirewall2 文件,FW_SERVICES_EXT_TCP="ssh"可以定义开放ssh的服务。
然后,打开root登陆权限,如下:
决办法:
ssh默认不支持密码方式验证.
修改/etc/ssh/sshd_config文件,把
PasswordAuthentication no
修改为:
PasswordAuthentication yes
再重启ssh服务即可:
/etc/init.d/sshd restart
防火墙设置也可以执行yast 程式,于 firewall 项目内设定允许 ssh port 22 登入存取。
后记:
如果想控制仅允许某一IP或某一网段来使用这个SSH服务呢?
修改配置文件中的FW_SERVICES_ACCEPT_EXT参数即可实现.
----------------------------------------------------------------------------
补充:
使用yast查看sshd服务的状态,在命令行输入yast回车,启动yast界面,选择 “System>SystemServices(Runlevel)”,打开SystemServices(Runlevel):Services 界面,检查sshd状态已经是Enabled。使用功能键Alt E转到ExpertMode,观察到当前sshd运行在Runlevel5, (Fullmultiuserwithnetworkanddisplaymanager),这都没有问题。
注意:service sshd restart 这样也可以启动!
VMware启动进入系统后,XP通过SecureCRT进行SSH进行登陆,结果怎么都登不上去。。。
在虚拟机里面用netstat看了一下,Suse上的22端口已经在侦听了,可是就是从XP上登不上去,ping都没问题。
root 身份执行:
linux-jvm6:/home/jackxiang/桌面 # telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.2
Protocol mismatch.
Connection closed by foreign host.
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.2
Protocol mismatch.
Connection closed by foreign host.
原来是防火墙的原因!
首先,打开/etc/sysconfig/SuSEfirewall2 文件,FW_SERVICES_EXT_TCP="ssh"可以定义开放ssh的服务。
然后,打开root登陆权限,如下:
决办法:
ssh默认不支持密码方式验证.
修改/etc/ssh/sshd_config文件,把
PasswordAuthentication no
修改为:
PasswordAuthentication yes
再重启ssh服务即可:
/etc/init.d/sshd restart
防火墙设置也可以执行yast 程式,于 firewall 项目内设定允许 ssh port 22 登入存取。
后记:
如果想控制仅允许某一IP或某一网段来使用这个SSH服务呢?
修改配置文件中的FW_SERVICES_ACCEPT_EXT参数即可实现.
----------------------------------------------------------------------------
补充:
使用yast查看sshd服务的状态,在命令行输入yast回车,启动yast界面,选择 “System>SystemServices(Runlevel)”,打开SystemServices(Runlevel):Services 界面,检查sshd状态已经是Enabled。使用功能键Alt E转到ExpertMode,观察到当前sshd运行在Runlevel5, (Fullmultiuserwithnetworkanddisplaymanager),这都没有问题。
注意:service sshd restart 这样也可以启动!
IntelliJ IDEA 9.0启动错误解决办法
Java开发的免费IDE除了Eclipse和Netbeans,现在又多了一个IntelliJ IDEA。IntelliJ IDEA以前并不是免费软件,仅仅对开发开源项目提供免费的license。但是供从9.0开始,IntelliJ IDEA多了一个社区版本,这个免费的社区版本相对于收费版本,减少了很多高级功能,但是仍然能够满足我日常的Java应用开发。对我个人而言,最重要的是对Groovy和Scala的支持。
既然是免费版本,先装一个体验一下。安装完成之后双击左面的idea.exe启动IDEA,弹出一个错误框,错误提示是:The JVM could not be started.The main method may have thrown an exception.如果启动java应用程序时候内存不足,jvm会提示上面的错误。IDEA会出现这个错误是因为idea.exe启动程序用exe4j制作的,exe4j运行在前,到运行idea程序的时候内存已经不足。
找到了问题原因,有三种办法可以解决上面这个问题。一种办法是修改IDEA安装目录下的bin目录下的idea.exe.vmoptions修改一下。还有一种办法是用idea.bat启动,设置一下IDEA_JDK或者JDK_HOME系统变量指到JDK的安装目录。如果觉得上面两种方法方法麻烦,最后一个办法可以打一个idea.exe补丁。
php支持插件下载地址:http://zh.sourceforge.jp/projects/sfnet_idea-php/downloads/idea-php/_7/idea-php-alpha-7.jar/
补丁在
" target="_blank">这里下载:http://www.jetbrains.net/devnet/servlet/JiveServlet/download/1185-4-11357/idea.zip,讲压缩文件里面的idea.exe替换掉IDEA安装目录下的bin目录下的同名文件即可。Java开发的免费IDE除了Eclipse和Netbeans,现在又多了一个IntelliJ IDEA。IntelliJ IDEA以前并不是免费软件,仅仅对开发开源项目提供免费的license。但是供从9.0开始,IntelliJ IDEA多了一个社区版本,这个免费的社区版本相对于收费版本,减少了很多高级功能,但是仍然能够满足我日常的Java应用开发。对我个人而言,最重要的是对Groovy和Scala的支持。
既然是免费版本,先装一个体验一下。安装完成之后双击左面的idea.exe启动IDEA,弹出一个错误框,错误提示是:The JVM could not be started.The main method may have thrown an exception.如果启动java应用程序时候内存不足,jvm会提示上面的错误。IDEA会出现这个错误是因为idea.exe启动程序用exe4j制作的,exe4j运行在前,到运行idea程序的时候内存已经不足。
找到了问题原因,有三种办法可以解决上面这个问题。一种办法是修改IDEA安装目录下的bin目录下的idea.exe.vmoptions修改一下。还有一种办法是用idea.bat启动,设置一下IDEA_JDK或者JDK_HOME系统变量指到JDK的安装目录。如果觉得上面两种方法方法麻烦,最后一个办法可以打一个idea.exe补丁。
php支持插件下载地址:http://zh.sourceforge.jp/projects/sfnet_idea-php/downloads/idea-php/_7/idea-php-alpha-7.jar/
补丁在
下载文件
来源:http://blog.interwis.net/sentom/archive/2010/01/17/intellij-idea-9.0.aspx
曹風·蜉蝣
蜉蝣之羽,衣裳楚楚。心之憂矣。於我歸處。
蜉蝣之翼,采采衣服。心之憂矣。於我歸息。
蜉蝣掘閱,麻衣如雪。心之憂矣,於我歸說。
** 请注意! **
测试结果很大程度上依赖于机器的硬件/软件配置,并随配置变化而产生差异,因此:
本测试结果 *仅供参考*
测试用硬件:
CPU: Intel PII 300(66x4.5)
RAM: 192M
HD: IBM 20G(2M cache)
测试用软件:
OS: Slackware 7(自行编译的2.2.14核心)
Web: Apache 1.3.12(标准模块按缺省配置,所有模块静态编译)
PHP 4.0 RC1(加入了MySQL支持)
mod_perl 1.23(缺省配置,未加EVERYTHING=1)
ApacheJServ 1.1(缺省配置)
JDK: JDK 1.2.2
JSDK: JSDK 2
JSP: GNUJSP 1.0.0
JSP: GNUJSP 1.0.0
本测试是用Apache自带的Apache Bench(ab)进行的,命令为:
/www/bin/ab -c 20 -n 1000 CGI/脚本URL
此命令表示使用 20 个并发连接,进行 1000 次请求。
所有测试均在本机进行,各种测试均反复进行5次,去掉最大最小值后取平均值。
我分别测试了C写的CGI、Perl写的CGI、用mod_perl执行的Perl CGI、PHP和JSP。
各种CGI/脚本均输出内容相似的简单页面,内容如下:
html
body
h1The xxxx Hello Program/h1
p
Hello xxxx World!
/body
/html
测试结果(只取了最具代表性的 Requests per second 即每秒处理请求数这一项)
CGI/脚本类型 每秒处理请求数
C CGI 128
Perl CGI 69
mod_perl 223
PHP 237
JSP 21
除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为
CGI运行时又需要另外fork进程,所以最慢;mod_perl和PHP都直接在httpd内部运
行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运
行时也是因为fork而使性能大打折扣。
至于JSP...我想这个结果并不具有代表性。毕竟测试用机只有192M内存,用top看
看,一个JAVA就占了11M。况且测试用机本身是一台Web server,测试时还有好几
十个httpd在跑
不过不管怎么说,在配置较低的服务器上,跑PHP、mod_perl在性能上要好过JSP
是肯定的。
附测试用程序:
C程序 hello.c
#include stdio.h
int main(void)
{
char s[] = "C CGI";
printf ("Content-Type: text/html ");
printf ("html "
"body "
"h1The C CGI Hello Program/h1 "
"p "
"Hello %s World! "
"/body "
"/html ", s);
return 0;
}
用 gcc -o hello hello.c 编译,把 hello 放到 cgi-bin目录下。
Perl程序 hello.pl
#!/usr/bin/perl
#!/usr/bin/perl
$s = "Perl CGI";
print "Content-Type: text/html ";
print <<DONE
html
body
h1The Perl CGI Hello Program/h1
p
Hello $s World!
/body
/html
DONE
把hello.pl放到cgi-bin目录下,兼作Perl CGI和mod_perl 脚本测试用。
PHP文件 hello.php
html
body
h1The PHP Hello Program/h1
<? $s = "PHP"; ?>
p
Hello <? echo $s ?> World!
/body
/body
/html
JSP文件 hello.jsp
html
body
h1The JSP Hello Program/h1
p
<% String s = "JSP"; %>
p
Hello <%= s %> World!
/body
/html
shenvo 回复于:2003-01-15 13:41:46跑jsp这么耗内存吗,这和运行什么样的服务器也有关系吧,请问斑竹tomcat,resin哪个性能更好些(同等条件下)
南非蜘蛛 回复于:2003-01-15 13:44:32[quote:afe8c42037="shenvo"]跑jsp这么耗内存吗,这和运行什么样的服务器也有关系吧,请问斑竹tomcat,resin哪个性能更好些(同等条件下)[/quote:afe8c42037]
我觉得不要钱的好,纯属个人意见,不代表版本意见,呵呵
neteagle 回复于:2003-01-16 13:48:29我的tomcat比较夸张,环境为redhat AS 2.1+apache1.3.27+tomcat 4.1.18,jdk为IBMJDK1.3.1,数据库为oracle9I,开始时每个java占用内存为25M,随着访问的增加开始上升到100多M,多时达到300多M,没有访问后java占用的内存并不释放,只有重起tomcat才能释放内存,我一直找不到原因,蜘蛛你知道吗?
南非蜘蛛 回复于:2003-01-16 13:55:17[quote:a9d1723b7c="neteagle"]我的tomcat比较夸张,环境为redhat AS 2.1+apache1.3.27+tomcat 4.1.18,jdk为IBMJDK1.3.1,数据库为oracle9I,开始时每个java占用内存为25M,随着访问的增加开始上升到100多M,多时达到..........[/quote:a9d1723b7c]
是你的程序没有释放内存吧???
neteagle 回复于:2003-01-16 14:09:15对,tomcat没有释放内存,一个java仍然占用300多M内存,
只有重起tomcat才能释放
南非蜘蛛 回复于:2003-01-16 14:11:10[quote:de9500e94e="neteagle"]对,tomcat没有释放内存,一个java仍然占用300多M内存,
只有重起tomcat才能释放[/quote:de9500e94e]
我查查资料,我觉得是你程序写的有问题,不是tomcat的问题
neteagle 回复于:2003-01-16 14:16:36我先用我自己的应用出现问题,
后来用了你上面贴里的那个helloword.jsp
用ab测试
ygzq 回复于:2003-04-03 10:52:05[quote:07cc0e3071="南非蜘蛛"]除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为
CGI运行时又需要另外fork进程,所以最慢;mod_perl和PHP都直接在httpd内部运
行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运
行时也是因为fork而使性能大打折扣。[/quote:07cc0e3071]
simple c cgi should be much more quicker than listed.
forking a perl takes about 4 MB memory while forking a simple c program can be ignored (yes still some overhead).
agree that c cgi should simple.
price for php and mod_perl is that you end up with a much larger httpd file which needs more resources to run - no free lunch as it says. so the system can be really slow when/before it establishes its httpd process pools, and when there are a lot of users so new httpd processes need to be created.
麻辣 回复于:2003-10-20 01:47:45无意中发现这个帖子,我也测试了一下,和上面的结果完全不同
理论归理论,还是多实测,不同的代码不同的环境可能有不同的测试结果。
我的测试结果完全相反(在windows环境)perl普通状态(没有mod_perl)下不但不慢,还比PHP要快
测试完成相同加法运算,循环1000000次(如果您的机器配置比较底,可以减少循环次数)
雷鸟2000+ 256兆内存,考虑到加上编译时间,做了两个脚本:
######perl.cgi#########
#!/usr/bin/perl
use Benchmark;
$TT0 = new Benchmark;
do "test.cgi";#用DO命令调用test.cgi脚本来计算总时间
exit;
测试结果很大程度上依赖于机器的硬件/软件配置,并随配置变化而产生差异,因此:
本测试结果 *仅供参考*
测试用硬件:
CPU: Intel PII 300(66x4.5)
RAM: 192M
HD: IBM 20G(2M cache)
测试用软件:
OS: Slackware 7(自行编译的2.2.14核心)
Web: Apache 1.3.12(标准模块按缺省配置,所有模块静态编译)
PHP 4.0 RC1(加入了MySQL支持)
mod_perl 1.23(缺省配置,未加EVERYTHING=1)
ApacheJServ 1.1(缺省配置)
JDK: JDK 1.2.2
JSDK: JSDK 2
JSP: GNUJSP 1.0.0
JSP: GNUJSP 1.0.0
本测试是用Apache自带的Apache Bench(ab)进行的,命令为:
/www/bin/ab -c 20 -n 1000 CGI/脚本URL
此命令表示使用 20 个并发连接,进行 1000 次请求。
所有测试均在本机进行,各种测试均反复进行5次,去掉最大最小值后取平均值。
我分别测试了C写的CGI、Perl写的CGI、用mod_perl执行的Perl CGI、PHP和JSP。
各种CGI/脚本均输出内容相似的简单页面,内容如下:
html
body
h1The xxxx Hello Program/h1
p
Hello xxxx World!
/body
/html
测试结果(只取了最具代表性的 Requests per second 即每秒处理请求数这一项)
CGI/脚本类型 每秒处理请求数
C CGI 128
Perl CGI 69
mod_perl 223
PHP 237
JSP 21
除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为
CGI运行时又需要另外fork进程,所以最慢;mod_perl和PHP都直接在httpd内部运
行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运
行时也是因为fork而使性能大打折扣。
至于JSP...我想这个结果并不具有代表性。毕竟测试用机只有192M内存,用top看
看,一个JAVA就占了11M。况且测试用机本身是一台Web server,测试时还有好几
十个httpd在跑
不过不管怎么说,在配置较低的服务器上,跑PHP、mod_perl在性能上要好过JSP
是肯定的。
附测试用程序:
C程序 hello.c
#include stdio.h
int main(void)
{
char s[] = "C CGI";
printf ("Content-Type: text/html ");
printf ("html "
"body "
"h1The C CGI Hello Program/h1 "
"p "
"Hello %s World! "
"/body "
"/html ", s);
return 0;
}
用 gcc -o hello hello.c 编译,把 hello 放到 cgi-bin目录下。
Perl程序 hello.pl
#!/usr/bin/perl
#!/usr/bin/perl
$s = "Perl CGI";
print "Content-Type: text/html ";
print <<DONE
html
body
h1The Perl CGI Hello Program/h1
p
Hello $s World!
/body
/html
DONE
把hello.pl放到cgi-bin目录下,兼作Perl CGI和mod_perl 脚本测试用。
PHP文件 hello.php
html
body
h1The PHP Hello Program/h1
<? $s = "PHP"; ?>
p
Hello <? echo $s ?> World!
/body
/body
/html
JSP文件 hello.jsp
html
body
h1The JSP Hello Program/h1
p
<% String s = "JSP"; %>
p
Hello <%= s %> World!
/body
/html
shenvo 回复于:2003-01-15 13:41:46跑jsp这么耗内存吗,这和运行什么样的服务器也有关系吧,请问斑竹tomcat,resin哪个性能更好些(同等条件下)
南非蜘蛛 回复于:2003-01-15 13:44:32[quote:afe8c42037="shenvo"]跑jsp这么耗内存吗,这和运行什么样的服务器也有关系吧,请问斑竹tomcat,resin哪个性能更好些(同等条件下)[/quote:afe8c42037]
我觉得不要钱的好,纯属个人意见,不代表版本意见,呵呵
neteagle 回复于:2003-01-16 13:48:29我的tomcat比较夸张,环境为redhat AS 2.1+apache1.3.27+tomcat 4.1.18,jdk为IBMJDK1.3.1,数据库为oracle9I,开始时每个java占用内存为25M,随着访问的增加开始上升到100多M,多时达到300多M,没有访问后java占用的内存并不释放,只有重起tomcat才能释放内存,我一直找不到原因,蜘蛛你知道吗?
南非蜘蛛 回复于:2003-01-16 13:55:17[quote:a9d1723b7c="neteagle"]我的tomcat比较夸张,环境为redhat AS 2.1+apache1.3.27+tomcat 4.1.18,jdk为IBMJDK1.3.1,数据库为oracle9I,开始时每个java占用内存为25M,随着访问的增加开始上升到100多M,多时达到..........[/quote:a9d1723b7c]
是你的程序没有释放内存吧???
neteagle 回复于:2003-01-16 14:09:15对,tomcat没有释放内存,一个java仍然占用300多M内存,
只有重起tomcat才能释放
南非蜘蛛 回复于:2003-01-16 14:11:10[quote:de9500e94e="neteagle"]对,tomcat没有释放内存,一个java仍然占用300多M内存,
只有重起tomcat才能释放[/quote:de9500e94e]
我查查资料,我觉得是你程序写的有问题,不是tomcat的问题
neteagle 回复于:2003-01-16 14:16:36我先用我自己的应用出现问题,
后来用了你上面贴里的那个helloword.jsp
用ab测试
ygzq 回复于:2003-04-03 10:52:05[quote:07cc0e3071="南非蜘蛛"]除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为
CGI运行时又需要另外fork进程,所以最慢;mod_perl和PHP都直接在httpd内部运
行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运
行时也是因为fork而使性能大打折扣。[/quote:07cc0e3071]
simple c cgi should be much more quicker than listed.
forking a perl takes about 4 MB memory while forking a simple c program can be ignored (yes still some overhead).
agree that c cgi should simple.
price for php and mod_perl is that you end up with a much larger httpd file which needs more resources to run - no free lunch as it says. so the system can be really slow when/before it establishes its httpd process pools, and when there are a lot of users so new httpd processes need to be created.
麻辣 回复于:2003-10-20 01:47:45无意中发现这个帖子,我也测试了一下,和上面的结果完全不同
理论归理论,还是多实测,不同的代码不同的环境可能有不同的测试结果。
我的测试结果完全相反(在windows环境)perl普通状态(没有mod_perl)下不但不慢,还比PHP要快
测试完成相同加法运算,循环1000000次(如果您的机器配置比较底,可以减少循环次数)
雷鸟2000+ 256兆内存,考虑到加上编译时间,做了两个脚本:
######perl.cgi#########
#!/usr/bin/perl
use Benchmark;
$TT0 = new Benchmark;
do "test.cgi";#用DO命令调用test.cgi脚本来计算总时间
exit;
刚给一个朋友解决他写的Discuz!插件的问题,说到MySQL的COUNT(*)的效率,发现越说越说不清楚,干脆写下来,分享给大家。
COUNT(*)与COUNT(COL)
网上搜索了下,发现各种说法都有:
比如认为COUNT(COL)比COUNT(*)快的;
认为COUNT(*)比COUNT(COL)快的;
还有朋友很搞笑的说到这个其实是看人品的。
在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;
但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多;
具体的数据参考如下:
mysql> SELECT COUNT(*) FROM cdb_posts where fid = 604;
+————+
| COUNT(fid) |
+————+
| 79000 |
+————+
1 row in set (0.03 sec)
mysql> SELECT COUNT(tid) FROM cdb_posts where fid = 604;
+————+
| COUNT(tid) |
+————+
| 79000 |
+————+
1 row in set (0.33 sec)
mysql> SELECT COUNT(pid) FROM cdb_posts where fid = 604;
+————+
| COUNT(pid) |
+————+
| 79000 |
+————+
1 row in set (0.33 sec)
COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数。还有有区别的。
COUNT时的WHERE
这点以前就写过,详细请看《Mysql中count(*),DISTINCT的使用方法和效率研究》:http://www.ccvita.com/156.html
简单说下,就是COUNT的时候,如果没有WHERE限制的话,MySQL直接返回保存有总的行数
而在有WHERE限制的情况下,总是需要对MySQL进行全表遍历。
优化总结:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现。
COUNT(*)与COUNT(COL)
网上搜索了下,发现各种说法都有:
比如认为COUNT(COL)比COUNT(*)快的;
认为COUNT(*)比COUNT(COL)快的;
还有朋友很搞笑的说到这个其实是看人品的。
在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;
但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多;
具体的数据参考如下:
mysql> SELECT COUNT(*) FROM cdb_posts where fid = 604;
+————+
| COUNT(fid) |
+————+
| 79000 |
+————+
1 row in set (0.03 sec)
mysql> SELECT COUNT(tid) FROM cdb_posts where fid = 604;
+————+
| COUNT(tid) |
+————+
| 79000 |
+————+
1 row in set (0.33 sec)
mysql> SELECT COUNT(pid) FROM cdb_posts where fid = 604;
+————+
| COUNT(pid) |
+————+
| 79000 |
+————+
1 row in set (0.33 sec)
COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数。还有有区别的。
COUNT时的WHERE
这点以前就写过,详细请看《Mysql中count(*),DISTINCT的使用方法和效率研究》:http://www.ccvita.com/156.html
简单说下,就是COUNT的时候,如果没有WHERE限制的话,MySQL直接返回保存有总的行数
而在有WHERE限制的情况下,总是需要对MySQL进行全表遍历。
优化总结:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现。
VB 最简单实现摄像头监控(带源代码)
以前发现控制摄像头都是以大堆代码 ! 今天写了个很少的代码 送给大家
测试成功 ! 窗体代码自己看我的截图自己添加 ! 这个都不会就不要学VB 了
以前发现控制摄像头都是以大堆代码 ! 今天写了个很少的代码 送给大家
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private Const GET_FRAME As Long = 1084
Private Const COPY As Long = 1054
Private Const CONNECT As Long = 1034
Private Const DISCONNECT As Long = 1035
Private CapHwnd As Long
Private Sub Command1_Click()
'打开摄像头
CapHwnd = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, 640, 480, Me.hwnd, 0)
DoEvents
SendMessage CapHwnd, CONNECT, 0, 0
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
'停止摄像头
DoEvents
SendMessage CapHwnd, DISCONNECT, 0, 0
Timer1.Enabled = False
End Sub
Private Sub Form_Load()
'几句代码实现控制摄像头,有摄像头的进哦
Combo1.AddItem "160*120"
Combo1.AddItem "176*144"
Combo1.AddItem "320*240"
Combo1.AddItem "352*288"
Combo1.AddItem "640*480"
Combo1.ListIndex = 0
End Sub
Private Sub Timer1_Timer() 'timer1.Interval=50
On Error Resume Next
SendMessage CapHwnd, GET_FRAME, 0, 0
SendMessage CapHwnd, COPY, 0, 0
Picture1.Picture = Clipboard.GetData
Clipboard.Clear
End Sub
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private Const GET_FRAME As Long = 1084
Private Const COPY As Long = 1054
Private Const CONNECT As Long = 1034
Private Const DISCONNECT As Long = 1035
Private CapHwnd As Long
Private Sub Command1_Click()
'打开摄像头
CapHwnd = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, 640, 480, Me.hwnd, 0)
DoEvents
SendMessage CapHwnd, CONNECT, 0, 0
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
'停止摄像头
DoEvents
SendMessage CapHwnd, DISCONNECT, 0, 0
Timer1.Enabled = False
End Sub
Private Sub Form_Load()
'几句代码实现控制摄像头,有摄像头的进哦
Combo1.AddItem "160*120"
Combo1.AddItem "176*144"
Combo1.AddItem "320*240"
Combo1.AddItem "352*288"
Combo1.AddItem "640*480"
Combo1.ListIndex = 0
End Sub
Private Sub Timer1_Timer() 'timer1.Interval=50
On Error Resume Next
SendMessage CapHwnd, GET_FRAME, 0, 0
SendMessage CapHwnd, COPY, 0, 0
Picture1.Picture = Clipboard.GetData
Clipboard.Clear
End Sub
测试成功 ! 窗体代码自己看我的截图自己添加 ! 这个都不会就不要学VB 了
1.安装mysql,
2.安装MyODBC-standard-3.51.07-win.msi
3:vb连接语句是:
Public strcnn As StringPublic sql As String
Public conn As New ADODB.Connection
Public rs As New ADODB.Recordset
Sub link()
strcnn = "driver={MySQL ODBC 3.51 Driver};server=localhost;database=data;uid=root;pwd=zjb"conn.Open strcnn
End Sub
错误MySQL 返回: #1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
出现这种问题也只有在MYSQL4.1.x以上版本,用4.0.x就没问题了。
原因是因为使用的mysql服务器版本中使用了新的密码验证机制,这需要客户端的版本要在4.0以上,原来的密码函数被改为old_password ();,这样使用password()生成的密码在旧的版本上的客户端就不好使了,而PHP中的MYSQL客户端都是3.23的(当然,mysqli的扩展除外),问题就在这了。
1、进入命令行下,转到MYSQL目录的BIN目录下,进入MYSQL命令行模式:
例:d:\mysql\bin>mysql -uroot -p123 用户root,密码123)
2、输入命令:mysql>set password for 'root'@'localhost'=old_password('123'); (注意冒号不能少)
3、退入MYSQL命令行:mysql>q
ok
VB程序访问服务器上一个mysql的库
先在本机上安装最新的ODBC CONNECTER/mysql
无需设置ODBC,就可以使用.
注意MYSQL的帐户登录是根据主机的,设置好MYSQL的帐户后再做测试.
测试代码:
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim sql As String
'connect to MySQL server using MySQL ODBC 3.51 Driver
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
& "SERVER=192.168.0.1;" _
& " DATABASE=db_name;" _
& "UID=username;PWD=password; OPTION=3"
conn.Open
'create table
conn.Execute "DROP TABLE IF EXISTS my_ado"
conn.E
ODBC加载.
vb中添加一个Adodc的控件.
Public Function conn() As String
conn = "Provider=SQLOLEDB.1;Password=数据库管理密码;Persist Security Info=True;User ID=数据库管理帐号;Initial Catalog=数据库名;Data Source=计算机名"
End Function
Dim rs As New ADODB.Recordset
Dim con As New ADODB.Connection
Dim sql As String
Set con = CreateObject("ADODB.Connection")
con.Open conn
sql = "select * from Admin where username='" & username.Text & "' and password='" & password.Text & "'"
rs.Open sql, con, 1, 1
ODBC加载.
vb中添加一个Adodc的控件.
conn = "Provider=SQLOLEDB.1;Password=数据库管理密码;Persist Security Info=True;User ID=用户名;Initial Catalog=数据库名;Data Source=计算机服务器名称"
Dim rs As New ADODB.Recordset
Dim con As New ADODB.Connection
Dim sql As String
Set con = CreateObject("ADODB.Connection")
con.Open conn
注:不管用什么方法都要有MySql驱动!!!
2.安装MyODBC-standard-3.51.07-win.msi
3:vb连接语句是:
Public strcnn As StringPublic sql As String
Public conn As New ADODB.Connection
Public rs As New ADODB.Recordset
Sub link()
strcnn = "driver={MySQL ODBC 3.51 Driver};server=localhost;database=data;uid=root;pwd=zjb"conn.Open strcnn
End Sub
错误MySQL 返回: #1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
出现这种问题也只有在MYSQL4.1.x以上版本,用4.0.x就没问题了。
原因是因为使用的mysql服务器版本中使用了新的密码验证机制,这需要客户端的版本要在4.0以上,原来的密码函数被改为old_password ();,这样使用password()生成的密码在旧的版本上的客户端就不好使了,而PHP中的MYSQL客户端都是3.23的(当然,mysqli的扩展除外),问题就在这了。
1、进入命令行下,转到MYSQL目录的BIN目录下,进入MYSQL命令行模式:
例:d:\mysql\bin>mysql -uroot -p123 用户root,密码123)
2、输入命令:mysql>set password for 'root'@'localhost'=old_password('123'); (注意冒号不能少)
3、退入MYSQL命令行:mysql>q
ok
VB程序访问服务器上一个mysql的库
先在本机上安装最新的ODBC CONNECTER/mysql
无需设置ODBC,就可以使用.
注意MYSQL的帐户登录是根据主机的,设置好MYSQL的帐户后再做测试.
测试代码:
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim sql As String
'connect to MySQL server using MySQL ODBC 3.51 Driver
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
& "SERVER=192.168.0.1;" _
& " DATABASE=db_name;" _
& "UID=username;PWD=password; OPTION=3"
conn.Open
'create table
conn.Execute "DROP TABLE IF EXISTS my_ado"
conn.E
ODBC加载.
vb中添加一个Adodc的控件.
Public Function conn() As String
conn = "Provider=SQLOLEDB.1;Password=数据库管理密码;Persist Security Info=True;User ID=数据库管理帐号;Initial Catalog=数据库名;Data Source=计算机名"
End Function
Dim rs As New ADODB.Recordset
Dim con As New ADODB.Connection
Dim sql As String
Set con = CreateObject("ADODB.Connection")
con.Open conn
sql = "select * from Admin where username='" & username.Text & "' and password='" & password.Text & "'"
rs.Open sql, con, 1, 1
ODBC加载.
vb中添加一个Adodc的控件.
conn = "Provider=SQLOLEDB.1;Password=数据库管理密码;Persist Security Info=True;User ID=用户名;Initial Catalog=数据库名;Data Source=计算机服务器名称"
Dim rs As New ADODB.Recordset
Dim con As New ADODB.Connection
Dim sql As String
Set con = CreateObject("ADODB.Connection")
con.Open conn
注:不管用什么方法都要有MySql驱动!!!
笔记本电脑上插无线网卡用的.可以解决非迅驰机型的上网问题
微型的PCI插槽。它也同样是在PCI的基础上发展起来的,最初是应用于笔记本,现在不少台式机也配备了Mini PCI插槽。Mini PCI的定义与PCI基本上一致,只是在外型上进行了微缩。目前使用Mini PCI插槽的主要有内置的无线网卡、Modem+网卡、电视卡以及一些多功能扩展卡等硬件设备。
微型的PCI插槽。它也同样是在PCI的基础上发展起来的,最初是应用于笔记本,现在不少台式机也配备了Mini PCI插槽。Mini PCI的定义与PCI基本上一致,只是在外型上进行了微缩。目前使用Mini PCI插槽的主要有内置的无线网卡、Modem+网卡、电视卡以及一些多功能扩展卡等硬件设备。
熵变
1. 熵:体系混乱度(或无序度)的量度。S 表示熵
2. 热力学第三定律:对于纯物质的晶体,在热力学零度时,熵为零。
3. 标准熵:1 mol物质在标准状态下所计算出的 标准熵值,用ST q表示,单位: J•mol-1 •K-1
4. 熵的规律:
(1) 同一物质,气态熵大于液态熵,液态熵大于固态熵; ST q(g) > ST q(l) > ST q(s)
S q H2O (g) > H2O (l) > H2O (s)
(2) 相同原子组成的分子中,分子中原子数目越多,熵值越大;
S q O2 (g) < S q O3 (g)
S q NO (g) < S q NO2 (g) < S q N2O4 (g)
S q CH2=CH2 (g) < S q CH3-CH3 (g)
(3) 相同元素的原子组成的分子中,分子量越大,熵值越大;
S q CH3Cl(g) < S q CH2Cl2 (g) < S q CHCl3(g)
(4) 同一类物质,摩尔质量越大,结构越复杂,熵值越大;
S qCuSO4(s) < S qCuSO4•H2O(s) < SqCuSO4•3H2O(s) < SqCuSO4•5H2O (s)
S qF2(g) < S qCl2(g) < S qBr2(g) < SqI2 (g)
(5) 固体或液体溶于水时,熵值增大,气体溶于水时,熵值减少;
5. 反应熵变的计算公式
一般地,对于反应:m A + n B =x C + y D
DrSmq = åSq,(生成物) - åSq,(反应物)
= [x Sq,C + y Sq,D] – [m Sq,A + n Sq,B]
6.热力学第二定律:
孤立体系(绝热体系)的自发过程是体系熵增加的过程,即:
状态I ® 状态II, SII > SI DS = SII - SI > 0
DS > 0,过程自发进行;
DS < 0,逆过程自发进行;
DS = 0,平衡状态
1. 熵:体系混乱度(或无序度)的量度。S 表示熵
2. 热力学第三定律:对于纯物质的晶体,在热力学零度时,熵为零。
3. 标准熵:1 mol物质在标准状态下所计算出的 标准熵值,用ST q表示,单位: J•mol-1 •K-1
4. 熵的规律:
(1) 同一物质,气态熵大于液态熵,液态熵大于固态熵; ST q(g) > ST q(l) > ST q(s)
S q H2O (g) > H2O (l) > H2O (s)
(2) 相同原子组成的分子中,分子中原子数目越多,熵值越大;
S q O2 (g) < S q O3 (g)
S q NO (g) < S q NO2 (g) < S q N2O4 (g)
S q CH2=CH2 (g) < S q CH3-CH3 (g)
(3) 相同元素的原子组成的分子中,分子量越大,熵值越大;
S q CH3Cl(g) < S q CH2Cl2 (g) < S q CHCl3(g)
(4) 同一类物质,摩尔质量越大,结构越复杂,熵值越大;
S qCuSO4(s) < S qCuSO4•H2O(s) < SqCuSO4•3H2O(s) < SqCuSO4•5H2O (s)
S qF2(g) < S qCl2(g) < S qBr2(g) < SqI2 (g)
(5) 固体或液体溶于水时,熵值增大,气体溶于水时,熵值减少;
5. 反应熵变的计算公式
一般地,对于反应:m A + n B =x C + y D
DrSmq = åSq,(生成物) - åSq,(反应物)
= [x Sq,C + y Sq,D] – [m Sq,A + n Sq,B]
6.热力学第二定律:
孤立体系(绝热体系)的自发过程是体系熵增加的过程,即:
状态I ® 状态II, SII > SI DS = SII - SI > 0
DS > 0,过程自发进行;
DS < 0,逆过程自发进行;
DS = 0,平衡状态