PHP是一门适合WEB的快速编程语言,之转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net所以目前PHP能够占据web的半壁江山,【本文首发于唐霜的博客】原创内容,盗版必究。和它的便捷离不开,对于使用者而言,不必过【本文受版权保护】【本文首发于唐霜的博客】多的去纠结它的实现,而只需要告诉程序做什【本文受版权保护】本文版权归作者所有,未经授权不得转载。么即可。比如,在Java中this很复杂【作者:唐霜】著作权归作者所有,禁止商业用途转载。,内存很复杂,而在php中,我们很少用到【未经授权禁止转载】原创内容,盗版必究。和内存、指针相关的东西,对于程序而言,不转载请注明出处:www.tangshuang.net【本文受版权保护】同的去指引它完成目标即可。
本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net问题的产生转载请注明出处:www.tangshuang.net
【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】但是,当基于php的大型项目出现的时候,【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】程式化的php编程就显得在一些方面显得不原创内容,盗版必究。原创内容,盗版必究。足,性能上比较弱,内存管理上的不足,以及【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】最坑的是不支持多线程。
【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【本文受版权保护】【本文首发于唐霜的博客】我们来看一段javascript代码:【未经授权禁止转载】
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】var time = 300;var timer = setInterval(function(){
if(time <= 0)
clearInterval(timer);
console.log(time);
time --;
},1000);
// 其他代码
上面这段代码,可以确保从300秒开始倒计著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net时,最终time为0时停止。
【原创不易,请尊重版权】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。但setInterval里面的funct【转载请注明来源】未经授权,禁止复制转载。ion并不会马上执行,而是等上1秒以后在【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】执行,而注释处的其他代码并不会等这一秒钟转载请注明出处:www.tangshuang.net【未经授权禁止转载】过去后再执行,而是执行完setInter【本文首发于唐霜的博客】【本文受版权保护】val之后立即执行。
【本文受版权保护】原创内容,盗版必究。未经授权,禁止复制转载。【版权所有,侵权必究】在php内,有一个sleep()函数,可【未经授权禁止转载】【转载请注明来源】以让程序等上1秒后再执行,但是其后的所有【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】的代码,都必须等上这1秒。这种执行方式,未经授权,禁止复制转载。未经授权,禁止复制转载。被成为阻塞式。
【原创不易,请尊重版权】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】同步、异步转载请注明出处:www.tangshuang.net
【原创内容,转载请注明出处】【原创内容,转载请注明出处】【原创内容,转载请注明出处】【原创内容,转载请注明出处】【作者:唐霜】首先,我们来看下同步、异步的概念。未经授权,禁止复制转载。
著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。同步:所谓同步,就是在发出一个功能调用时未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。,在没有得到结果之前,该调用就不返回。
【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【作者:唐霜】异步:发出一个功能调用时,不必得到结果,【未经授权禁止转载】【原创不易,请尊重版权】继续往下处理。当一个异步过程调用发出后,未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】调用者不会立刻得到结果。实际处理这个调用本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。的部件是在调用发出后,通过状态、通知来通本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。知调用者,或通过回调函数处理这个调用。
【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。我们下面用代码来演示一下:【访问 www.tangshuang.net 获取更多精彩内容】
本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】/* 同步 */
function send() {
$result = mail('mail_to','subject','content'); // 调用,当mail函数没有得到结果时,不会执行下面的return
return $result;
}
send(); // 调用,当send()函数没有得到结果时,不会执行下面的while
while(1) {}
可以看到,同步这种编程机制是大部分程序的未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。一种机制,因为后面的代码往往依赖于前面的未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net代码结果,所以同步也是我们最常遇见的一种未经授权,禁止复制转载。【本文受版权保护】编程机制。下面我们用javascript未经授权,禁止复制转载。【作者:唐霜】来演示一下异步的情况:
【作者:唐霜】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net/* 异步,基于jquery */
var ajax;
ajax = $.ajax({ // 调用,并不会立即执行内部调用,而是发出请求,发出完请求后不用得到url返回的结果,就会立即往下执行while
url : 'url',
type : 'post',
success : function(result) {}, // 回调,当得到结果时,通过传入一个回调函数,再对返回的结果进行处理,其发生的时间与发出ajax请求的时间没有严格的先后顺序,也就是说如果机子性能OK的话,在下面的while循环过程中,如果ajax请求得到的最终数据结果,那么会执行这个函数内的动作
error : function(s,x) {},
complate : function() {}
});
whie(1) {}
可以看到,异步操作有几个特点:1. 在时本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】间上,异步调用仅消耗发出请求的时间,请求原创内容,盗版必究。原创内容,盗版必究。发出后这个操作在时间上就结束。2. 必须【版权所有,侵权必究】【原创内容,转载请注明出处】有回调。
本文版权归作者所有,未经授权不得转载。【转载请注明来源】【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】我们在php开发的时候也有异步操作,但是【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】一般都是通过url回调实现的。举一个实际【原创内容,转载请注明出处】【原创不易,请尊重版权】中的开发案例,当我们使用支付宝SDK进行【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。支付相关开发时,通过SDK中的一些类构建【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。支付信息,并将该信息提交到支付宝服务器(本文作者:唐霜,转载请注明出处。【未经授权禁止转载】发出请求),不过这个时候,支付宝服务器会本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。返回一个提交成功的信息给自己的服务器,你原创内容,盗版必究。转载请注明出处:www.tangshuang.net就可以继续往下操作。在这个过程中没有异步【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。发生。当你的用户支付了这个订单,支付宝服【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net务器就会请求你提交的回调地址,而你则通过【本文受版权保护】【关注微信公众号:wwwtangshuangnet】这个回调url所支持的php,实现回调操【本文受版权保护】【未经授权禁止转载】作。这整个过程中,你的支付过程并没有要求【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。必须得到支付成功(或失败)的结果数据,而转载请注明出处:www.tangshuang.net【版权所有,侵权必究】是通过回调地址来接收结果数据。因此,这个【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。场景也是一个异步操作。只不过,这不是由一原创内容,盗版必究。【未经授权禁止转载】段程序完成的,而是多个php程序协同完成【未经授权禁止转载】【作者:唐霜】的,而且在程序设计中,必须考虑用户的操作本文作者:唐霜,转载请注明出处。【本文受版权保护】习惯和耐心。
【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net阻塞、非阻塞原创内容,盗版必究。
【作者:唐霜】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。阻塞和非阻塞,是对于程式而言的一种机制。
【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【转载请注明来源】阻塞:一个调用未得到结果时,该线程被挂起转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,直到得到结果时再往下执行。
本文版权归作者所有,未经授权不得转载。【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。非阻塞:一个调用无论是否得到结果,该线程著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】不受影响,程序继续执行。
【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【转载请注明来源】我们用代码来进行演示:【访问 www.tangshuang.net 获取更多精彩内容】
【原创内容,转载请注明出处】原创内容,盗版必究。【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】/* 阻塞 */
function curl_get($url) {
$ch = curl_init($url) ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ;
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ;
$result = curl_exec($ch) ;
return $result;
}
$data = curl_get('your_api_url');
$data = json_decode($data);
// ...
上面这段代码中,使用curl获取api接未经授权,禁止复制转载。原创内容,盗版必究。口返回的数据,当程式进展到获取数据这个位【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net置的时候,线程被挂起,直到获取api接口【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】返回数据,并被赋值给$data,才继续往【原创内容,转载请注明出处】【转载请注明来源】下执行。
【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。/* 非阻塞 */
function sock_get($url) { $host = parse_url($url,PHP_URL_HOST); $port = parse_url($url,PHP_URL_PORT); $port = $port ? $port : 80; $scheme = parse_url($url,PHP_URL_SCHEME); $path = parse_url($url,PHP_URL_PATH); $query = parse_url($url,PHP_URL_QUERY); if($query) $path .= '?'.$query; if($scheme == 'https') { $host = 'ssl://'.$host; } $fp = fsockopen($host,$port,$error_code,$error_msg,1); if(!$fp) { return array('error_code' => $error_code,'error_msg' => $error_msg); } else { stream_set_blocking($fp,0);//开启了手册上说的非阻塞模式 stream_set_timeout($fp,1);//设置超时
$header = "GET $path HTTP/1.1\r"; $header.="Host: $host\r"; $header.="Connection: close\r\r";//长连接关闭 fwrite($fp, $header); usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功 fclose($fp); return array('error_code' => 0); }
}
while(1) { if(file_exists('switch')) { sock_get('your_corn_url'); sleep(60); }
}
【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。未经授权,禁止复制转载。
同步、异步和阻塞、非阻塞的区别【转载请注明来源】
【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】 【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。 未经授权,禁止复制转载。【原创内容,转载请注明出处】【作者:唐霜】著作权归作者所有,禁止商业用途转载。 【本文受版权保护】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【版权所有,侵权必究】PHP中进程分支未经授权,禁止复制转载。
未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net 【原创内容,转载请注明出处】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。 未经授权,禁止复制转载。原创内容,盗版必究。【转载请注明来源】未经授权,禁止复制转载。 【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【作者:唐霜】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】php多进程和多线程【作者:唐霜】
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net 【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【原创不易,请尊重版权】 原创内容,盗版必究。未经授权,禁止复制转载。原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】 【作者:唐霜】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【本文受版权保护】 原创内容,盗版必究。【本文首发于唐霜的博客】【本文受版权保护】 转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。 未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。【本文受版权保护】 本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。 本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【原创不易,请尊重版权】 【本文受版权保护】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】 【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【本文受版权保护】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。 本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【转载请注明来源】$pid = pcntl_fork();
if($pid > 0){ //父进程代码
exit(0);
}
elseif($pid == 0) { //子进程代码
exit(0);
}
这种情况下,你会发现httpd或php-原创内容,盗版必究。【本文受版权保护】fpm的进程会增加,也就是说,pcntl【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】其实是通过重新开启php进程,并通过其他【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net机制实现进程之间的通信的。
本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【作者:唐霜】著作权归作者所有,禁止商业用途转载。proc_open,popen也是利用h著作权归作者所有,禁止商业用途转载。【作者:唐霜】ttpd来实现多进程
【未经授权禁止转载】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。$proc=proc_open("echo foo", array(
array("pipe","r"),
array("pipe","w"),
array("pipe","w")
), $pipes);
print stream_get_contents($pipes[1]);
利用socket来实现多线程未经授权,禁止复制转载。
未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。未经授权,禁止复制转载。前面的两种都是利用第三方组件来实现,在大本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net多数虚拟主机上是实现不了的。而大部分主机本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】可以实现socket,简单的说就是通过p未经授权,禁止复制转载。【原创不易,请尊重版权】hp代码来再发起一个非阻塞模式的(url本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。)请求,相当于在访客访问你写的php页面【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。的同时,你的这个php文件中,也有一个新原创内容,盗版必究。转载请注明出处:www.tangshuang.net的访问,从而在目标页面执行另外一个任务,本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。这也可以被认为是多进程。实际上,这个时候本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net,也是会增加httpd或php-fpm的本文版权归作者所有,未经授权不得转载。【作者:唐霜】进程数,与上面的方法殊途同归。
【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【本文受版权保护】未经授权,禁止复制转载。【本文首发于唐霜的博客】多线程【版权所有】唐霜 www.tangshuang.net
【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【本文首发于唐霜的博客】【原创内容,转载请注明出处】PHP官方没有提供多线程的扩展,pecl本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】中有一个pthreads扩展提供了多线程【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net的特性,关于pthreads,可以在ph本文作者:唐霜,转载请注明出处。原创内容,盗版必究。p官方文档具体去了解。
未经授权,禁止复制转载。【原创内容,转载请注明出处】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】php异步回调【版权所有,侵权必究】
【关注微信公众号:wwwtangshuangnet】【本文受版权保护】本文版权归作者所有,未经授权不得转载。使用场景:我创建了一个自动备份的脚本,自转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。动备份有这么几个步骤:查询数据库,并把查未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net询结果备份为.sql文件;把这些.sql著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net文件压缩为一个.zip;通过接口,将该.【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】zip文件上传到云盘保存。
【关注微信公众号:wwwtangshuangnet】【转载请注明来源】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net这个过程很消耗服务器资源,每一步都面临服【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net务器资源耗尽而被抛出500以上的服务器错原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。误,导致备份失败。有没有一种方法,在程序【本文受版权保护】【未经授权禁止转载】执行过程中,可以不要立即去执行上面的步骤未经授权,禁止复制转载。未经授权,禁止复制转载。,而是一步一步的完成,每一步基于上一步的【转载请注明来源】【版权所有】唐霜 www.tangshuang.net结果,但是不在同一个进程中全部执行完,而【本文受版权保护】【原创不易,请尊重版权】是分阶段执行,每一个步骤执行完之后,可以原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】释放掉内存,从而可以节省服务器资源。
转载请注明出处:www.tangshuang.net原创内容,盗版必究。【原创不易,请尊重版权】如果是用户操作界面,我们可以通过java【本文受版权保护】【版权所有】唐霜 www.tangshuang.netscript来控制,通过$.ajax的回【作者:唐霜】【版权所有】唐霜 www.tangshuang.net调来实现。通过ajax去请求第一个步骤所【作者:唐霜】原创内容,盗版必究。在的页面,得到结果后,在回调函数中继续去【原创内容,转载请注明出处】未经授权,禁止复制转载。请求第二个步骤所在的页面,在得到结果后,【转载请注明来源】【版权所有,侵权必究】再在回调函数中去请求第三个步骤所在的页面【转载请注明来源】【未经授权禁止转载】,如此写下去。每一个ajax请求仅会调起转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】一个php进程,上一个进程会被释放,因此转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net执行时间仅算一个进程的,内存也会被释放掉【作者:唐霜】【本文受版权保护】,服务器压力就小了很多。
【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【本文受版权保护】可是我们无法通过服务器本身来触发页面内的原创内容,盗版必究。本文作者:唐霜,转载请注明出处。$.ajax请求,而php本身没有aja【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netx的回调函数类似的操作。这才是我们本文的【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。最终核心点,我们试图构建一个模型,可以实【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net现类似$.ajax的回调函数一样的代码模【本文受版权保护】【版权所有】唐霜 www.tangshuang.net型。
【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。事件、监听和回调【作者:唐霜】
原创内容,盗版必究。原创内容,盗版必究。【本文首发于唐霜的博客】首先,让我们通过jquery来先梳理一下【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】事件、监听和回调的一些场景。
原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】事件:名词,导致状态发生变化的触发。进程本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。中任何一次变化,都有可能是事件,关键在于【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。我们如何定义我们需要的事件。例如在jqu著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。ery中click mouseenter【本文受版权保护】【关注微信公众号:wwwtangshuangnet】 blur scroll等等,都是事件。
【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】监听:动词,主动监测事件是否发生。进程中【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】的所有事件一旦发生,一定会引起一些变化,原创内容,盗版必究。原创内容,盗版必究。而能够监测到这些事件是否发生,需要通过我【原创内容,转载请注明出处】未经授权,禁止复制转载。们手工去写代码来实现。例如jquery中未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】,当click事件发生时,浏览器会得到该原创内容,盗版必究。【本文首发于唐霜的博客】事件,并由jquery库中的一段代码来判原创内容,盗版必究。【未经授权禁止转载】断该事件是否发生。
转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【作者:唐霜】【版权所有,侵权必究】【原创内容,转载请注明出处】回调:动词,当监听到事件发生时,所采取的【本文受版权保护】【转载请注明来源】行为。一般而言,回调通过函数实现,通过传【转载请注明来源】未经授权,禁止复制转载。入一个函数给监听作为参数,即可在监听到该转载请注明出处:www.tangshuang.net【本文受版权保护】事件时,执行该回调函数。
【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【原创内容,转载请注明出处】【原创内容,转载请注明出处】让我们来看下jquery中的经典代码:【原创不易,请尊重版权】
【转载请注明来源】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net$(document).ready(function(){
$('a').on('click',function(){
$(this).attr('target','_blank');
});
});
上面这段jquery代码,是给a标签绑定转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。一个事件监听的过程,其中,要监听的事件为【作者:唐霜】【作者:唐霜】click,当click事件发生时,执行转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。function中的代码,而绑定使用了o【本文受版权保护】转载请注明出处:www.tangshuang.netn(event,call_fun)来实现【本文首发于唐霜的博客】【转载请注明来源】。
【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netphp中的事件绑定和监听【关注微信公众号:wwwtangshuangnet】
【原创内容,转载请注明出处】未经授权,禁止复制转载。未经授权,禁止复制转载。【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。从上面这节的叙述来看,实际上,我们真正需【转载请注明来源】【版权所有,侵权必究】要事件的,是事件的绑定和监听两个动作。我著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net们来举一个例子,假如存在下面这种php代【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】码:
本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【转载请注明来源】<?php
$Event->on('post','call_fun');
function call_fun($post_data) { // $post_data是接收到的$_POST数据
foreach($post_data as &$data) {
// 对每个值进行处理
}
return $post_data;
}
从上面的分析我们可以这么认为:绑定了一个【作者:唐霜】【未经授权禁止转载】对post事件的监听,当post事件发生【未经授权禁止转载】【本文首发于唐霜的博客】时,使用call_fun作为回调函数。
【本文首发于唐霜的博客】【转载请注明来源】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】php中的钩子机制【原创不易,请尊重版权】
【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】在很多php框架中加入了钩子机制(hoo【原创不易,请尊重版权】【转载请注明来源】k),也就是在原始的完整的代码流程中,加本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net入一些挂载点,通过在这些挂载点加入一些处【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。理函数,实现在代码流程中自由的增加新功能转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net。比如wordpress中的add_ac【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。tion和add_filter,比如th未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netinkphp中的\Think\Hook。而这种钩子机制,完全可以实现我们上面所著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】提出来的监听绑定和回调。
php的回调函数,可以参考【未经授权禁止转载】这篇文章【访问 www.tangshuang.net 获取更多精彩内容】。未经授权,禁止复制转载。
【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。php进程分支的最终实现【版权所有,侵权必究】
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】但是,最最最大的问题,在于,我们无法做到【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。在这种钩子机制中异步回调。这是我们本文最【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】大的问题,核心问题和终极目标。
著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。我们仍然要回到jquery的$.ajax【本文受版权保护】【关注微信公众号:wwwtangshuangnet】,我们即使有了php的钩子机制,仍然无法【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。做到像jquery那样,非阻塞的实现异步【版权所有】唐霜 www.tangshuang.net【转载请注明来源】回调。我们究竟如何来实现这个过程呢?
【转载请注明来源】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【本文受版权保护】我专门写了一个项目,来实现这个过程,你可本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】以在github未经授权,禁止复制转载。上fork这个项目通过里面的代码来了解我【本文受版权保护】【原创不易,请尊重版权】的实现方法,该方法不需要特殊的服务器配置【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】,甚至可以在大部分虚拟主机上跑。
著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。我们来看下一个延时操作是怎么实现的:【作者:唐霜】
【本文受版权保护】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【作者:唐霜】<?php
require 'Events.php';
require 'EventListener.class.php';
$EventListener = new EventListener('timeout');
$EventListener->add('timeout','setTimeout');
function setTimeout() {
sleep(10);
file_put_contents('./log.txt','延时回调成功,现在时间:'.date('Y-m-d H:i:s'),FILE_APPEND);
}
// 你自己的代码流程
file_put_contents('./log.txt','延时操作开始,现在时间:'.date('Y-m-d H:i:s')."\r",LOCK_EX);
$EventListener->run('timeout');
// 你自己的代码流程
用上面这段代码,即可在单个php文件内部【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】实现回调操作,而无需另外写php文件来实本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】现,这和javascript实现setT【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】imeout()的效果是一样的(虽机制不【本文受版权保护】【版权所有,侵权必究】同)。
本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net2016-02-18 9495


