2012年7月 的存档

禁止页面缓存

2012年7月29日 没有评论

要想控制页面不缓存,无非是从过期时间、页面的最后更新时间以及Cache-Control来入手。只要在响应的header信息中正确设置了这些信息就能到达页面不缓存的目的。例如在php中通过header函数来设置页面不缓存:

header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); 
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); 
header( 'Cache-Control: no-store, no-cache, must-revalidate' ); 
header( 'Cache-Control: post-check=0, pre-check=0', FALSE ); 
header( 'Pragma: no-cache' );

说明:
Expires(过期时间)只要设置成一个过去的时间即可;

Last-Modified(页面最后更新时间)设置为当前时间,让浏览器获取最新的页面资料;

第一个Cache-Control,告诉浏览器不要缓存当前页面,针对HTTP 1.1 协议

第二个Cache-Control主要是针对古老的IE 5

Pragma: no-cache针对HTTP 1.0 协议告诉浏览器不要

php header 之 Set-Cookie

2012年7月29日 没有评论

php设置cookie可以使用setcookie函数或header函数。使用header方式时候需要注意字符串的顺序,如果顺序不对,可能会出现意想不到的问题。正确的顺序为

name=value; [expires=date; [path=path]; [domain=domainname]; [secure]]

例如:在netingcn.com下设置一个名为cookiename,值为cookieValue,过期时间为一年的cookie

header("Set-Cookie: cookiename=cookieValue; expires=" . gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT", time() + (86400 * 365)) .  '; path=/; domain=netingcn.com');

如果把domain、path放到expires前面,在firefox通过httpfox查看时,发现过期时间是“End Of Session”,但退出浏览器后重新打开,发现该cookie还是存在的,chrome显示的也是类似。虽说浏览器最终还是设置了一个一年过期的cookie,不过domain信息为当前页面的完整域,不是设置的顶级域。所以一定要注意顺序。

另外,如果用header的方式设置多个cookie,需要设置header的第二个参数为FALSE,下面是header函数的声明:

void header ( string string [, bool replace [, int http_response_code]] )

第二个参数replace 指明是替换掉前一条类似的标头还是增加一条相同类型的标头。默认为替换,但如果将其设为 FALSE 则可以强制发送多个同类标头。

分类: PHP 标签:

shell 字符串截取

2012年7月29日 没有评论

shell中截取字符串的方法有很多中,可以分为两大类。第一种获取特定的字符或字符串的左边或者右边的字字符串,java中实现需要先用indexOf来确定特定字符串的位置,然后再用substring来获取结果;第二种类似java中的substring。

第一种又可以分为四种情况,下面一一介绍。

1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#*substr,例如:

str='http://www.netingcn.com/cut-string.html'

echo ${str#*//}

得到的结果为www.netingcn.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符

2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##*substr,例如:

str='http://www.netingcn.com/cut-string.html'

echo ${str##*/}

得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符

3、使用 % 号操作符。用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为%substr*,例如:

str='http://www.netingcn.com/cut-string.html'

echo ${str%/*}

得到的结果为http://www.netingcn.com,即删除从右边开始到第一个"/"及其右边所有字符

4、使用 %% 号操作符。用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为%%substr*,例如:

str='http://www.netingcn.com/cut-string.html'

echo ${str%%/*}

得到的结果为http://www.netingcn.com,即删除从右边开始到最后一个"/"及其右边所有字符

第二种也分为四种,分别介绍如下:

1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:

str='http://www.netingcn.com/cut-string.html'

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

2、从左边第几个字符开始一直到结束,用法为:start,例如:

str='http://www.netingcn.com/cut-string.html'

echo ${var:7}

其中的 7 表示左边第8个字符开始
结果是:www.netingcn.com/cut-string.html

3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:

str='http://www.netingcn.com/cut-string.html'
echo ${str:0-15:10}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:cut-string

3、从右边第几个字符开始一直到结束,用法:0-start,例如:

str='http://www.netingcn.com/cut-string.html'
echo ${str:0-4}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:html

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

使用运算符 -= 的陷阱

2012年7月28日 没有评论

一般的编程语言中都提供了+=、-=这样的运算符,例如

var para = 1;
para = para + 4;
//等价于
para += 4;

//同样
para = para - 4;
//等价于
para -= 4;

我的编程习惯一直比较倾向后者,最近在写php代码时候发现了一个小陷阱,如下代码:

$cnt = 100;
$offset1 = 80;
$offset2 = 120;

$cnt -= $offset1 + $offset2;

我的原意是$cnt – $offset1 + $offset2,结果为140,但是真实的结果是-100。这也是典型运算符优先级导致的问题,原来 + 的优先级要高于 -=,所以自然结果就是-100了。经测试java、php、javascript、python都是这样。

使用 +=、-= 时如果超过两个操作数,一定要清楚到底在做什么,特别要注意运算符的优先级。

平时我是记不住那么多运算符的优先级顺序,在处理多个参数进行混合运算时都是祭出法宝,那就是使用括号来控制优先级。

分类: web前端 标签:

unable to load dynamic library memcached.so

2012年7月28日 1 条评论

通过源代码编译安装php的memcached扩展,一路顺利,最终生成了memcached.so,同时在php.ini中添加了extension=memcached.so,使用命令php -v查看时提示PHP Warning: PHP Startup: Unable to load dynamic library。以前在多台机器上安装扩展都是这么设置就可以,但是这台机器上就不行,后来发现是此机器的php.ini默认配置中使用了extension_dir,解决办法就是注释掉php.ini中的extension_dir配置。

关于memcached扩展的安装可以参看这里:http://www.netingcn.com/php-memcached.html

分类: PHP 标签:

nginx php 使用memcached出现页面502错误

2012年7月28日 没有评论

php的版本5.2.17,memcached扩展的版本2.0.1,当使用memcached的cas功能时候出现502错误,而set、get功能正常。开始一直以为是nginx的配置有问题,网上也有人提到过可能跟fast-cgi的一些参数设置有问题,试着修改默认值,问题依旧没有得到解决。后来通过CLI来执行php脚本时候提示了一个错误,按照这个错误搜索,发现原来这是memcached扩展2.0.1跟php 5.2.17不兼容的Bug,具体参看:https://bugs.php.net/bug.php?id=61283。

解决的办法要么是升级php,要么降级memcached扩展到1.0.2,经过测试在php 5.2.17 和 memcached 1.0.2能正常工作。

分类: PHP 标签:

解决 PHPExcel 长数字串显示为科学计数

2012年7月24日 7 条评论

解决 PHPExcel 长数字串显示为科学计数

在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号。

使用PHPExcel来生成excel,也会遇到同样的问题,解决方法有三种:
1、设置单元格为文本

$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Simple');
//设置A3单元格为文本
$objPHPExcel->getActiveSheet()->getStyle('A3')->getNumberFormat()
	->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
//也可以设置整行或整列的style
/*
//E 列为文本
$objPHPExcel->getActiveSheet()->getStyle('E')->getNumberFormat()
	->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
//第三行为文本
$objPHPExcel->getActiveSheet()->getStyle('3')->getNumberFormat()
	->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
*/

更多的格式可以在PHPExcel/Style/NumberFormat.php中找到。注意:上述的设置对长数字字符串还是以文本方式来显示科学计数法的结果,原因可能php在处理大数字时采用的科学计数法。

2、在设置值的时候显示的指定数据类型

$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Simple');

$objPHPExcel->getActiveSheet()->setCellValueExplicit('D1',
                                 123456789033, 
                                 PHPExcel_Cell_DataType::TYPE_STRING);

3、在数字字符串前加一个空格使之成为字符串

$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Simple');

$objPHPExcel->getActiveSheet()->setCellValue('D1', ' ' . 123456789033);

推荐使用第二、三种,第一种没有根本解决问题。

分类: PHP 标签:

PHPExcel mac os 下中文乱码问题

2012年7月24日 没有评论

在php中使用PHPExcel来生成Excel表格,内容含有中文,window系统下显示正常,mac os的office打开excel显示不出来中文,现象是表格中看到中文显示为方框,但是焦点放在表格上时,上面的显示的又是中文。程序中使用的编码是GBK,由于PHPExcel只支持UTF8,已经在程序中使用iconv进行了转码,所以可以排除编码的问题。百思不得其解,只好借助万能的Google,在一个链接中发现有人说mac os 打开的excel文件出现乱码是由于字体造成的,再次打开乱码的excel文件,发现打开的默认字体为一个英文字体,终于找到原因了,解决问题就很简单了,在生成excel时候强制设置表格使用某种支持中文的字体即可,如宋体,代码如下:

$objPHPExcel = new PHPExcel();	
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('宋体');

注意:如果当前文件的编码不是使用UTF8,需要对’宋体’进行编码转换使之成功UTF8编码。

PHPExcel真是个好东西,功能太强大了,有点小遗憾的是中文文档不全,想要实现某种功能只能借助搜索引擎了。

分类: PHP 标签:

php json 中文问题

2012年7月11日 没有评论

php中内置函数json_encode提供把一个array转化为json字符串的功能。网上看到很多人说不能处理中文,这种说法其实是不对的,关键是要看php源文件的编码方式,对于非UTF8的php源文件,中文确实会有问题,反之能正常工作,为什么会这样呢,php手册上说的很清楚

This function only works with UTF-8 encoded data.

对于使用utf8作为文件编码方式的人,可以直接忽视中文问题,那么采用GBK或GB2312的怎么办?要么修改文件的编码方式,往往这个不太显示,总不能为了这个问题把一个项目都修改成UTF-8,另外的一个办法是借助urlencode、urldecode在转换一下,urlencode是把原字符串转换为UTF8格式编码,这就满足了json_encode支持UTF8的需求,而urldecode是把UTF8编码转换成当前字符编码。所以在进行json_encode前先把array中的字符串使用urlencode,然后执行json_encode,接着使用urlencode把json_encode结果进行解码。实例代码如下:

function arrayEncode(&$arr) {
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            arrayEncode($arr[$k]);
        } else {
            $arr[$k] =  urlencode($v);
        }

        if (is_string($k)) {
            $nk = urlencode($k);

            if ($nk != $k) {
                $arr[$nk] = $arr[$k];

                unset($arr[$k]);
            }
        }
    }
}

function my_json($arr) {
    arrayEncode($arr);
    
    return urldecode(json_encode($arr));
}

将图片生成圆角图片

2012年7月10日 没有评论

说明:此文章有网友提供

见官方demo:http://www.imagemagick.org/Usage/thumbnails/#rounded%5Fborder

运行此demo必须条件:

1、ImageMagick 安装路径 D:/Program Files/ImageMagick/convert.exe

2、将 ex 文件夹放在 C盘根目录下。

最终转换命令

"convert c:/card1.jpg -alpha set -gravity center -extent 1200x750 " +
" c:/a_big.png -compose DstIn -composite " +
" c:/b_big.png -compose Over -composite " +
" c:/111.png "

其中 a_big.png b_big.png 均是背景图 顺序不能互换 111.png 是生成的圆角图片

思路:

这里假设用户上传的最大长宽比例不超过1200*750,

我们可以先做 1200*750 2张背景图,frist_1200_750.png 和 sec_1200_750.png。

由于用户上传图片大小不同,也就是 width,height不同

1、得到用户上传图片的width、height

2、判断目录下是否存在此长宽比的背景图,如果不存在,再创建此长宽比的背景图,Radius.java createThumbnail 方法。

3、根据转换命令,进行转换。记住,2张背景图的顺序不能反, 读者可试试互换结果。 Radius.java createRadiusImg 方法。

4、测试,如果 width > height 生成的圆角图长宽比正常。测试图片 card1.jpg

如果 width < height,就不正常了。 测试图片 4d58cae79da70.jpg 如果 width > height, 长宽比均比较大,生成图片 和 原图片对比,发现生成图片模糊,测试图片 200711108226923_2.jpg

Demo代码下载地址:http://pan.baidu.com/netdisk/singlepublic?fid=588935_3480700337

无觅相关文章插件,快速提升流量