IE的条件编译引发的bug

且看一段代码:

在IE中执行,会alert(“this is IE”), 在其他浏览器中则不会; 因为: “//@cc_on” 是IE的条件编译的语法,或许你没有这么用过,或许你也不打算用IE的这个特性,这都没关系,问题是如果你因为这个导致bug就显得有些冤了,看如下代码:

就这段代码,其他浏览器都好使,在IE下就出错,而且报错信息会让人费解:

 

 

这是因为使用 /*@cc_on@*/ 在IE中就开启了条件编译,下面的 //@ 就被识别为条件编译指令,于是就出错了。

使用IE的开发者调试工具时还要注意一个问题,只要执行了 /*@cc_on@*/ ,后面即使把他删掉,也还是开启了条件编译 了,因为多次执行是在同一个进程内的。

该问题可能出现的情况为: 加入你在开发一个js的某某sdk,可能会因为注释的问题在有些地方工作正常,在有些地方就工作异常,那将是多么郁闷的事情啊。

 

参考资料: http://baike.baidu.com/view/1097041.htm

关于PHP写文件操作的具体实现

缘起:

100个进程都在繁忙地工作着,而且都在积极地将工作的结果写到日志文件中去。因为工作内容并不复杂,但是都需要写相同的日志文件,为了避免把日志文件写花了,于是每次写操作都会先flock住日志文件,结果,flock操作消耗了 1~100ms的时间; 其实,做一个单位的工作也就10ms内可以完成的,这下flock操作消耗时间就太长了,所以,需要一个解决办法。

为什么flock能消耗这么多时间?

一个进程的flock时间可能会是其余n个进程写日志的时间。故而如此,所以…

几种解决方案:

  1. 写日志不加锁。 应该会出现把日志写花的可能,故不可取
  2. 减少写日志的次数,
    • 合并多次日志
    • 或取消不必要的日志操作
    • 某些情况下不写这些日志
  3. 减少进程个数,避免flock排队的长度。这样,任务的处理能力会有所下降
  4. 是否日志操作外的其他进程的工作存在问题?

结论:

采用了减少写日志次数的方案,修改后,负载明显降低,变化如下:

 

其他

file_put_contents(…) 的实现:

相关代码:  main\streams\streams.c

从该代码来看,如果写失败一次,会直接返回,这时候会返回写入的字节数,可能只写入了部分数据,所以,判断返回值还是有意义的

 

 

libcurl 中的一个bug

现象:

程序陷入死循环,消耗cpu 100%

backtrace:

 

bug相关代码:

 

给curl官方提交了一个bug: https://sourceforge.net/tracker/?func=detail&aid=3583103&group_id=976&atid=100976

 

关于soap的一些小知识

1. soap编码问题

soap采用utf-8编码作为传输的字符集编码,至少php的soap的实现是写死成utf-8字符编码的,如果server端或client端使用的是非utf-8的字符编码时,可能存在转码问题,导致转码错误; 一个不太正规的做法是: 在server端和client端都对字符做url编码(或别的编码),是的传输的字符都转换成了单字节的ascii字符,这样就不会出现转码问题了。 但是,如果访问量很大,会存在流量和效率方面的问题,如果访问量很小,还是可以使用的

2. 让多个类提供服务的方法,如:

3. 错误处理

server端的错误如何告知client呢?通过 $server->fault() 来实现,如:

client 端实现:

1) 根据 ext/soap/soap.c 中关于$server->handle() 的实现来看,如果使用的是ZEND_ENGINE_2 ,则在执行的函数中 throw new SoapFault(…) 也会有和上述相同的效果的,如:

可以通过:

# php -i | grep -i engine

来确认使用的Zend Engine 的版本

2) 虽然soapclient可以识别一些http的状态码,但是soapserver:fault 产生错误时,http状态码统一为500,注意,当user-agent 为 Shockwave Flash 时,依然使用200 的状态码返回,大概是对于flash实现soap时特殊情况的兼容吧。参看php: ext/soap/soap.c 中 函数: soap_server_fault_ex(…) 的实现,php的soapclient可以通过如下方式设置user-agent:

 

4. 对象的持久化

对象的持久化就是在session中保存类或对象的一些数据信息;要知道连接句柄等和进程相关的资源信息是无法有效地保存的

 

5. 数据的传递

如果你执行的server端的函数为 echo “hello world”; 那么client将得不到该信息,参看php的soap扩展中soap.c 有相关代码如下:

 

6. 什么叫classmap?

在使用SoapClient时,允许通过如下方式设置classmap,如:

因为在server端,如果return一个server端的对象,则被转换为一个Struct的类型,内部含有该对象的一些数据信息,当然,对象的方法信息都是没有的; 该类在client端可能就是不存在的,这时候就可以map到client端定义的一个类,而且可以通过该类的方法来访问对象内部的一些信息。

但是,有一点需要注意,client端不要定义和server端的类相同的属性信息,如果定义了,则该属性将成为一个数组,包含client端和server端的信息。不知道为什么这么设计

 

7. 什么叫typemap?

 

 

8. 关于soap的测试,单个脚本实现的SoapServer和SoapClient:

脚本来自: http://us1.php.net/manual/en/soapclient.dorequest.php

9. 关于数据类型

函数的参数和返回值是涉及到数据类型的,如果仅仅使用string、int、array,则基本是没有问题的,如果使用到了对象,就需要注意了,可能需要用到classmap、typemap了,还有SoapParam、SoapVar; 稍后再研究

10. 关于location和uri

在new SoapClient和new SoapServer时都需要uri,而且这两个uri也是可以不一样的,其实程序根本不会去访问这个uri,这个uri只是xml中的一个名字空间的名字; 而new SoapClient时的那个location却是真正要访问的soapserver的url地址;但是,需要注意的是: uri 最好不要带参数,带一个参数还好,如果要带多个,必然出现 ‘&’,而uri是要写到请求的xml中的,xml中出现 ‘&’,会被解释为实体,然而却不是一个合法的实体,所以就会出现 400 错误,然后就是调试半天,百思不得姐。

 

 

 

 

 

 

关于cookie的一些限制

关于cookie的大小、个数的一些限制,从下面几个方面来考虑:

1. 单个cookie的大小

单个cookie的大小对于浏览器是有限制的,比如,chrome浏览器对于超过2k的单个cookie是不认的,其它浏览器没测试

2. cookie的个数

对于IE单个域下有50个的限制

3. cookie总数的大小

因为上行的所有cookie是在一个http请求头里面的,一个请求头的长度在server端一般是有限制的,客户端也应该有限制,这个没有具体的测试和数字,对于apache来讲,一个请求头的长度限制最大为8k,所以,所有的上行cookie的数据量的总和不能超过8k,超过8k就会出现400错误;对于nginx,这个限制大于8k,(具体没看呢)

glibc 源码之 include/libc-symbols.h

 

glibc-2.9/include/libc-symbols.h 中 490 行后面的东西怎么理解? 感觉有点儿意思,有时间再看!

如:

 

用GDB修改可执行文件的代码和变量

转自: http://my.oschina.net/alphajay/blog/49941

 

下面我向大家介绍一下使用gdb修改可执行文件中的代码和变量的方法。
另,在GDB文档中介绍这个方法也 能修改CORE文件的内容,本人未验证。

在 一般情况下GDB是以只读方式打开可执行文件的,如果需要改变可执行文件,需要在读入文件以前,用GDB启动参数“–write”或者命令“set write on”用可读写方式打开可执行文件。如果文件已经打开了可执行文件,就需要使用exec-file重新以读写方式打开可执行文件,注意如果你还没打开可执行文件,就一定要使用file命令读入,因为exec-file不会重新读入符号信息。

还有要注意的是,因为修改只能修改section的内容,所以能修改的变量只能是非0的全局变量,内容是O的变量会被放入bss。

1.c:

gcc -g 1.c

./a.out

1

./a.out

100

 

下面举例修改代码内容:

1.c:

#gcc -g 1.c

#./a.out

修改代码内容:

. /a.out                     #现在没有输出了 因为cool函数直接返回了

 

 

 

 

 

 

Proxifier代理客户端

Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。支持 64位系统,支持Xp,Vista,Win7,MAC OS ,支持socks4,socks5,http代理协议,支持TCP,UDP协议,可以指定端口,指定IP,指定程序等运行模式,兼容性非常好。有点类似SOCKSCAP。

 

下载地址: http://www.proxifier.com/

注册码:

MBZKT-ZWTSL-M8X24-3AN7T-NRWU6
JBZEM-M2HY9-C3SW3-6SKQC-MVNXN
Q7ZB5-A35HX-8GWYW-T47T4-9FNVX
55ZE3-SWXN2-CMM2N-22MQQ-NLB95
JCZBX-A3N3F-9DWY5-327V5-DKUXX
LPZLA-FW4R4-NV52E-Q9RYW-PH3ZY

 

也可以用 注册机: Proxifier.v3.0.Standard.Edition key

 

相关资料:

百度百科: http://baike.baidu.com/view/3430720.htm

官方:http://www.proxifier.com/

相关资料: http://www.duba.net/c/2004/11/29/154980.shtml

 

关于http代理、https代理、socks4、socks5代理的不同