PHP函数strtotime理解笔记

post by 朦朧中的罪惡 / 2010-2-28 20:39 Sunday PHP

官方手册里面对strtotime的描述:

strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳。

那么意味着这个函数可以把2010-02-28 18:31:33转换为1267353093这种格式

但是使用它转换时间戳的时候要注意的是服务器的date.timezone的配置,在函数说明中有这么一段话

该函数将使用 TZ 环境变量(如果有的话)来计算时间戳。自 PHP 5.1.0 起有更容易的方法来定义时区用于所有的日期/时间函数。此过程在 date_default_timezone_get()  函数页面中有说明。

上面的话可以这么理解:

如果date.timezone配置为空或者为UTC(格林威治时间),那么它就会直接把传入的时间直接转换为该时间的UNIX时间戳(相当于该时间识别为格林威治时间)

如果date.timezone配置了时区,例如Asia/Shanghai,那么这个函数就会将传入的时间认为是配置的时区的当地时间,然后根据该时区与UTC(格林威治时间)的时差来算格林威治时间的时间戳。

例如:

php.ini配置date.timezone为Asia/Shanghai;

我们传入:2010-02-28 18:31:33

函数转出的时间戳的实际时间为:

2010-02-28 10:31:33

因为Asia/Shanghai位于 +8区,那么函数会自动减去了8个钟头的时间来得到格林威治时间

参考程序测试代码:

<?php
echo '2010-02-28 00:00:00';
echo '<br>';
// 格林威治时间 0
date_default_timezone_set('UTC');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';
// 中国上海时间 + 8
date_default_timezone_set('Asia/Shanghai');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';
// 美国洛杉矶时间 - 8
date_default_timezone_set('America/Los_Angeles');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';

输出:

2010-02-28 00:00:00
2010-02-28 00:00:00
2010-02-27 16:00:00
2010-02-28 08:00:00

标签: php 原创

评论(0) 引用(0) 浏览(27)

php函数unserialize数据返回false问题分析

post by 朦朧中的罪惡 / 2010-2-1 15:22 Monday PHP

unserialize的这个问题是由一个emlog论坛用户在使用时报错而发现的

问题表现情况如下:

emlog缓存 的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,读取缓存的时候直接反序列化(unserialize)缓存字 符串即可读取数据,关于序列化和反序列化的原理请看我先前的文章《php函数 serialize()与unserialize()不完全研究》
 

我从用户那里取到的缓存的序列化数据为:

a:1: {s:8:"kl_album";a:4:{s:5:"title";s:12:"精彩瞬 间";s:3:"url";s:41:"http://www.kaisay.cn/?plugin=kl_album";s:8:"is_blank";s:7:"_parent";s:4:"hide";s:1:"n";}}

咋 一看了解序列化的人都会说,这个数据很正常啊,没什么问题呢。可是直接把这段字符串进行unserialize,返回的值却是个False;

代 码

var_dump(unserialize('a:1:{s:8:"kl_album";a:4: {s:5:"title";s:12:"精彩瞬间";s:3:"url";s:41:"http://www.kaisay.cn /?plugin=kl_album";s:8:"is_blank";s:7:"_parent";s:4:"hide";s:1:"n";}}'));
 

点击查看原图

运行结果

点击查看原图

阅读全文>>

标签: php 原创

评论(0) 引用(0) 浏览(223)

nginx实现301转向

post by 朦朧中的罪惡 / 2009-12-17 4:17 Thursday 服务器配置

emlog论坛搬家,需要从http://www.emlog.net/bbs 转向到 http://bbs.emlog.net

在emlog虚拟主机的配置段中增加

location /bbs {

      rewrite ^/bbs/(.*)$ http://bbs.emlog.net/$1;

}

保存更新nginx配置,成功

标签: 原创 nginx

评论(0) 引用(0) 浏览(288)

emlog基于Zoundry客户端离线写作指南

post by 朦朧中的罪惡 / 2009-12-13 12:59 Sunday emlog

emlog最新版本支持了离线写作功能,但是离线写作这个概念对很多bloger来说来比较陌生,所以特出本教程来教大家如何使用客户端来写作blog日志。

首先我来介绍离线写作的客户端软件Zoundry.相比大名鼎鼎的Windows Live Writer,这个软件名气要小得多。但是名气小并不代表它的功能不够强大,它特色功能包括以下内容:

zoundryraven

阅读全文>>

标签: emlog 原创

评论(3) 引用(0) 浏览(379)

关闭虚拟主机的Gzip

post by 朦朧中的罪惡 / 2009-10-14 13:41 Wednesday 疑难杂症

有的Apache虚拟主机默认就开启的Gzip节省网站流量,但是这么做可能导致网站在使用ie6浏览时出现一些神奇的问题,如JavaScript不运行,框架页面空白等神奇的情况。

如果你的虚拟主机支持.htaccess,那么可以在其中写入SetEnv no-gzip即可关闭Apache的Gzip压缩。

标签: apache 原创

评论(0) 引用(0) 浏览(325)

Apache2.2配置Subversion(SVN)提示cannot load mod_dav_svn.so解决

post by 朦朧中的罪惡 / 2009-9-29 9:08 Tuesday 疑难杂症

问题描述:配置Apache2.2与SVN 1.6.5时Apache启动报cannot load mod_dav_svn.so

上网查找资料,首先从这里知道是缺少了dll库文件

按照博客上所说将SVN的bin目录下libdb44.dll,libeay32.dll,ssleay32.dll三个文件拷贝到Apache的bin目录下

启动失败....

找了一圈没结果后去了Subversion的官方FAQ,faq要求我拷贝

libdb4*.dll, intl3_svn.dll, libeay32.dll and ssleay32.dll,拷贝后依然无效

这时看到了faq的最后一句话:

If this still does not resolve the problem, you should use a tool like Dependency Walker on mod_dav_svn.so to see if there are any other unresolved dependencies。

跑去下载了Dependency Walker 打开mod_dav_svn.so查看它需要的dll文件

点击查看原图

看了一下需要的是

libapr-1.dll
libaprutil-1.dll
libsvn_delta-1.dll
libsvn_fs-1.dll
libsvn_repos-1.dll
libsvn_subr-1.dll

按照要求拷贝后Apache顺利启动,问题解决

标签: apache 原创

评论(1) 引用(0) 浏览(891)

jquery修复ie6不支持position: fixed;的插件

post by 朦朧中的罪惡 / 2009-9-25 15:41 Friday Web前端


<!--[if lte IE 7]>
<script type="text/javascript">
(function($) {
    $.fn.pozFixed = function(params) {
        var defaults = {
            top : 400,
            left : '50%',
            interval:100
        };
        defaults = $.extend(defaults,params);    
        return this.each(function(i,o) {
            var $this = $(this);
            this.fixPosition = function() {
            var st = $().scrollTop(); 
                $this.css({
                    top:st + defaults.top,
                    left:'50%'
                });              
            };
            $this.css({position:'absolute',top:defaults.top,left:"50%"});
            setInterval(this.fixPosition,defaults.interval);
        });
    };
})(jQuery);
</script>
<![endif]-->

标签: JavaScript 原创

评论(0) 引用(0) 浏览(539)

php使用MySql函数导致Apache(iis)崩溃的问题

post by 朦朧中的罪惡 / 2009-9-22 20:59 Tuesday 疑难杂症

这个问题是在Windows下配置PHP环境时发生的。

具体的表现是php运行正常,但是只要一调用MySql的相关函数,Apache就会崩溃掉。

环境配置方式:

php以模块的方式运行在Apache下。自定义php.ini路径

phpinfo()显示mysql库加载成功

崩溃后在Windows的错误日志中会留下以下内容:

错误应用程序 httpd.exe,版本 2.2.11.0,错误模块 php5ts.dll,版本 5.2.10.10,错误地址 0x0000ac6a。

上google查了很久也不知道是怎么回事,国外也有人遇到同样的问题,但是没有解决方法,后来无意中看到phpinfo中MySql库的版本居然是5.1.30,这才想到原因,分析如下:

我在安装MySql的时候在配置设定时把MySql的Bin目录放到了系统环境变量Path中。而Bin目录中正好有一个libmysql.dll的库。

而php在加载mysql库的时候会搜索系统环境变量Path每一个目录寻找libmysql.dll,由于mysql的bin目录也在其中,那么php就先把mysql的libmysql.dll加载了。所以就会由于库的兼容问题导致mysql的函数无法运行。

解决方案:

1.将mysql的bin目录从系统环境变量Path中移出或将libmysql.dll从MySql的bin目录中移出。

2.重起系统

标签: apache php 原创 环境配置

评论(1) 引用(0) 浏览(757)

php在iis5下使用setcookie + header('Location')导致cookie失效的bug

post by 朦朧中的罪惡 / 2009-9-5 19:51 Saturday 疑难杂症

那多记忆 2009-9-4 21:49:10
今天遇到一个奇怪的问题 emlog在一个 iis5 php4.4.6 的环境下,登录的时候我们是先写cookie 然后 header location到首页,但是在这个环境下只要有 header location 服务器就不发送cookie了。。去掉header location 就ok

我上网查找了一下,这是iis5的一个bug,其他服务器和II7没有这个问题

下面是我查到相关资料
微软官方对于这个bug的说明
http://support.microsoft.com/kb/q176113/
另外在php在线手册的评论中也有一位网友发现了这个问题
http://cn.php.net/manual/en/function.setcookie.php#50957

评论内容(原文 + 翻译):
setcookie + header Location + IIS 5 = Trouble

It took me a long time to figure out what was causing a missing cookie in one system while it worked perfectly in another...
这个让我用了很长的时间去查出cookie在一个系统上丢失却在其他系统上正常原因

See this one: http://support.microsoft.com/kb/q176113/

In short, this WILL NEVER WORK IN IIS 5:
简单的说,下面的代码不能在iis5上成功运行
<?php
header
("Pragma: no-cache");
header('Location: http://www.example.com/');
setcookie('AA','1',0,'/');
setcookie('BB','2',time() + 24 * 3600,'/');
?>

You will ONLY get the Location Header, everything else will be "cut out" by IIS 5 CGI implementation.
你只能得到
Location Header,其他的东西全部都在iis5的CGI执行中被剪掉了
Solutions:
解决方案
1- Migrate to Apache/IIS6/Whatever
迁移到Apche IIS6 或者其他的平台上
2- Use a Non Parsed Header Script (nph-*.php)
使用不处理头部的脚本文件
3- Try with header('Refresh: 0; $URL');
尝试发送这样的头来实现页面跳转
header('Refresh: 0; $URL');

I hope this helps somebody not to spend hours knocking his/her head.

我希望这些能帮助某些人不用浪费很多时间来敲头(笑)

标签: php 原创

评论(2) 引用(0) 浏览(706)

php仿银行电子口令卡生成程序

post by 朦朧中的罪惡 / 2009-9-4 19:08 Friday PHP

用php写了一个银行口令卡生成程序,可以生成类似银行口令卡的图片或者表格。

工商银行的电子口令卡

 

我自己的(每次刷新就会重新生成一个图片):

在线演示DEMO:

生成html表格

生成png图片

背景图片可自行替换,数字的范围,表格行数格数全部可调,参见附件源代码。

本程序无版权,可随意传播

附件下载:
card.zip 14.02KB

标签: php 原创

评论(1) 引用(0) 浏览(563)