关于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代理的不同

 

CentOS 下的socks5 安装配置

转载:http://www.linuxso.com/linuxxitongguanli/624.html

 

http://www.linuxso.com/uploads/soft/101018/ss5-3.6.1-1.tar.gz  安装步骤如下

推荐官网最新版 3.8.4-1 http://nchc.dl.sourceforge.net/project/ss5/ss5/3.8.4-1/ss5-3.8.4-1.tar.gz

CentOS 下的socks5 安装配置 

socks5代理的功能和作用这里我就不罗嗦了---------------

1.配置编译环境 

yum -y install gcc automake make

2.安装socks5必要的包

yum -y install pam-devel openldap-devel cyrus-sasl-devel

3.下载,编译安装ss5(socks5)

wget  http://www.linuxso.com/uploads/soft/101018/ss5-3.6.1-1.tar.gz
tar zxvf ss5-3.6.1-1.tar.gz
cd ss5-3.6.1
./configure
make
make install

#启动ss5服务
/etc/init.d/ss5 start
如果没办法启动,则是权限问题

chmod a+x /etc/init.d/ss5  就可以启动了。
ss5 默认使用1080端口,并允许任何人使用。 我们可以修改 /etc/opt/ss5/ss5.conf 中的 

#       SHost           SPort           Authentication
#
auth    0.0.0.0/0               –              –

#       SHost           SPort           Authentication
#
auth    0.0.0.0/0               –              u

permit –       0.0.0.0/0       –       0.0.0.0/0       –       –       –       –       –
改为
permit u        0.0.0.0/0       –       0.0.0.0/0       –       –       –       –       –

在 /etc/opt/ss5/ss5.passwd 中添加 用户名和密码 如:

test test

使用用户验证,重启ss5服务

/etc/init.d/ss5 restart

 

如果有错误可以跟踪日志:

#tail -f /var/log/ss5/ss5.log

配置有密码的SOCKS5代理之后,迅雷可以配置代理下载,但是我测试遨游打不开网页。

除非配置不使用用户和密码,遨游才可以代理上网,可能是流量器内置的SOCKS5客户端有问题。

至于端口号怎么修改,我还没有找到,在源文件里面修改config.h 但是编译之后端口还是1080.

以后发现了再修改,我使用SS5只是用来突破学校的BT下载限制,再测试之后会告诉大家如何修改端口号。

先前我也百度谷歌了半天,不过发现他们用的都是老版的SS5,我已经看了很多,大家没必要了,有价值的内容,我都贴到这里面了。

欢迎测试过的朋友在下面留言,也可以加我们Linux安全网的QQ群交流 群号:11153255

 

相关资料: http://linux.net527.cn/fuwuqiyingyong/Squidfuwuqi/2802.html