存档

2013年9月 的存档

通过php安装Imagick扩展给动态gif图片打水印

2013年9月23日 没有评论

一直以来php处理图片都是以gd为主流,直到近些年Imagick的使用才渐渐变多。

gd通常用来缩放图片,给图片打水印等基本功能,对于复杂效果如制作图标按钮、图倒影等滤镜功能就会力不从心。

尤其对于有多帧图片的动态gif图打水印,如果使用gd像处理普通jpg那样去打水印,打完水印后的图片只剩下第一帧,没有动态效果。

Imagick就能很好的胜任这一点,使得php给动态gif图片打水印成为可能,而且它还具有内存占用小,画质高的特点。

下面是分别使用gd(左图)和imagick(右图)把图片缩放到256px效果,请注意查看图片的细节。

256-photo-gd256-photo-imagick

下面我会详细介绍“php怎么安装Imagick扩展”并实例说明如何給动态gif图片打水印。

 

imagick有两种使用方式:

1.命令行下调用convert命令

2.php调用函数库Imagick(需要1作为安装基础)

 

安装前的准备工作(ImageMagick 6.2.4+ , PHP 5.1.3+.),先安装需要的库文件

下载imagemagick并编译安装

(编译安装过程时间比较长,请耐心等待。安装后 convert 的路径是 /usr/local/bin/convert,可以直接从命令行运行"convert -version"来看看版本。如果发现类似错误,convert: error while loading shared libraries: libMagickCore.so.3: cannot open shared object file: No such file or directory,可以执行"ldconfig /usr/"重新加载一下库文件的路径。)

到这里imagemagic命令行工具已经安装完成,也就是常说的convert命令,执行回下命令会生成logo.gif图片就表示命令行下的imagemagic安装完成了,快来体验一下吧。

cd /usr/local/nginx/html/
/usr/local/bin/convert logo: logo.gif

访问http://www.nginx.cn/logo.gif

如果你能看到这个图片就表示安装正确。
image imagic

高级命令令例子:

从中间裁切200x200正方形图片

convert 1.jpg -gravity center -extent 200x200 2.jpg

生成的图片最小的边要有500像素

convert 1.jpg -resize 500x500^ 2.jpg

合成一条,看看有多强大,你放张200x300左右的图片试下,这条命令将会将图片最小的边按比例强行扩大到500像素,再从正中央裁切200像素的正方式

convert 1.jpg -resize 500x500^ -gravity center -extent 200x200 2.jpg

给图片 base.jpg 在y100,x10的位置加上图片 sy.png 水印

composite -geometry +100+10 sy.png base.jpg finished.jpg

详细功能请参考官方手册

http://www.imagemagick.org/Usage/

php增加imagick扩展函数

1.译PHP原生库Imagick
wget http://pecl.php.net/get/imagick-3.1.1.tgz
tar zxvf imagick-3.1.1.tgz
cd imagick-3.1.1/
/usr/local/php/bin/phpize
ln -s /usr/local/include/ImageMagick-6 /usr/local/include/ImageMagick
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

/usr/local/php替换为你的php安装路径并确认bin目录下存在php-config文件

编译成功后会在php 扩展目录生成imagick.so
位置是
Installing shared extensions:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
Installing header files:
/usr/local/php/include/php/

2.php加载Imagick库
修改php.ini,文件末尾加上一行
extension = "imagick.so"

如何查找php.ini的位置?
执行
/usr/local/php/bin/php --ini
会显示php.ini所在路径,路径下没有php.ini文件,
Configuration File (php.ini) Path: /usr/local/php/lib
Loaded Configuration File: (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

我们可以新建一个空的php.ini,并加入一行extension = "imagick.so"
vi /usr/local/php/lib
增加

extension = "imagick.so"

3.查看phpinfo,确认imagick是否加载成功

使用imagick库生产缩略图,logo.gif是前面用命令行生产的图片
[php]
<?php
header('Content-type: image/jpeg');

$image = new Imagick('logo.gif');
$image->adaptiveResizeImage(1024,768);

echo $image;
?>
[/php]

访问:htt://www.nginx.cn/p.php
slt

[php]
<?php
$image = new Imagick('old.gif');
$image = $image->coalesceImages();
foreach ($image as $frame) {
$frame->thumbnailImage(50, 50);
}
$image = $image->optimizeImageLayers();
$image->writeImages('new.gif', true);
?>
[/php]

安装过程中遇到的错误:
magick/.libs/libMagickCore.so: undefined reference to gzseek64'
magick/.libs/libMagickCore.so: undefined reference to
gztell64'
magick/.libs/libMagickCore.so: undefined reference to `gzopen64

从字面上看找不到64为的zlib,也就是说没能正确链接到64的zlib路径,我们可以安装64的zlib并把它的路径加到命令行(推荐方式)。

具体步骤

ldconfig -v |grep libz
显示,这个库是32位的所以连接失败
libz.so.1 -> libz.so.1.2.3

wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8

CFLAGS=-fPIC ./configure --libdir=/usr/lib64 --prefix=/usr
make
make install

cd ../ImageMagick-6.8.6-10/

./configure --with-zlib-dir=/usr/local/lib/

make

如果编译还是错误,可以把libz.so.1.2.3移动到其它位置

mv /usr/lib/libz.so.1.2.3 ~

ldconfig -v |grep libz
libz.so.1 -> libz.so.1.2.8

再make就成功了。

checking for MagickWand.h header file... configure: error: Cannot locate header file MagickWand.h

新版的imagemagick路径修改了,需要建立到默认路径的软连接

ln -s /usr/local/include/ImageMagick-6 /usr/local/include/ImageMagick

参考资料
http://valokuva.org/?cat=1

分类: php 标签: , , ,

codeigniter nginx rewrite规则配置

2013年9月9日 4 条评论

nginx如何配置才能支持codeigniter ?

1. codeigniter的url美化去掉index.php

2.与thinkphp一样codeigniter的url rewrite也是使用pathinfo来实现的,需要借助fastcgi_split_path_info来设置$_SERVER['PATHINFO']。

codeigniter完整版nginx.conf规则

分类: nginx 标签: , , ,

电信iphone4s无信号,不会自动恢复搜索网络

2013年9月6日 没有评论

我的iphone4s用的一直挺好的,在保期间出过一次问题,就是电池没电后,在充电死活从不进去,时间长一会就机身发烫。

我是电信合约机且那时在保修期内,就送去中关村的中邮普泰维修点,维修人员询问情况后,检查了一下机身时候磨损等认为因素后说后盖自己带走,过几天来拿一个新的,但是信息跟原来的一模一样。这里顺便提醒一下想修iphone的同学要提前把照片等个人数据导出来。因为导照片很耗时,一般维修点人多不愿意给你导数据,如果换新机器都会直接把数据格式化掉。

没几天就打电话让我取新机器,新机器拿到后了确实串号什么的跟原来一样,但机器肯定不是原来那台了,充电插口都变干净,按键也变紧了。

这都无所谓,关键是手机能用了,跟新手机一样,这一点还是比较赞苹果的售后服务,至少不用跟js废什么话,就换新了。

今年3月份手机就过保了,结果到了7,8月份办了一个副卡后,把主卡放到另外一个手机后,狗血的事来了。

手机放到口袋里,大概两三天就没信号显示无服务,但是不再会自动搜索信号了。

刚开始我怀疑是卡的问题,因为当时办的时候我把卡放到iphone5了,剪了一下,当我办副卡的时候,就说4s用大卡,结果电信给我真给我弄了个大卡,我就用5的剪卡器剪成5的卡,套个4s的卡托这样使用。我觉得可能是卡接触不好,所以变的没信号。

后来我把补办了一个4s的卡,以为这样就能解决为题,可是插上卡两天后,又无服务了。

而且这回是我在地铁上眼看着手机变成无服务了,确保卡没有接触不好,是机器自身出问题了,是关开飞行模式都不行,都不会自动搜索信号,只能重启恢复信号。

这样一来问题就可以归结为硬件问题或者固件问题,如果要是硬件的问题就应该一直没信号,不会重启之后就会恢复搜索信息并能搜索到信号。那么就应该是固件问题,上网一查,发现无论是电信,联通,还是移动用户都出现过这类问题。

而且也有苹果官方回答,但是非常繁琐,基本就是无服务就重启,但是这也tmd无意义了吧,放口袋里没信号到重启这期间的电话怎么办?分割线下是官方回答

=================================================================

Phone:“无服务”故障诊断
症状

iPhone 的状态栏中可能会显示以下任一症状:

在信号覆盖较好的区域显示“无服务”或“正在搜索”
返回信号覆盖区域后,没有重新获得服务
解决方法

如果您在 iPhone 上发现上述任意症状,请尝试以下步骤来试着解决此问题。执行每个步骤后请进行测试。

尝试关闭 iPhone,然后再打开。
取出 SIM 卡并验证其是否为运营商制造的有效 SIM 卡。也请验证其是否损坏、磨损或已修改。然后将其重新插入。
检查运营商设置更新。连接到 Wi-Fi 网络时,轻按设置 > 通用 > 关于本机。如果有可用更新,系统应立即显示提示。如果没有可用的 Wi-Fi 网络,请将设备连接至 iTunes。
将 iPhone 更新到最新版本的 iOS。
恢复 iPhone。
如果仍然存在“无服务”问题,请联系您的运营商以检查可导致此问题的任何网络或帐户问题。

=================================================================
其中一个比较靠谱的回答是这样:

电信版非越狱iPhone4S下地库或进电梯后显示“无服务”,不能自动恢复手机信号,只能重启手机。

解决方法:进入“设置”,然后进入“通用”,然后进入“网络”,然后进入“漫游”,然后关闭“语音漫游”。

故障分析:估计是iPhone固件的Bug. 下地库后,没有搜索到CDMA信号,就认为出国了,改为搜索国外CDMA/GSM运营商信号,仍然没有搜到,于是显示“无信号”。打到“飞行模式”后退出“飞行模式”时,继续搜索国外CDMA/GSM运营商信号,当然还是没有搜索到。于是继续显示“无服务”。重启手机时,按照默认的中国电信去搜索运营商,于是搜索到了,恢复正常工作。通过关闭漫游,会一直搜索中国电信的CDMA信号,一旦有信号就会恢复服务。

我在地铁上跟地库很相似都是信号差的地方,考虑到自己确实不需要出国漫游,就把语音漫游关掉了,测试几天看看吧,希望能够解决问题。

linux命令行快捷键

2013年9月5日 5 条评论

群里有人问“问个问题,linux命令行 有没有快捷键一下从行末会到行头? 经常敲了很多命令 发现忘加 sudo 了,然后把命令删了重新敲一遍”。

自己还真不知道怎么操作,只知道历史命令可以使用上下光标切换。

正好早上微博有人科普,感谢龙浩的blog的总结,我也补充点知识,纠正一下百度知道上关于“HISTFILESIZE”和“HISTSIZE”的区别错误回答。

好吧,开始说说历史记录个数的“HISTFILESIZE”和“HISTSIZE”的区别

默认情况下HISTFILESIZE和HISTSIZE的值都是500,表示可以记录500条命令记录。

HISTFILESIZE 表示记录在文件中的命令条数
HISTSIZE 表示记录在内存中的命令条数

当我们在shell命令行执行命令的时候,最近的HISTSIZE条命令被保存在内存当中可以使用上下光标或者ctrl+p,ctrl+n上下查找命令。

当退出shell时HISTFILESIZE条命令被保存到历史命令文件中,下次登录shell时会从历史命令文件中读取命令道内存历史命令道中

当网络中断等异常时,你会发现之前的历史命令,下次登录时用上下光标找不到上次的历史命令,所以要正常退出或者发送探测包保持shell在线。

如果想增加历史命令保存的数量,可以在~/.bash_profile中手动修改HISTFILESIZE和HISTSIZE这两个变量的值。

搜索操作快捷键

搜索历史命令的快捷键:Ctrl + r
它是通过关键字去匹配历史记录,执行后会提示:(reverse-i-search)`':

输入你记得的关键字去匹配,如果出现你需要的命令,按Enter就可以选择命令;如果不是请输入更精确的关键字去匹配。

移动操作快捷键

Ctrl + f-- 向右移动一个字符,当然多数人用→
Ctrl + b-- 向左移动一个字符, 多数人用←
ESC + f-- 向右移动一个单词,MAC下建议用ALT + →
ESC + b-- 向左移动一个单词,MAC下建议用ALT + ←
Ctrl + a-- 跳到行首
Ctrl + e-- 跳到行尾

删除操作快捷键

Ctrl + d-- 向右删除一个字符
Ctrl + h-- 向左删除一个字符
Ctrl + u-- 删除当前位置字符至行首(输入密码错误的时候多用下这个)
Ctrl + k-- 删除当前位置字符至行尾
Ctrl + w-- 删除从光标到当前单词开头

命令切换操作快捷键

Ctrl + p-- 上一个命令,也可以用↑
Ctrl + n-- 下一个命令,也可以用↓

其他操作快捷键

Ctrl + y-- 插入最近删除的单词
Ctrl + c-- 终止操作
Ctrl + d-- 当前操作转到后台
Ctrl + l-- 清屏 (有时候为了好看)

学完这几个快捷键组合,回答一下开始的问题吧,相信大家自己也试过了,就是ctrl+a快捷键能使光标回到行首。

分类: linux 标签: , ,

304 Not Modified和SEO的关系

2013年9月2日 1 条评论

很久以来我就在一直在研究如何能做好网站优化,说白了也就是做好SEO。

研究数月没什么成绩,但也得出一些个人看法和驳斥304表示网站降权的说法,供大家参考。

如何做好SEO工作一些个人看法

先说下个人心得,做网站如做人。

试想一下大家想跟什么样的人打交道:

一个衣着整洁、洗梳干净、说话有条理、对待问题有个人的看法、讲道理、不说谎、不作弊、不剽窃他人成果的没有人不愿意与之交往。

相反一个蓬头垢面,衣履蓝衫、胡言乱语、爱撒谎、耍小聪明、无节操、无羞耻、讲别人物品据为己有的人,大家无不避而远之。

做网站也一样,需要先练好内功、靠的的是日积月累、贵人相助。

练好内功

网站目录组织结构标签分类清晰,内容实用,让用户以最快速度能会找到自己需要的东西,让自己成为自己产品的粉丝。

日积月累

冰冻三尺非一日之寒,网站内容需要持续更新,根据用户反馈调整网站目录结构,网站风格,始终保持迭代进步。

贵人相助

如果你有权重高的网站给你导出链(当然现在效果比较慢),或者权重流量大网站的固定广告位导入流量,网站权重也会上升很快。

驳斥304表示网站降权的说法

关注SEO时看到一个说法,说是观察一个网站的蜘蛛抓取状态码,如果大量出现304,表明网站正在被降权。

看到之后的感觉就是,这帮做SEO哥们就会忽悠,只会看表现。并不能看清本质.

本着科学严谨的态度,我们先来看一下什么是304

304 Status Code Explained
The 304 status code is sent in response to a request (for a document) that asked for the document only if it was newer than the one the client already had. Normally, when a document is cached, the date it was cached is stored. The next time the document is viewed, the client asks the server if the document has changed. If not, the client just reloads the document from the cache.

上面是因为原版说明,上过学的应该都能看懂,我就不翻译了。

大概意思就是客户端每次访问服务器时会带着时间戳,如果服务器上的内容客户端已经访问过并且在客户端访问后没有更新,就会返回304状态码,表示客户端已经缓存过服务器上的内容。

304表示的是一种缓存状态,是一种正常状态,表示服务器端没有新的内容被蜘蛛抓取。

304出现并不一定是说降权,只是说你的内容已经被蜘蛛抓取过了,它没有新的东西去爬取。

---------------------------------------------------------------------------------

下面是一些关于浏览器缓存的术语,感兴趣的也可以看看。

关于 Cache-Control: max-age=秒 和 Expires

Expires = 时间,HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)
max-age = 秒,HTTP 1.1版本,资源在本地缓存多少秒。
如果max-age和同时存在,则被Cache-Control的max-age覆盖。

Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

什么是“ETag”?

HTTP协议规格说明定义ETag为“被请求变量的实体值” 。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

其过程如下:

客户端请求一个页面(A)。
服务器返回页面A,并在给A加上一个ETag。
客户端展现该页面,并将页面连同ETag一起缓存。
客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。
服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。

HTTP Caching 用好了,可以极大的减小服务器负载和减少网络带宽。十分有必要深入了解下 http 的 caching 协议。

先来看下请求/响应过程:

http 请求/响应

http 请求/响应

1、用 Last-Modified 头

在第一次请求的响应头返回 Last-Modified 内容,时间格式如:Wed, 22 Jul 2009 07:08:07 GMT。是零时区的 GMT 时间,servlet 中可以用 response.addDateHeader ("Last-Modified", date.getTime ()); 加入响应头。如图:

last-modified 和 If-Modified-Since

last-modified 和 If-Modified-Since

Last-Modified 与 If-Modified-Since 对应的,前者是响应头,后者是请求头。服务器要处理 If-Modified-Since 请求头与 Last-Modified 对比看是否有更新,如果没有更新就返回 304 响应,否则按正常请求处理。如果要在动态内容中使用它们,那就要程序来处理了。

ps:servlet 取 If-Modified-Since 可以用 long last = requst.getDateHeader ("If-Modified-Since");

2、用 Etag 头

很多时间可能不能用时间来确定内容是否有更新。那可以用 Etag 头,etag 是以内容计算一个标识。计算的方式可以自己决定,比如可以用 crc32、md5等。

Etag 和 If-None-Match

Etag 和 If-None-Match

Etag 与 If-None-Match 是对应的,前者是响应头,后者是请求头。服务器要判断请求内容计算得到的 etag 是否与请求头 If-None-Match 是否一致,如果一致就表示没有更新,返回 304 就可,否则按正常请求处理。

3、用 Expires 头,过期时间

当请求的内容有 Expires 头的时候,浏览器会在这个时间内不去下载这个请求的内容(这个行为对 F5 或 Ctrl+F2 无效,用 IE7,Firefox 3.5 试了,有效的比如:在地址输入后回车)。

expires 过期时间

expires 过期时间

在 servlet 中可以用 response.addDateHeader ("Expires", date.getTime ()); 添加过期内容。

ps:在 httpwatch 中可以看到 Result 为 (Cached) 状态的。

4、用 max-age 的 Cache-Control 头

max-age 的值表示,多少秒后失效,在失效之前,浏览器不会去下载请求的内容(当然,这个行为对 F5 或 Ctrl+F2 无效)。比如:服务器写 max-age 响应:response.addHeader ("Cache-Control", "max-age=10");

ps:如果你还要加一些 Cache-Control 的内容,比如:private,最好不要写两个 addHeader,而是一个 response.addHeader ("Cache-Control", "private, max-age=10"); 否则 ie 可能对 max-age 无效,原因它只读第一个 Cache-Control 头。

小结:

Last-Modified 与 Etag 头(即是方式 1 和2)还是要请求服务器的,只是仅返回 304  头,不返回内容。所以浏览怎么 F5 ,304 都是有效的。但用 Ctrl+F5 是全新请求的(这是浏览器行为,不发送缓存相关的头)。

Expires 头与 max-age 缓存是不需要请求服务器的,直接从本地缓存中取。但 F5 会忽视缓存(所以使用 httpwatch 之类的 http 协议监察工具时,不要 F5 误认为 Expires 和 max-age 是无效的)。

nginx目前默认没有ETag,需要借助第三方包来支持,而且对于静态文件If-Modified-Since效率并不比ETag差,所以不推荐使用,等未来1.3.3+版本支持吧。

分类: 网站 标签: , ,