好东西呀,PHP register_shutdown_function函数

这个函数还真的有用,相当于类别的析构函数,关键是他连代码出错而终止也会被执行,这样的话我想到主要用途主要有几个:

1> 连接的结束

2> 内存释放

3> 结合ob_start()就可以写LOG

关于写log,测试了一下:

<?php

ob_start();

function shutdown() {

$str = ob_get_contents();

ob_clean();

echo ‘this is return str:’ . $str;

}

register_shutdown_function(’shutdown’);

$x = new abc();

?>

当然,写log的时候也就可以把当前的一些运行时环境同时保存下来了

这是关于这函数的译文:

脚本时常死掉,而且并不总是那么好看. 我们可不想给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下) . PHP中有一个叫做 register_shutdown_function 的函数,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会被调用.所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.我准备了一个非常基本的例子,可以演示在一个致命错误需要显示时,你应该怎么给用户一些合适的反馈.你可以通过关闭致命错误的显示(译注:可以设置display_errors和error_reporting),让例子看起来好看些.

<?php

$clean = false;

function shutdown_func(){

global $clean;

if (!$clean){

die(”not a clean shutdown”);

}

return false;

}

register_shutdown_function(”shutdown_func”);

$a = 1;

$a = new FooClass(); // 将因为致命错误而失败

$clean = true;
?>

正如你看到的,如果关闭回调函数运行时,clean变量没有被设为true,shutdown_func函数将会打印出一些东西.这个东西可以包装成一个类(不使用全局变量).更多有用的相关信息,我推荐大家查看 EZ组件库的实现方式.

Tags:

Leave a Comment

freebsd备忘录

网卡重启相关:

/etc/rc.d/netif restart (如果设置了dhcp取IP,要使用该指令)
/etc/netstart

SSH 使用密码登录方式登录:
添加一用户, 并添加到wheel组(这样才能使用su)
vi /etc/ssh/sshd_config
修改:
PasswordAuthentication yes

/etc/rc.d/sshd restart

关机:
shutdown -h now

mysql 开机自动启动:
进入mysql(如/usr/local/mysql)目录后,执行:
cp support-files/mysql.server /usr/rc.d/mysql.sh
修改/etc/rc.conf 添加:mysql_enable = “YES”

重启后提示类似:
My unqualified host name(localhost) unknown;sleeping for retry
主要是因为设置的主机名没办法解释:解决方法有二:
1>修改/etc/hosts,在127.0.0.1 那行的后面添加你的主机名
2>主机名填写你真正的域名

Tags:

Leave a Comment

经验:ie又一JS性能问题

一直以来,如果项目中没有使用JQuery之类的框架时,添加事件都直接使用onxxxx = function(){…}的方法,觉得直观、方便,而且一直以来也没出过什么问题,直到今天..

现象
每次翻页(ajax)后,内存暴增500K-1M (每次更新都先清除相关DOM) ,而且不关浏览器的话都无法释放。
使用排除法,最后定位在添加<Img>时出现,再次尝试,移除img上面的事件(onclick,onmousedown…),一切正常,尝试在img父级元素添加事件也出现同样现象,最后问题定位在:在img上不能使用onxxx=function(){..}的方式添加事件,否则无法清除DOM,即使在清除DOM时使用onxxxx=null的方式也无法处理

解决方法
ie下改用attachEvent()与detachEvent()代替,一切正常

Tags: , , ,

Leave a Comment

转一下《在淘宝开店受骗的经历》,同事的亲身经历

在淘宝上开店,没想到第一个单就给骗了.决定写下来跟大家分享这次经历:

首先, 买家陆壳型盆地s1d(自称也是做充值了,现在没有货,有个客服催他充值) 在 旺旺上一边问我有没有货,一边崔我要联系电话,说方便沟通,还时不时发振屏,营造一个急着要货的气氛!然后我急忙就告诉他有货和电话(好兴奋啊,新店的第 一个买家!)他告诉我已经拍了,并且电话联系了我,叫我帮他手动充值。我告诉他还没有付款(这时我还是有点警惕感),他告诉我已经付款了,叫我看看邮件, 我一看邮件的确收到“支付宝”的邮件(这个是他伪造的邮件), 告诉我买家已经付款了。而且我还看了看发送的地址:alipay@mali.alipay.com, 支付宝发给我的(原来那个mail错了,真是眼瞎了!)

然后他在电话里不停的催我快点,这时我就糊涂了!!(忘了看淘宝上的订单状态),然后我就慌张的帮他充值(真是傻了!), 那时他挂了电话,在旺旺上叫我把充值成功的截图发给他看,他要给客服看。

这时另一个买家炫耀殇痕也拍了,我说暂时没有货(因为新开店,软件没有充值那么多钱),明天才买,或充少些,他说不行,要投诉我,并且发了截图给我
(投诉是假的,是他ps出来的), 我也收到支付宝的邮件
我也没办法,也不理他,我就叫买家陆壳型盆地s1d确认收货,他说确认不了,并且截图给我看


(确认不了的截图也是他ps出来的)这时我更加晕了,他反问我怎么办(好像很热情的!!),还叫我去叫买家炫耀殇痕撤诉!我就叫他等等,我要去问问客服,客服一查告诉我他基本没有付款,我才反应过来!

原来受骗了!新开店,第一个单就给骗了,就当交学费(苦笑!本来以为买个软件,设置自动充值和评语,就搞掂!事实不是那么简单的~!!)

在这里告诉新开的话费充值店卖家听一切以订单的状态为标准

伪造发邮件是要知道对方的email地址才能发过来,刚开始我不明白他们怎么知道我的email地址?问了客服才知道,在“已买到的宝贝“列表和交易详情那是可以看到卖家的这些私隐信息的


向淘宝建议: 如果email地址是因为为了方便买家联系卖家,必须显示给买家知道,那应该在帐号管理的邮件地址那加提示告诉用户知道这些(我个人觉的有必要!!)

Start Slide Show with PicLens Lite PicLens

Tags: ,

Leave a Comment

转帖:vim 代码折叠方法

1. 折叠方式 
可用选项 ‘foldmethod’ 来设定折叠方式:set fdm=*****
有 6 种方法来选定折叠:
          manual           手工定义折叠
          indent             更多的缩进表示更高级别的折叠
          expr                用表达式来定义折叠
          syntax             用语法高亮来定义折叠
          diff                  对没有更改的文本进行折叠
          marker            对文中的标志折叠

注意,每一种折叠方式不兼容,如不能即用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。

使用时,用:set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。
要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。

2. 折叠命令
选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例:
如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。
在可折叠处(大括号中间):
zc      折叠
zC     对所在范围内所有嵌套的折叠点进行折叠 
zo      展开折叠
zO     对所在范围内所有嵌套的折叠点展开
[z       到当前打开的折叠的开始处。
]z       到当前打开的折叠的末尾处。
zj       向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk      向上移动到前一折叠的结束处。关闭的折叠也被计入。

当使用marker方式时,需要用标计来标识代码的折叠,系统默认是{{{和}}},最好不要改动之:)
我们可以使用下面的命令来创建和删除折叠:
zf      创建折叠,比如在marker方式下:
                   zf56G,创建从当前行起到56行的代码折叠;
                   10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。
                   10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。
                   在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],<>等)。
zd      删除 (delete) 在光标下的折叠。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
zD     循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。
          仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
zE     除去 (Eliminate) 窗口里“所有”的折叠。
          仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。

Tags:

Leave a Comment

关于编写JS的一点经验[不定期更新换代]

1、一定要封装
只要是调用接口无论是FLASH还是应该程序提供的接口(其实很多情况都应该封闭,只是这种情况的必要性更xx了 ),一定要另外封装主要原因是:

  • 保证自己编写的JS代码的独立性,减少因接口返回的内容而受到影响
  • 方便调试:因为大部分接口都不是只调用一次的,只要在封闭的地方输出一下就知每一个地方所 返回的内容,而且用VC调试的话,很快就能根据调用堆栈里快速得到问题所在。再者,现在IE8自带的性能测试工具也是基于方法的
  • 数据模拟:在别人接口尚未完成或出问题的时候,只要使用模拟数据就可以继续调试自己的代码,可以的话写测试用例都没问题目
  • 方便接口切换:只要在封装内容里简单修改,并保存返回内容的一致性即可切换

Leave a Comment

中文、韩文、日文中GBK和Unicode的字符编码范围

转载一下别人的内容

一、编码范围

1. GBK (GB2312/GB18030)
\x00-\xff GBK双字节编码范围
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文

2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韩文
\xAC00-\xD7A3 (韩文)
\u0800-\u4e00 (日文)
ps: 韩文是大于[\u9fa5]的字符

Tags: ,

Leave a Comment

转帖:try finally 妙用,防止内存泄漏

看到了这文章,最可怕是这句话“这种写法在IE中100%内存泄漏

<div id=”d1″></div>

<script >
function createButton(){
var obj = document.createElement(”button”);
obj.innerHTML=”点我!”;
obj.onclick=function(){
//处理click事件
}
obj.onmouseover=function(){
//处理mouseover事件
}
return obj;//这里由于需要返回创建的对象,所以不能把obj直接设为null. return 后obj是局部变量,不能在外部断开其与HTMLElement的引用.ie中将出现问题泄漏问题
}
var 按钮 = document.getElementsById(”d1″).appendChild( createButton());
按钮.做某些事();
按钮.做某些事();
……..
某些东西.某些事(按钮);
……
</script>

这种写法在IE中100%内存泄漏

使用try finally很容易解决些问题
function createButton(){
var obj = document.createElement(”button”);
obj.innerHTML=”点我!”;
obj.onclick=function(){
//处理click事件
}
obj.onmouseover=function(){
//处理mouseover事件
}
try{
return obj;
}finally{
obj = null;//这句话在return 之后才执行 , 的效的解决了需在return后将obj置null的问题
}
}

一个函数或方法中,其实有很多地方都需要这种选返回值,最后执行某些事的

Tags: ,

Leave a Comment

一些有用、另类的js方法

// 得到指定X,Y下的DOM
document.elementFromPoint(x, y);

DEMO:
<html>
<head>
<script src=”jquery.js”></script>
<script>
$(function(){
var o = document.elementFromPoint(20, 20);
alert(o.tagName);
})
</script>
</head>
<body>
<div style=”height:150px;width:150px;background-color:blue;”>
</div>
</body>
</html>:

Tags:

Comments (2)

常用vim指令(不定期更新)

设置字体,注意”\”后必需有空格
set guifont=Monospace\ 12

设置默认文件编码
set encoding=utf-8

设置配色方案
colorscheme torte

设置显示行号
set nu!

编码时的快捷键

删除括号内容:
di} 或 di] 删除括号里的内容
da} 或 da] 删除括号及其内容

[更新时间:2010-01-28]

S(大写的s)删除当前行除了缩进符外的内容,并进入插入模式  (这个太好用了)
o和O:在当前行后/前插入一新行,是带缩进的,并进入插入模式,这个还真的很常用哩
n,mw filename 将第 n 行到第 m 行 的文字存放的所指定的 filename 里去,还真的有意思

~:把当前字符变成大写还真的方便呀

我在_vimrc中增加的配置:

set nu!
set encoding=utf-8
set fenc=utf-8
set fencs=utf-8,gbk
set langmenu=zh_CN.utf-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
set tenc=utf-8
colorscheme torte
set guifont=Courier\ New

Tags: ,

Leave a Comment