D:\Windows动态链接库;D:\Dev-Cpp\mingw32\bin;D:\Qt\4.2.1\bin
byte------表示段的开始地址为字节地址
word-----表示段的开始地址为字地址,也就是从2、4、6字节地址开始dword----
bit-表示位
1word=2bytes
1byte=8bits
1K=1024B
1M=1024K
1G=1024M
byte是字节,bit是位
1个字节等于8个位
一个汉字占两个字节。
bit,通常指一个二进制位,
byte,通常包含8bit,
word,与系统硬件(总线、cpu命令字位数等)有关,如数据总线为16位,则1word为2byte。32位 1word为4byte。
存储容量通常用byte表示,因为与系统硬件无关。
word 字
byte 字节
bit 位
1word=2byte
1byte=8bit
如果总容量是32Mbit,总线是16位宽的.如果按8位用,容量是不是可以说成是4M字节?如果按16位用,是不是可以说是2M字节? 和字word如何换算? 请各位指导指导,谢谢!
word-----表示段的开始地址为字地址,也就是从2、4、6字节地址开始dword----
bit-表示位
1word=2bytes
1byte=8bits
1K=1024B
1M=1024K
1G=1024M
byte是字节,bit是位
1个字节等于8个位
一个汉字占两个字节。
bit,通常指一个二进制位,
byte,通常包含8bit,
word,与系统硬件(总线、cpu命令字位数等)有关,如数据总线为16位,则1word为2byte。32位 1word为4byte。
存储容量通常用byte表示,因为与系统硬件无关。
word 字
byte 字节
bit 位
1word=2byte
1byte=8bit
如果总容量是32Mbit,总线是16位宽的.如果按8位用,容量是不是可以说成是4M字节?如果按16位用,是不是可以说是2M字节? 和字word如何换算? 请各位指导指导,谢谢!
NoSQL的火热让人们似乎看到关系型数据库即将崩溃一样,不过在数据库领域有着Oracle和IBM这样的“房地产开发商”,他们是不希望关系型数据库如同现在的中国房价一样出现“拐点”的。在WEB领域,NoSQL已经开始在Digg和Reddit这样的大网站投入实战。
---
Apache Cassandra正式获商业支持 NoSQL或将实现跨越式发展
很多人队nosql有不同的看法,下面是从csdn上摘抄的评论,很有意思:
SQL造成的一个不合理的现象就是,催生了一个DBA职业,而且令人震惊的是,DBA的收入竟然比开发者还要高!
C++造成的一个奇怪的现象就是,造就了一大批意淫奇技淫巧的人,而且令人震惊的是,这些人竟然以这些歪门邪道来彰显自己比别人厉害!
支持NoSQL,,我认为,SQL和C++是当今社会两大毒瘤!必须予以清除!
一个开发者如果连NoSQL都不会用或者用不好,那他就该马上转行。
一个开发者如果脱离了实际而沉浸于C++的奇技淫巧,那他 就应该立马滚蛋
NoSQL当然能解决所有SQL能解决的问题,这点常识都没有。就像C语言能解决C++语言所有到问题,汇编语言能解决所有高级语言的问题一样!@
一直穿衣服,明天开始都不穿了,可能吗?世界再变,技术再高,都是基于需求的。大众的,才是真正胜利的
SQL最初目标就是用人类自然语言查询方式来查询数据,让使用数据库的人能快速上手,不需要懂得程序开发,但是现在来看SQL本身居然比编程语言更复杂,培养一个精通SQL的人比培养一个程序员代价要大的多,现在的SQL完全是本末倒置,那索性就让程序语言来完成数据查询算了。
楼主此言差矣!
从机器硬件层面上来讲,功能最强劲的,当然是二进制码,难道因此就不需要高级语言,而是使用二进制码吗?当然不是.
二进制码虽然可以使用硬件提供的所有功能,但它并不适合用于软件工程当中,因为根本没办法维护.之所以由汇编发展出C,由C发展出C++,原因也在于此.
很多人很不懂得珍惜,C/C++还没有好好发展,就这样看不起、甚至想丢弃。。。很是悲哀!
用粗俗的眼光当然看不出C语言适合做ERP。今天的C,可以动态编译,可以与脚本语言结合,所能够便利、快捷、高效的处理很多事情,超乎很多人的想象!
不要认为一项技术就能代替另一项技术,技术的选择是要看当时的场景的,而不是一味的追求这样那样的技术,这个社会本来就应该百家争鸣,百花齐放,SQL是毒瘤,NoSQL能解决所有SQL能解决的问题吗!?
楼主!任何新东西出来都是在早些时候的东西上演变或者发展而来的,在现在各种高级语言盛行的时代,我相信没有那个程序员能否认C/C++或者VB等(中)低级语言曾经的辉煌,出新是任何事物发展的必然趋势。NoSQL也需要一段时期的考验和磨砺,我们不否认它的优势,但是也不会认为他会完全代替SQL,我们都是“玩”高科技的,要用理智的头脑去考虑问题、看待事物!
NoSQL还是有不少问题的。 事务能力,数据的一致性,没有类似SQL这样方便的操作语言,性能差等等。
NoSQL的优势是分布式,保存对象简单。
我认为NoSQL在一些项目上会有些优势。 但大部分项目还是SQL更加合适。
SQL对于海量数据有些问题。能够处理海量数据的数据库和计算机非常贵。
面临分布式海量数据时,可能NoSQL有些优势。 数据库集群总是很麻烦,很多东西不能用。即使能用也会造成性能的大幅下降。
但这些问题只有少数大公司需要经常面对。
---
Apache Cassandra正式获商业支持 NoSQL或将实现跨越式发展
很多人队nosql有不同的看法,下面是从csdn上摘抄的评论,很有意思:
SQL造成的一个不合理的现象就是,催生了一个DBA职业,而且令人震惊的是,DBA的收入竟然比开发者还要高!
C++造成的一个奇怪的现象就是,造就了一大批意淫奇技淫巧的人,而且令人震惊的是,这些人竟然以这些歪门邪道来彰显自己比别人厉害!
支持NoSQL,,我认为,SQL和C++是当今社会两大毒瘤!必须予以清除!
一个开发者如果连NoSQL都不会用或者用不好,那他就该马上转行。
一个开发者如果脱离了实际而沉浸于C++的奇技淫巧,那他 就应该立马滚蛋
NoSQL当然能解决所有SQL能解决的问题,这点常识都没有。就像C语言能解决C++语言所有到问题,汇编语言能解决所有高级语言的问题一样!@
一直穿衣服,明天开始都不穿了,可能吗?世界再变,技术再高,都是基于需求的。大众的,才是真正胜利的
SQL最初目标就是用人类自然语言查询方式来查询数据,让使用数据库的人能快速上手,不需要懂得程序开发,但是现在来看SQL本身居然比编程语言更复杂,培养一个精通SQL的人比培养一个程序员代价要大的多,现在的SQL完全是本末倒置,那索性就让程序语言来完成数据查询算了。
楼主此言差矣!
从机器硬件层面上来讲,功能最强劲的,当然是二进制码,难道因此就不需要高级语言,而是使用二进制码吗?当然不是.
二进制码虽然可以使用硬件提供的所有功能,但它并不适合用于软件工程当中,因为根本没办法维护.之所以由汇编发展出C,由C发展出C++,原因也在于此.
很多人很不懂得珍惜,C/C++还没有好好发展,就这样看不起、甚至想丢弃。。。很是悲哀!
用粗俗的眼光当然看不出C语言适合做ERP。今天的C,可以动态编译,可以与脚本语言结合,所能够便利、快捷、高效的处理很多事情,超乎很多人的想象!
不要认为一项技术就能代替另一项技术,技术的选择是要看当时的场景的,而不是一味的追求这样那样的技术,这个社会本来就应该百家争鸣,百花齐放,SQL是毒瘤,NoSQL能解决所有SQL能解决的问题吗!?
楼主!任何新东西出来都是在早些时候的东西上演变或者发展而来的,在现在各种高级语言盛行的时代,我相信没有那个程序员能否认C/C++或者VB等(中)低级语言曾经的辉煌,出新是任何事物发展的必然趋势。NoSQL也需要一段时期的考验和磨砺,我们不否认它的优势,但是也不会认为他会完全代替SQL,我们都是“玩”高科技的,要用理智的头脑去考虑问题、看待事物!
NoSQL还是有不少问题的。 事务能力,数据的一致性,没有类似SQL这样方便的操作语言,性能差等等。
NoSQL的优势是分布式,保存对象简单。
我认为NoSQL在一些项目上会有些优势。 但大部分项目还是SQL更加合适。
SQL对于海量数据有些问题。能够处理海量数据的数据库和计算机非常贵。
面临分布式海量数据时,可能NoSQL有些优势。 数据库集群总是很麻烦,很多东西不能用。即使能用也会造成性能的大幅下降。
但这些问题只有少数大公司需要经常面对。
◆Flash会耗尽移动设备的电池;
◆不太适合多触控操作;
◆其性能、可靠性和安全性都不好。
◆此外,Flash还是一个专用系统,由Adobe独立把持。
◆网络标准应该是开放的,就像 HTML5、CSS和JavaScript那样。虽然乔布斯承认苹果的手机操作系统也是专用系统。
◆最重要的是,苹果不希望“一个第三方软件层介入平台和开发者之间”。
◆不太适合多触控操作;
◆其性能、可靠性和安全性都不好。
◆此外,Flash还是一个专用系统,由Adobe独立把持。
◆网络标准应该是开放的,就像 HTML5、CSS和JavaScript那样。虽然乔布斯承认苹果的手机操作系统也是专用系统。
◆最重要的是,苹果不希望“一个第三方软件层介入平台和开发者之间”。
<?php
/**
* 使用共享内存的PHP循环内存队列实现
* 支持多进程, 支持各种数据类型的存储
* 注: 完成入队或出队操作,尽快使用unset(), 以释放临界区
*
* @author wangbinandi@gmail.com
* @created 2009-12-23
*/
class SHMQueue
{
private $maxQSize = 0; // 队列最大长度
private $front = 0; // 队头指针
private $rear = 0; // 队尾指针
private $blockSize = 256; // 块的大小(byte)
private $memSize = 25600; // 最大共享内存(byte)
private $shmId = 0;
private $filePtr = './shmq.ptr';
private $semId = 0;
public function __construct()
{
$shmkey = ftok(__FILE__, 't');
$this->shmId = shmop_open($shmkey, "c", 0644, $this->memSize );
$this->maxQSize = $this->memSize / $this->blockSize;
// 申請一个信号量
$this->semId = sem_get($shmkey, 1);
sem_acquire($this->semId); // 申请进入临界区
$this->init();
}
private function init()
{
if ( file_exists($this->filePtr) ){
$contents = file_get_contents($this->filePtr);
$data = explode( '|', $contents );
if ( isset($data[0]) && isset($data[1])){
$this->front = (int)$data[0];
$this->rear = (int)$data[1];
}
}
}
public function getLength()
{
return (($this->rear - $this->front + $this->memSize) % ($this->memSize) )/$this->blockSize;
}
public function enQueue( $value )
{
if ( $this->ptrInc($this->rear) == $this->front ){ // 队满
return false;
}
$data = $this->encode($value);
shmop_write($this->shmId, $data, $this->rear );
$this->rear = $this->ptrInc($this->rear);
return true;
}
public function deQueue()
{
if ( $this->front == $this->rear ){ // 队空
return false;
}
$value = shmop_read($this->shmId, $this->front, $this->blockSize-1);
$this->front = $this->ptrInc($this->front);
return $this->decode($value);
}
private function ptrInc( $ptr )
{
return ($ptr + $this->blockSize) % ($this->memSize);
}
private function encode( $value )
{
$data = serialize($value) . "__eof";
if ( strlen($data) > $this->blockSize -1 ){
throw new Exception(strlen($data)." is overload block size!");
}
return $data;
}
private function decode( $value )
{
$data = explode("__eof", $value);
return unserialize($data[0]);
}
public function __destruct()
{
$data = $this->front . '|' . $this->rear;
file_put_contents($this->filePtr, $data);
sem_release($this->semId); // 出临界区, 释放信号量
}
}
/**
* 使用共享内存的PHP循环内存队列实现
* 支持多进程, 支持各种数据类型的存储
* 注: 完成入队或出队操作,尽快使用unset(), 以释放临界区
*
* @author wangbinandi@gmail.com
* @created 2009-12-23
*/
class SHMQueue
{
private $maxQSize = 0; // 队列最大长度
private $front = 0; // 队头指针
private $rear = 0; // 队尾指针
private $blockSize = 256; // 块的大小(byte)
private $memSize = 25600; // 最大共享内存(byte)
private $shmId = 0;
private $filePtr = './shmq.ptr';
private $semId = 0;
public function __construct()
{
$shmkey = ftok(__FILE__, 't');
$this->shmId = shmop_open($shmkey, "c", 0644, $this->memSize );
$this->maxQSize = $this->memSize / $this->blockSize;
// 申請一个信号量
$this->semId = sem_get($shmkey, 1);
sem_acquire($this->semId); // 申请进入临界区
$this->init();
}
private function init()
{
if ( file_exists($this->filePtr) ){
$contents = file_get_contents($this->filePtr);
$data = explode( '|', $contents );
if ( isset($data[0]) && isset($data[1])){
$this->front = (int)$data[0];
$this->rear = (int)$data[1];
}
}
}
public function getLength()
{
return (($this->rear - $this->front + $this->memSize) % ($this->memSize) )/$this->blockSize;
}
public function enQueue( $value )
{
if ( $this->ptrInc($this->rear) == $this->front ){ // 队满
return false;
}
$data = $this->encode($value);
shmop_write($this->shmId, $data, $this->rear );
$this->rear = $this->ptrInc($this->rear);
return true;
}
public function deQueue()
{
if ( $this->front == $this->rear ){ // 队空
return false;
}
$value = shmop_read($this->shmId, $this->front, $this->blockSize-1);
$this->front = $this->ptrInc($this->front);
return $this->decode($value);
}
private function ptrInc( $ptr )
{
return ($ptr + $this->blockSize) % ($this->memSize);
}
private function encode( $value )
{
$data = serialize($value) . "__eof";
if ( strlen($data) > $this->blockSize -1 ){
throw new Exception(strlen($data)." is overload block size!");
}
return $data;
}
private function decode( $value )
{
$data = explode("__eof", $value);
return unserialize($data[0]);
}
public function __destruct()
{
$data = $this->front . '|' . $this->rear;
file_put_contents($this->filePtr, $data);
sem_release($this->semId); // 出临界区, 释放信号量
}
}
使用的样例代码如下:
// 进队操作
$shmq = new SHMQueue();
$data = 'test data';
$shmq->enQueue($data);
unset($shmq);
// 出队操作
$shmq = new SHMQueue();
$data = $shmq->deQueue();
unset($shmq);
$data = 'test data';
$shmq->enQueue($data);
unset($shmq);
// 出队操作
$shmq = new SHMQueue();
$data = $shmq->deQueue();
unset($shmq);
来源:http://blog.csdn.net/ChaoticLife/archive/2009/12/23/5064172.aspx
总体计划,读一本微观经济学入门书籍,一本金融学入门书籍,一本会计学中级书籍,一本历史书。
目前的读书书目有:
《经济学原理》作者 曼昆 豆瓣链接
《经济漫谈录》作者:历以宁 豆瓣链接
《财务会计 — 概念、方法与应用》 作者 豆瓣链接
《思考与回忆》 作者:俾斯麦 豆瓣链接
《佛罗伦萨史》作者:尼科洛·马基雅维里 豆瓣链接
链接:
http://www.qingran.net/2010/05/2010%e5%b9%b4%e8%af%bb%e4%b9%a6%e8%ae%a1%e5%88%92/
目前的读书书目有:
《经济学原理》作者 曼昆 豆瓣链接
《经济漫谈录》作者:历以宁 豆瓣链接
《财务会计 — 概念、方法与应用》 作者 豆瓣链接
《思考与回忆》 作者:俾斯麦 豆瓣链接
《佛罗伦萨史》作者:尼科洛·马基雅维里 豆瓣链接
链接:
http://www.qingran.net/2010/05/2010%e5%b9%b4%e8%af%bb%e4%b9%a6%e8%ae%a1%e5%88%92/
http://labs.adobe.com/downloads/flashplayer.html
Download Flash Player for Opera and Chromium based applications – PPAPI :
https://fpdownload.macromedia.com/pub/labs/flashruntimes/flashplayer/install_flash_player_ppapi.exe
IE6: 只要把flash所在层的z-index属性设为-1即可;
IE7和IE8: 再给flash的<object>对象增加一个"womde"参数,参数的值为"transparent"或"opaque"都行;
FF、Chrome、Opera: 在IE8的基础上再在<embed>标签内添加属性wmode="transparent"或wmode="opaque"。
完整的实例代码如下:
Download Flash Player for Opera and Chromium based applications – PPAPI :
https://fpdownload.macromedia.com/pub/labs/flashruntimes/flashplayer/install_flash_player_ppapi.exe
IE6: 只要把flash所在层的z-index属性设为-1即可;
IE7和IE8: 再给flash的<object>对象增加一个"womde"参数,参数的值为"transparent"或"opaque"都行;
FF、Chrome、Opera: 在IE8的基础上再在<embed>标签内添加属性wmode="transparent"或wmode="opaque"。
完整的实例代码如下:
<div style="z-index:-1;">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="900" height="150">
<param name="movie" value="i/banner.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent">
<embed src="i/banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="900" height="150" wmode="transparent"></embed>
</object>
</div>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="900" height="150">
<param name="movie" value="i/banner.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent">
<embed src="i/banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="900" height="150" wmode="transparent"></embed>
</object>
</div>
http://tiaozhanshu.net/flash-player-for-chrome.html
安装了新电脑:windows7 64的,想装个盗版的防范毒,windows7感觉还行,不要钱嘛,不错的,哈哈!
今天NOD32激活码之窗为大家带了一个小小的NOD32相关教程:那就是去除NOD32开机激活向导.这个方法很古老也很有效的哟.也许网上已经很多了.本站只是整理下.还是否请大家多多支持:大家可以将下面的代码另存为BAT批处理文件即可.请大家注意.双击运行即可.代码如下:
今天NOD32激活码之窗为大家带了一个小小的NOD32相关教程:那就是去除NOD32开机激活向导.这个方法很古老也很有效的哟.也许网上已经很多了.本站只是整理下.还是否请大家多多支持:大家可以将下面的代码另存为BAT批处理文件即可.请大家注意.双击运行即可.代码如下:
@ ECHO OFF
@ ECHO.
@ ECHO.
@ ECHO. 说 明
@ ECHO ———————————————————————–
@ ECHO 如果安装了NOD32激活版而没有激活,开机后激活程序会自动弹出,本批处理就
@ ECHO 是方便用户解决此问题。
@ ECHO http://www.nod32id.com
@ ECHO ———————————————————————–
PAUSE
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v essact /f
@ ECHO.
@ ECHO.
@ ECHO. 说 明
@ ECHO ———————————————————————–
@ ECHO 如果安装了NOD32激活版而没有激活,开机后激活程序会自动弹出,本批处理就
@ ECHO 是方便用户解决此问题。
@ ECHO http://www.nod32id.com
@ ECHO ———————————————————————–
PAUSE
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v essact /f
nsession.sql
===========================================================================
create table mysession(
session_key char(32) not null,
session_data text,
session_expiry int(11),
primary key(session_key)
);
===========================================================================
create table mysession(
session_key char(32) not null,
session_data text,
session_expiry int(11),
primary key(session_key)
);
session_inc.php
============================================================================
<?php
function mysession_open($save_path, $session_name)
{
//echo ''save_path ''.$save_path.''<br />'';
//echo ''session_name ''.$session_name.''<br />'';
@mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test") //选择数据库mydb
or die("数据库不存在或不可用");
return true;
}
function mysession_close()
{
return true;
}
function mysession_read($key)
{
//echo ''key ''.$key.''<br />'';
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time(); //获取Session失效时间
//执行SQL语句获得Session的值
$query = @mysql_query("select session_data from mysession "
."where session_key = ''$key'' and session_expiry > $expiry_time")
or die("SQL语句执行失败");
if($row = mysql_fetch_array($query))
return $row[''session_data''];
else
return false;
}
function mysession_write($key, $data)
{
//echo ''write: ''.$key.''<br />'';
//echo ''data ''.$data.''<br />'';
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time() + 5; //获取Session失效时间
//查询Session的键值是否已经存在
$query = @mysql_query("select session_data from mysession "
."where session_key = ''$key''")
or die("SQL语句执行失败");
//如果不存在,则执行插入操作,否则执行更新操作
if(mysql_numrows($query) == 0)
{
//执行SQL语句插入Session 的值
$query = @mysql_query("insert into mysession values(''$key'', ''$data'', $expiry_time)")
or die("SQL语句执行失败");
}
else
{
//执行 SQL语句更新Session的值
$query = @mysql_query("update mysession set "
."session_data = ''$data'', session_expiry = $expiry_time "
."where session_key = ''$key''")
or die("SQL语句执行失败");
}
return $query;
}
function mysession_destroy($key)
{
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_key = ''$key''")
or die("SQL语句执行失败");
return $query;
}
function mysession_gc($expiry_time)
{
// echo "gc called ";
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time();
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_expiry < $expiry_time")
or die("SQL语句执行失败");
return $query;
}
// $domain = '''';
//不使用 GET/POST 变量方式
ini_set(''session.use_trans_sid'', 0);
//设置垃圾回收最大生存时间
ini_set(''session.gc_maxlifetime'', 5);
//使用 COOKIE 保存 SESSION ID 的方式
//ini_set(''session.use_cookies'', 1);
//ini_set(''session.cookie_path'', ''/'');
//多主机共享保存 SESSION ID 的 COOKIE
//ini_set(''session.cookie_domain'', $domain);
//设置用户自定义Session存储
ini_set(''session.save_handler'', ''user'');
session_set_save_handler(''mysession_open'',
''mysession_close'',
''mysession_read'',
''mysession_write'',
''mysession_destroy'',
''mysession_gc'');
?>
function mysession_open($save_path, $session_name)
{
//echo ''save_path ''.$save_path.''<br />'';
//echo ''session_name ''.$session_name.''<br />'';
@mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test") //选择数据库mydb
or die("数据库不存在或不可用");
return true;
}
function mysession_close()
{
return true;
}
function mysession_read($key)
{
//echo ''key ''.$key.''<br />'';
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time(); //获取Session失效时间
//执行SQL语句获得Session的值
$query = @mysql_query("select session_data from mysession "
."where session_key = ''$key'' and session_expiry > $expiry_time")
or die("SQL语句执行失败");
if($row = mysql_fetch_array($query))
return $row[''session_data''];
else
return false;
}
function mysession_write($key, $data)
{
//echo ''write: ''.$key.''<br />'';
//echo ''data ''.$data.''<br />'';
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time() + 5; //获取Session失效时间
//查询Session的键值是否已经存在
$query = @mysql_query("select session_data from mysession "
."where session_key = ''$key''")
or die("SQL语句执行失败");
//如果不存在,则执行插入操作,否则执行更新操作
if(mysql_numrows($query) == 0)
{
//执行SQL语句插入Session 的值
$query = @mysql_query("insert into mysession values(''$key'', ''$data'', $expiry_time)")
or die("SQL语句执行失败");
}
else
{
//执行 SQL语句更新Session的值
$query = @mysql_query("update mysession set "
."session_data = ''$data'', session_expiry = $expiry_time "
."where session_key = ''$key''")
or die("SQL语句执行失败");
}
return $query;
}
function mysession_destroy($key)
{
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_key = ''$key''")
or die("SQL语句执行失败");
return $query;
}
function mysession_gc($expiry_time)
{
// echo "gc called ";
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time();
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_expiry < $expiry_time")
or die("SQL语句执行失败");
return $query;
}
// $domain = '''';
//不使用 GET/POST 变量方式
ini_set(''session.use_trans_sid'', 0);
//设置垃圾回收最大生存时间
ini_set(''session.gc_maxlifetime'', 5);
//使用 COOKIE 保存 SESSION ID 的方式
//ini_set(''session.use_cookies'', 1);
//ini_set(''session.cookie_path'', ''/'');
//多主机共享保存 SESSION ID 的 COOKIE
//ini_set(''session.cookie_domain'', $domain);
//设置用户自定义Session存储
ini_set(''session.save_handler'', ''user'');
session_set_save_handler(''mysession_open'',
''mysession_close'',
''mysession_read'',
''mysession_write'',
''mysession_destroy'',
''mysession_gc'');
?>
test.php
================================================================================
<?php
include(''session_inc.php''); //包含session_set_save_handler定义的文件
session_start();
$_SESSION[''passed''] = true;
echo $_SESSION[''passed''];
?>
include(''session_inc.php''); //包含session_set_save_handler定义的文件
session_start();
$_SESSION[''passed''] = true;
echo $_SESSION[''passed''];
?>
爱上游戏私服网,23yx.com
目前基本可用,但sess_gc没有被执行,不知为何。。。
sess_gc是按一定的概率被调用的。可以设置
session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1。详见 session.gc_divisor。
session.gc_divisor与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。
session.gc_divisor 默认为 100。
ini_set(''session.gc_probability'', 50);
ini_set(''session.gc_divisor'', 100);
ini_set(''session.gc_probability'', 50);
ini_set(''session.gc_divisor'', 100);
还发现PHP牛的一点,如果客户端禁用 cookie,只要
ini_set(''session.use_trans_sid'', 1);
它会自动把session id 附在链接后。Session 就可以正常使用了。来源:http://www.23yx.com/Article_View.asp?id=43
http://baike.baidu.com/view/1193094.htm?fr=ala0_1
Java中:
用了enctype="multipart/form-data"
就不能getParmeter了因为
他是一个特殊的标记啊
只能通过特殊的方法得到需要的数值啊
你的这种方法我没试过,我是用jspSmartUpload上传的,enctype="multipart/form-data"和 request.getParameter()确实不能同时使用,但这个组件提供了替代的方法:new SmartUpload().getRequest()返回一个Request类型对象,这个对象提供了替代的方法,有兴趣可以参考一下.
PHP:
评优系统用到了Excel表的上传:
<FORM METHOD="POST" ACTION="3231313.jsp" ENCTYPE="multipart/form-data">
<INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR>
<input type="SUBMIT" value="上传" />
</FORM>
代码解释:
ENCTYPE="multipart/form-data"用于表单里有图片上传。
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application /x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作:
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:
SmartUpload su = new SmartUpload();//新建一个SmartUpload对象
su.getRequest().getParameterValues();取数组值
su.getRequest().getParameter( );取单个参数单个值
原因:
一旦在网页post中加入了ENCTYPE="multipart/form-data"就是以二进制传输,而不加入就直接传输,php会自动根据这个bondary去做二进制的解析,而Java不会,所以,我们在上传图片的时候必须加入这个form-data,图片是以二进制形式上传的,所以,我们必须加入,否则就没法传到服务端去做解析。服务端就那么编写的,就这个原因,无它。
用了enctype="multipart/form-data"
就不能getParmeter了因为
他是一个特殊的标记啊
只能通过特殊的方法得到需要的数值啊
你的这种方法我没试过,我是用jspSmartUpload上传的,enctype="multipart/form-data"和 request.getParameter()确实不能同时使用,但这个组件提供了替代的方法:new SmartUpload().getRequest()返回一个Request类型对象,这个对象提供了替代的方法,有兴趣可以参考一下.
PHP:
评优系统用到了Excel表的上传:
<FORM METHOD="POST" ACTION="3231313.jsp" ENCTYPE="multipart/form-data">
<INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR>
<input type="SUBMIT" value="上传" />
</FORM>
代码解释:
ENCTYPE="multipart/form-data"用于表单里有图片上传。
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application /x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作:
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:
SmartUpload su = new SmartUpload();//新建一个SmartUpload对象
su.getRequest().getParameterValues();取数组值
su.getRequest().getParameter( );取单个参数单个值
原因:
一旦在网页post中加入了ENCTYPE="multipart/form-data"就是以二进制传输,而不加入就直接传输,php会自动根据这个bondary去做二进制的解析,而Java不会,所以,我们在上传图片的时候必须加入这个form-data,图片是以二进制形式上传的,所以,我们必须加入,否则就没法传到服务端去做解析。服务端就那么编写的,就这个原因,无它。
sshfs -p 36000 gastonwu@172.25.38.70:/home/gastonwu ~/dev70
samba服务mount方法:
mount -t smbfs -o username=peter,password=hello //192.168.7.123/ok
直接yum得了,安装麻烦啊:
[root@localhost fuse-2.7.4]# yum -y install sshfs
Loaded plugins: fastestmirror
Determining fastest mirrors
* addons: mirrors.163.com
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.163.com
addons | 951 B 00:00
base | 2.1 kB 00:00
extras | 2.1 kB 00:00
extras/primary_db | 180 kB 00:00
updates | 1.9 kB 00:00
updates/primary_db | 616 kB 00:00
Setting up Install Process
No package sshfs available.
Nothing to do
Loaded plugins: fastestmirror
Determining fastest mirrors
* addons: mirrors.163.com
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.163.com
addons | 951 B 00:00
base | 2.1 kB 00:00
extras | 2.1 kB 00:00
extras/primary_db | 180 kB 00:00
updates | 1.9 kB 00:00
updates/primary_db | 616 kB 00:00
Setting up Install Process
No package sshfs available.
Nothing to do
还是不行:接着弄
yum -y install kernel-devel
[root@localhost fuse-2.7.4]# ls -l /usr/src/kernels/
drwxr-xr-x 19 root root 4096 05-10 22:32 2.6.18-164.15.1.el5-i686
drwxr-xr-x 19 root root 4096 01-05 21:47 2.6.18-164.el5-i686
[root@localhost fuse-2.7.4]# ./configure --with-kernel=/usr/src/kernels/2.6.18-164.15.1.el5-i686;make;make install
[root@localhost fuse-2.7.4]# ls -l /usr/src/kernels/
drwxr-xr-x 19 root root 4096 05-10 22:32 2.6.18-164.15.1.el5-i686
drwxr-xr-x 19 root root 4096 01-05 21:47 2.6.18-164.el5-i686
[root@localhost fuse-2.7.4]# ./configure --with-kernel=/usr/src/kernels/2.6.18-164.15.1.el5-i686;make;make install
由于工作需要,需将一台windows2008主机硬盘挂载到一台CentOS主机上,网上查找资料经整理测试,步骤如下:
1、yum -y install sshfs //下载安装sshfs
2、mkdir /mnt/test //创建一个挂载点test
3、在windows2008主机上下载安装SSH工具(如F-Secure SSH Server)
4、在windows主机上开启SSH服务
5、sshfs administrator@192.168.1.112:/ /mnt/test //挂载远程主机(假设远程主机的用户名是administrator,之后提示输入密码时,输入windows密码)
6、cd /mnt/test //进入挂载目录
7、ls //查看目录文件
8、umount /mnt/test //卸载挂载目录
注意: sshfs是基于fuse模块的,如果在安装sshfs后无法运行,请下载编译这个模块(很多linux系统内核中基本都编译过了)
wget http://voxel.dl.sourceforge.net/sourceforge/fuse/fuse-2.7.4.tar.gz
tar zxpfv fuse-*.gz
cd fuse*
./configure
tar zxpfv fuse-*.gz
cd fuse*
./configure
参考:http://crazytoon.com/2008/10/07/sshfs-how-do-you-install-sshfs-and-fuse-centoslinuxredhat/
windows之外的世界比想像中要大得多呢,几乎天天都在用ssh,却到今天才知道有sshfs这个好东西,前几天还在为ZendStudio可以远程编辑文件欣喜,惭愧啊,终于有比vi scp://hostname//path/to/file更方便的方式了。
sshfs,就是可以把ssh连接到的主机资源,映射到本机的文件系统当中,然后用户可以像操作本地文件一样操作,而实际的文件改动将通过ssh传输到远程主机当中。类似于mount了一个windows共享目录,或者另外一台linux主机的samba共享,或者是nfs共享,只是“共享协议”变成了ssh通道罢了。
ubuntu源中已经包含了sshfs了,以及所需的fuse包,直接apt安装就可以了,一共是三个包:“fuse-utils libfuse2 sshfs”,不大,加起来才179k。安装的时候会自动创建用户组fuse,要使用sshfs的用户需要先加到这个用户组里才行(记得完成后还要重新登录),不然会没有权限执行fusermount:
fuse: failed to exec fusermount: Permission denied
使用就简单的多了,一般来说,连接远程主机到本地用户:
sshfs user@hostname:path mount_point
需要输密码就输密码,当然配置成自动登录的ssh更方便了。用完之后要umount,可以:
fusemount -u mount_point
都是在普通用户非sudo的环境下使用,非常方便的。如果想每次开机都自动挂载,可以在/etc/fstab中加入:
sshfs#user@hostname:path mount_point fuse defaults,auto,allow_other 0 0
这就要求必须先把ssh自动登录配置好了,让root用户能够使用user身份登录远程主机,另外allow_other这个参数很重要,没有这个参数的话,挂载过来的目录只有root能够访问。
关于自动挂载,参考文章中andot用脚本实现的方式也不错,建议大家看看去。
来源:http://www.fwolf.com/blog/post/329
//这位台湾的高手把GTK+, Qt, wxWidgets比较分析得相当到位。
GUI toolkit
先讲 GTK+
GTK+ 主要用在 X Window 上,整个设计的架构和许多概念和 MFC 以及一般 Windows 上
的程式开发大异其趣,入门门槛较高,而且最主要的特色是,他用不具有物件功能的纯
"C" 语言,模拟物件导向。 所以写起来比较复杂艰涩,而且充满大量巨集,使用和除错
都不是很容易,但优点则是可以用 C,不需 C++,如果和 Win32 SDK 比较,不会难学
多少,缺点是不易上手使用,而且文件比较缺,架构又非常复杂,且提供的东西比起其他
无所不包的 library,是简陋了一点,函数命名又臭又长。 对於简单的程式,GTK+ 会
显得太复杂,但是当你开始想扩充其他 library 也都没提供的进阶功能,就会开始赞叹
GTK+ 的架构严谨,还有超乎想像的高度弹性。 同样的东西要用 MFC 来做反而会要人命
并且多国语言的支援良好,内部也全面使用 UTF-8,相容性好,又是 unicode
能够习惯的话,GTK+ 值得推荐,但没有很建议学,毕竟不好学,要用到熟会需要比
较久,而且那样很多 C++ 的功能会用不到。 GTK+ 有 C++ 版本叫做 GTK--,没用过
但看文件觉得,并没有比 gtk+ 简单到哪里去。 因为 gtk+ 本来就是物件导向,所以
即使换了 c++ 语言,写起来架构还是差不多的。 另外,gtk+ 有 Windows 版本,但缺
点是,执行缓慢,不稳定,而且介面是使用 gtk+ 自己的,不是使用 Windows 内建的
"Native" 原生图形介面,看起来会不太习惯。 Mac OS X 下可用 X11 来执行 gtk+
但那样出来的程式是长得像 UNIX 程式,而不是美美的 OS X Aqua 外观
wxWidgets 和 MFC 最接近,命名习惯或架构都高度相似,会 MFC 几乎不用重新学习
有十余年历史,此外,他的物件封装比 MFC 要好,提供的功能也多上太多,又跨平台
一般知名的 MFC 程式都会选择用 wxWidgets 改写,来快速移植原程式到其他平台
例如 eMule 用 wxWidgets 移植出 aMule, xMule, 还在开发中的 Filezilla 3...等
而他最主要的特色是,他是"跨平台"的 "Native" GUI toolkit,在各种平台上都可写出
使用该平台内建 Native 原生图形介面的程式。 在 Windows 上就长得跟其他 Windows
程式一样,在 Linux 下就使用 gtk+ 的图形介面,在 Mac OS X 下就可以使用华丽的
Aqua 外观风格,这点是非常强悍。 不像 gtk+ 到其他系统都还是只能用 gtk+ 自己的
缺点是,中文支援在有些地方会出问题,例如剪贴簿的操作。 得自己 patch
但仍然相当推荐,即使是个庞大的 library,效能依旧不会太差,尤其在 Windows 上
执行速度并不输 MFC,与其学 MFC,不如学 wxWidgets。
Qt 的功能,应该是这三者加上 MFC 之中最强大的,文件也很完整,又有 RAD 工具
可以辅助开发,并且有商业公司做强力后盾。不但有 Windows/X Window/Mac 版本,
甚至还有嵌入式系统可用的版本,稳定性还不错,物件封装也算良好,资源比 GTK+ 或
wxWidgets 多得非常多,而且发行公司提供了相当多范例,算是一家以开放原始码成功
营利的模范公司。 知名的 KDE 整个是用他开发,证明了他的稳定性和强大功能。
缺点是如果你用他开发非 GPL 开放程式码的软体,必须以极昂贵的金额,购买商业
版本。 而他的图形介面并不完全是 "Native GUI",只是透过 theme 去模拟系统上的
标准 GUI,所以看起来很像,却会有些地方可以明显看出破绽。 执行速度缓慢还有过於
庞大则是另一个问题。 虽然封装得很良好文件也齐全,并不代表他就很容易学
还有一个严重问题是,他写的不是标准 C++,他使用的 signal/slot 机制必须透过 Qt
提供的 preprocessor 处理过才可以转送给编译器,这部份可能被限定用 qmake,算是
一个可惜的地方,不过瑕不掩瑜,还是很推荐。忘了说,他内部也是 unicode,
多国语言没问题。
以上三套只是简单介绍,其中 Qt 的程式我没有实际完整开发过,但明显的三套都远远比
只能在 Windows 上用,功能少 Bug 多难学难用几乎无多国语言支援的 MFC 要强。
三套可跨平台的 library 大家可自行选择,只能用在 Windows 的 MFC 就不用考虑了
wxWidgets 内带 wxodbc,可惜 wxd 目前并没有包装它。
总结:wxWidgets性能及ui最好,Qt最大最全,GTK+架构及扩展性最好
来源:http://pantherlover.blog.163.com/blog/static/502287092009266911868/
GUI toolkit
先讲 GTK+
GTK+ 主要用在 X Window 上,整个设计的架构和许多概念和 MFC 以及一般 Windows 上
的程式开发大异其趣,入门门槛较高,而且最主要的特色是,他用不具有物件功能的纯
"C" 语言,模拟物件导向。 所以写起来比较复杂艰涩,而且充满大量巨集,使用和除错
都不是很容易,但优点则是可以用 C,不需 C++,如果和 Win32 SDK 比较,不会难学
多少,缺点是不易上手使用,而且文件比较缺,架构又非常复杂,且提供的东西比起其他
无所不包的 library,是简陋了一点,函数命名又臭又长。 对於简单的程式,GTK+ 会
显得太复杂,但是当你开始想扩充其他 library 也都没提供的进阶功能,就会开始赞叹
GTK+ 的架构严谨,还有超乎想像的高度弹性。 同样的东西要用 MFC 来做反而会要人命
并且多国语言的支援良好,内部也全面使用 UTF-8,相容性好,又是 unicode
能够习惯的话,GTK+ 值得推荐,但没有很建议学,毕竟不好学,要用到熟会需要比
较久,而且那样很多 C++ 的功能会用不到。 GTK+ 有 C++ 版本叫做 GTK--,没用过
但看文件觉得,并没有比 gtk+ 简单到哪里去。 因为 gtk+ 本来就是物件导向,所以
即使换了 c++ 语言,写起来架构还是差不多的。 另外,gtk+ 有 Windows 版本,但缺
点是,执行缓慢,不稳定,而且介面是使用 gtk+ 自己的,不是使用 Windows 内建的
"Native" 原生图形介面,看起来会不太习惯。 Mac OS X 下可用 X11 来执行 gtk+
但那样出来的程式是长得像 UNIX 程式,而不是美美的 OS X Aqua 外观
wxWidgets 和 MFC 最接近,命名习惯或架构都高度相似,会 MFC 几乎不用重新学习
有十余年历史,此外,他的物件封装比 MFC 要好,提供的功能也多上太多,又跨平台
一般知名的 MFC 程式都会选择用 wxWidgets 改写,来快速移植原程式到其他平台
例如 eMule 用 wxWidgets 移植出 aMule, xMule, 还在开发中的 Filezilla 3...等
而他最主要的特色是,他是"跨平台"的 "Native" GUI toolkit,在各种平台上都可写出
使用该平台内建 Native 原生图形介面的程式。 在 Windows 上就长得跟其他 Windows
程式一样,在 Linux 下就使用 gtk+ 的图形介面,在 Mac OS X 下就可以使用华丽的
Aqua 外观风格,这点是非常强悍。 不像 gtk+ 到其他系统都还是只能用 gtk+ 自己的
缺点是,中文支援在有些地方会出问题,例如剪贴簿的操作。 得自己 patch
但仍然相当推荐,即使是个庞大的 library,效能依旧不会太差,尤其在 Windows 上
执行速度并不输 MFC,与其学 MFC,不如学 wxWidgets。
Qt 的功能,应该是这三者加上 MFC 之中最强大的,文件也很完整,又有 RAD 工具
可以辅助开发,并且有商业公司做强力后盾。不但有 Windows/X Window/Mac 版本,
甚至还有嵌入式系统可用的版本,稳定性还不错,物件封装也算良好,资源比 GTK+ 或
wxWidgets 多得非常多,而且发行公司提供了相当多范例,算是一家以开放原始码成功
营利的模范公司。 知名的 KDE 整个是用他开发,证明了他的稳定性和强大功能。
缺点是如果你用他开发非 GPL 开放程式码的软体,必须以极昂贵的金额,购买商业
版本。 而他的图形介面并不完全是 "Native GUI",只是透过 theme 去模拟系统上的
标准 GUI,所以看起来很像,却会有些地方可以明显看出破绽。 执行速度缓慢还有过於
庞大则是另一个问题。 虽然封装得很良好文件也齐全,并不代表他就很容易学
还有一个严重问题是,他写的不是标准 C++,他使用的 signal/slot 机制必须透过 Qt
提供的 preprocessor 处理过才可以转送给编译器,这部份可能被限定用 qmake,算是
一个可惜的地方,不过瑕不掩瑜,还是很推荐。忘了说,他内部也是 unicode,
多国语言没问题。
以上三套只是简单介绍,其中 Qt 的程式我没有实际完整开发过,但明显的三套都远远比
只能在 Windows 上用,功能少 Bug 多难学难用几乎无多国语言支援的 MFC 要强。
三套可跨平台的 library 大家可自行选择,只能用在 Windows 的 MFC 就不用考虑了
wxWidgets 内带 wxodbc,可惜 wxd 目前并没有包装它。
总结:wxWidgets性能及ui最好,Qt最大最全,GTK+架构及扩展性最好
来源:http://pantherlover.blog.163.com/blog/static/502287092009266911868/
在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 就是高亮显示相同变量
==================================================================
在firefox下使用js清空file控件的value非常简单, 即:obj.value=""; 就可以了,但在ie下,由于出于安全等方面考虑,file的value被设为了只读,所以js对其不能直接地控制,因此我们只能使用一些变通的方法来解决,网上对此也有好些方法,在此我谈谈自己认为最好的几种。
阅读全文
阅读全文