Press "Enter" to skip to content

PHP实现异步调用方法研究

浏览器和服务器之间是通过 HTTP 协议进行连接通讯的。这是一种基于请求和响应模型的协议。浏览器通过 URL 向服务器发起请求,Web 服务器接收到请求,执行一段程序,然后做出响应,发送相应的html代码给客户端。 这就有了一个问题,Web 服务器执行一段程序,可能几毫秒就完成,也可能几分钟都完不成。如果程序执行缓慢,用户可能没有耐心等下去,就关闭浏览器了。 而有的时候,我们更本不关心这些耗时的脚本的返回结果,但却还要等他执行完返回,才能继续下一步。 那么有没有什么办法,只是简单的触发调用这些耗时的脚本然后就继续下一步,让这些耗时的脚本在服务端慢慢执行? 经过试验,总结出来几种方法,和大家share: 1. 最简单的办法,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一个img标签,src指向要执行的耗时脚本。 这种方法最简单,也最快。服务器端不用做任何的调用。 但是缺点是,一般来说Ajax都应该在onLoad以后触发,也就是说,用户点开页面后,就关闭,那就不会触发我们的后台脚本了。 而使用img标签的话,这种方式不能称为严格意义上的异步执行。用户浏览器会长时间等待php脚本的执行完成,也就是用户浏览器的状态栏一直显示还在load。 当然,还可以使用其他的类似原理的方法,比如script标签等等。 2. popen() resource popen ( string command, string…

Filed in PHP应用
with 47 Comments

使用C++编写Apache的模块 -- 命令表,保存配置信息

还是和论文相关,要编写一个Apache的模块,挂在post read_request阶段,在第一时间,判断一个链接是否是而已连接请求,并在第一时间拒绝恶意连接请求。
首先遇到的第一个问题,就是需要从http.conf中读取配置信息,提供俩个配置指令,MaxNumber, TimeRange.指定在一段时间内的连接次数上限。
编写的时候,遇到的第一个问题就是,moudule申明,不能通过编译,编译器提示重复定义。查了N遍手边的apache源码分析,也没有找到原因,如: ........

Filed in Linux/Unix, PHP Extension
with 8 Comments

由signal想到的

signal(int sig, void(*func)(int))是信号注册函数。它可以定制对于特定的信号(sig)的处理函数。
昨天偶然看到他的申明式的时候,把我搞的有点糊涂
#include
void(*signal(int signo, void(*func)(int)))(int);
仔细理解了半天,终于搞清楚了它的定义式,也解开了我长期以来的一个误区:
1. void(*func)(int):
定义了一个函数指针,他的类型是,指向一个返回是void,参数的int的函数类型的指针,就好像 int i, 定义了一个可以存储int型的变量的i。
2. 由上,signal的定义可以如下解释。
signal(int signo, void(*func)(int));
定义了,signal函数接受俩个参数一个是int signo,一个是一个回调的函数指针。
void(* signal(....))(int);
定义了,signal的返回类型是一个函数指针,指向一个返回空的,接受一个整形参数(信号值)的函数;
这么解释,就好多了,再看看简化的定义式,就更明白了(Plauger 1992):
typedef void sigfunc(int);
sigfunc *signal(int, sigfunc *);
由此,我结合fork进行了一番试验, 来验证,子进程是否继承父进程的信号处理函数......

Filed in PHP Extension
Comments closed

在PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究

  最近在做一个PHP的安全模块,其中要在Module的函数中获取用户的Cookie,从而生成签名;今天找遍Baidu/Google,一点相关资料都 没有,不得已,只好给yahoo PHP dev mail list发了求救信。后来,偶然在Google上看到了一个变量 http_globals ,眼前一亮,虽然没有详细资料,但经过一顿试,N次Segmentation fault以后,终于成功!

Filed in PHP Extension, PHP应用, PHP源码分析
with 18 Comments

关于调用约定(cdecl、fastcall、stcall、thiscall) 的一点知识

当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个、什么样的参数。即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。
函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。在参数传递中,有两个很重要的问题必须得到明确说明:
1) 当参数个数多于一个时,按照什么顺序把参数压入堆栈;
2) 函数调用后,由谁来把堆栈恢复原装。
3)函数的返回值放在什么地方

Filed in GNU C/C++, 转载, 随笔
with 3 Comments

PHP:Header

PHP header()
The function declaration: void header ( string string [, bool replace [, int http_response_code]])
The optional replace parameter indicates whether the header should replace a previous similar header, or add a second header of the same type. By default it will replace(true);

Filed in PHP应用
with 7 Comments

Perl的特别之处

因为项目需要, 要改进一个抓取网页内容的脚本, 用到了perl,从刚开始看到别人的perl脚本就感觉象天书,到今天已经正常work了一天一夜的脚本, 这三天时间里的一些收获,主要是一些,大家一般来说不太容易理解的概念,或者说是,在C/C++,PHP,JAVA,JS中不常见的一些个语法, 给初学perl的朋友一些启示, 当然,对于perl牛人来说,就不值得一看了....

Filed in 随笔
Comments closed

一个误区(关于javascript的字符串拼接)

前段时间听说了一个问题,说是,javascript中使用+=来拼接字符串会比使用Array的join方法慢几十倍以上,今天在工作间歇,就写了个例 子验证了一下,结果确完全相反,使用+=比join要快(在50000个简单拼接循环)200多milliseconds,真是很意外,最后经过仔细研 究,发现原因再于,我使用的测试环境,Firefox(Ubutun), 呵呵,原来是这样的。 在IE下,确实使用Join要比+=快几十倍,但,在IE下它们整体要比firofox慢1个数量级; 在ie下解释为什么+=比join慢的原因,是因为,在IE下,String是固定内存的,每次+=都会重新分配内存。而使用Array的join方法则不会。 而为什么IE下整体要比firefox慢,是因为,IE的垃圾回收机制,每次重新分配内存以后,都会回收废弃的内存,目前只是猜测,因为IE的整体内存使 用要比firefox少很多,firefox的垃圾回收机制是和IE完全不一样的。还没有经过验证,但知道这个结论就够了。 不过,目前来说,因为绝大多数网民还是使用IE系列的浏览器多点,所以在大型的js工作中,还是可以考虑用Array的join代替+=。

Filed in Js/CSS
with 2 Comments