PHP进程分支设计

广告位招租
扫码页面底部二维码联系

PHP是一门适合WEB的快速编程语言,之转载请注明出处:www.tangshuang.net【未经授权禁止转载】所以目前PHP能够占据web的半壁江山,原创内容,盗版必究。转载请注明出处:www.tangshuang.net和它的便捷离不开,对于使用者而言,不必过转载请注明出处:www.tangshuang.net【未经授权禁止转载】多的去纠结它的实现,而只需要告诉程序做什本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】么即可。比如,在Java中this很复杂本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net,内存很复杂,而在php中,我们很少用到本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net和内存、指针相关的东西,对于程序而言,不【原创不易,请尊重版权】原创内容,盗版必究。同的去指引它完成目标即可。

本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【访问 www.tangshuang.n【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】【转载请注明来源】

问题的产生

但是,当基于php的大型项目出现的时候,转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。程式化的php编程就显得在一些方面显得不著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】足,性能上比较弱,内存管理上的不足,以及【本文首发于唐霜的博客】【作者:唐霜】最坑的是不支持多线程。

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【访问 www.tangshuang.n【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】et 获取更多精彩内容】【作者:唐霜】

我们来看一段javascript代码:

【未经授权禁止转载】【作者:唐霜】
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【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。ion并不会马上执行,而是等上1秒以后在【本文受版权保护】【版权所有,侵权必究】执行,而注释处的其他代码并不会等这一秒钟原创内容,盗版必究。【转载请注明来源】过去后再执行,而是执行完setInter【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。val之后立即执行。

【本文受版权保护】著作权归作者所有,禁止商业用途转载。

在php内,有一个sleep()函数,可转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。以让程序等上1秒后再执行,但是其后的所有【本文首发于唐霜的博客】【原创不易,请尊重版权】的代码,都必须等上这1秒。这种执行方式,转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。被成为阻塞式。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

同步、异步

首先,我们来看下同步、异步的概念。

【转载请注明来源】【本文首发于唐霜的博客】【本文受版权保护】

同步:所谓同步,就是在发出一个功能调用时【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。,在没有得到结果之前,该调用就不返回。

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【访问 www.tangshuang.n【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】et 获取更多精彩内容】【版权所有】唐霜 www.tangshu【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】ang.net

异步:发出一个功能调用时,不必得到结果,著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。继续往下处理。当一个异步过程调用发出后,【本文受版权保护】【版权所有,侵权必究】调用者不会立刻得到结果。实际处理这个调用未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】的部件是在调用发出后,通过状态、通知来通未经授权,禁止复制转载。【未经授权禁止转载】知调用者,或通过回调函数处理这个调用。

【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ang.net转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】ng.net【作者:唐霜】

我们下面用代码来演示一下:

【访问 www.tangshuang.n【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【转载请注明来源】
/* 同步 */
function send() {
  $result = mail('mail_to','subject','content'); // 调用,当mail函数没有得到结果时,不会执行下面的return
  return $result;
}
send(); // 调用,当send()函数没有得到结果时,不会执行下面的while
while(1) {}

可以看到,同步这种编程机制是大部分程序的原创内容,盗版必究。转载请注明出处:www.tangshuang.net一种机制,因为后面的代码往往依赖于前面的【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】代码结果,所以同步也是我们最常遇见的一种著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】编程机制。下面我们用javascript【转载请注明来源】转载请注明出处: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. 在时【原创内容,转载请注明出处】【版权所有,侵权必究】间上,异步调用仅消耗发出请求的时间,请求著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。发出后这个操作在时间上就结束。2. 必须原创内容,盗版必究。【原创内容,转载请注明出处】有回调。

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。ang.net著作权归作者所有,禁止商业用途转载。

我们在php开发的时候也有异步操作,但是【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】一般都是通过url回调实现的。举一个实际【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net中的开发案例,当我们使用支付宝SDK进行【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。支付相关开发时,通过SDK中的一些类构建转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】支付信息,并将该信息提交到支付宝服务器(【本文首发于唐霜的博客】【本文受版权保护】发出请求),不过这个时候,支付宝服务器会【原创不易,请尊重版权】【未经授权禁止转载】返回一个提交成功的信息给自己的服务器,你本文作者:唐霜,转载请注明出处。原创内容,盗版必究。就可以继续往下操作。在这个过程中没有异步【本文受版权保护】【版权所有】唐霜 www.tangshuang.net发生。当你的用户支付了这个订单,支付宝服转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】务器就会请求你提交的回调地址,而你则通过转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】这个回调url所支持的php,实现回调操未经授权,禁止复制转载。未经授权,禁止复制转载。作。这整个过程中,你的支付过程并没有要求【本文受版权保护】著作权归作者所有,禁止商业用途转载。必须得到支付成功(或失败)的结果数据,而【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。是通过回调地址来接收结果数据。因此,这个【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。场景也是一个异步操作。只不过,这不是由一本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net段程序完成的,而是多个php程序协同完成未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】的,而且在程序设计中,必须考虑用户的操作【未经授权禁止转载】【原创内容,转载请注明出处】习惯和耐心。

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

阻塞、非阻塞

阻塞和非阻塞,是对于程式而言的一种机制。

转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】ng.net【关注微信公众号:wwwtangshua【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】ngnet】

阻塞:一个调用未得到结果时,该线程被挂起【原创不易,请尊重版权】【本文受版权保护】,直到得到结果时再往下执行。

转载请注明出处:www.tangshua转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netng.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接【转载请注明来源】【关注微信公众号:wwwtangshuangnet】口返回的数据,当程式进展到获取数据这个位【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net置的时候,线程被挂起,直到获取api接口【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。返回数据,并被赋值给$data,才继续往转载请注明出处:www.tangshuang.net原创内容,盗版必究。下执行。

著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ngnet】
/* 非阻塞 */
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); }
}

这是参考php手册中实现的一个非阻塞模式【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。的实现方法,不过,其中需要注意的一个地方【未经授权禁止转载】本文作者:唐霜,转载请注明出处。是usleep(1000);实际上,这一未经授权,禁止复制转载。未经授权,禁止复制转载。句是不应该出现的,加上这一句,函数仍然会【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。挂起0.1秒,就不是非阻塞模式了,但是,【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。为了兼容一些情况,这里仍然加上它,但是,【转载请注明来源】本文版权归作者所有,未经授权不得转载。这和抓取接口数据,得到结果相比,只需要发本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】出请求所消耗的时间可谓少之又少。

【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。ang.net【转载请注明来源】【转载请注明来源】【转载请注明来源】

同步、异步和阻塞、非阻塞的区别

同步、异步形容的是调用的形式,阻塞、非阻原创内容,盗版必究。【本文受版权保护】塞形容的是调用的状态。一般同步和阻塞比较【未经授权禁止转载】转载请注明出处:www.tangshuang.net容易令人混淆,为了区分这两组概念,我们通本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。过对同一段代码的不同角度来看的方式进行阐未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net述。

【关注微信公众号:wwwtangshua未经授权,禁止复制转载。【作者:唐霜】ngnet】【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】ang.net【转载请注明来源】【关注微信公众号:wwwtangshua著作权归作者所有,禁止商业用途转载。【转载请注明来源】ngnet】

先看上文的第二段代码,从send()函数未经授权,禁止复制转载。【转载请注明来源】的调用来看,调用send()函数的形式我【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】们采用同步调用,而在程式执行过程中,se未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netnd()函数必须返回结果才能继续往下执行本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】,在执行send()函数的过程中调用ma【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。il()函数,线程是挂起的,我们称这种进【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。程状态为阻塞模式,而这种调用也可以成为阻本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。塞调用,因此可以看出,同步强调的是怎么调原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】用(形式),而阻塞强调调用状态。

著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】ang.net

再看上文提到的支付包SDK支付的例子。从未经授权,禁止复制转载。【转载请注明来源】功能的实现形式来看,它是异步调用,但是从【未经授权禁止转载】【版权所有,侵权必究】程式的状态来看,它则是阻塞模式,因为在支原创内容,盗版必究。未经授权,禁止复制转载。付的时候,必须得到支付宝服务器端的返回数【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。据,我们的服务器才能知道支付是否成功,进【原创不易,请尊重版权】【未经授权禁止转载】而做下一步判断。再看jquery中的$.【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】ajax(),从调用形式上看,它的异步调【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net用,无需立即得到结果,而是通过回调函数来【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】执行异步得到结果时的动作;从程式的状态来【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】看,它是非阻塞模式,在程式执行过程中,无未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】论$.ajax是否得到结果,其下方的代码原创内容,盗版必究。【本文受版权保护】都会立即执行。

【访问 www.tangshuang.n【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】et 获取更多精彩内容】【转载请注明来源】【本文首发于唐霜的博客】原创内容,盗版必究。

PHP中进程分支

首先,什么是进程分支,它要解决什么问题?

本文作者:唐霜,转载请注明出处。【作者:唐霜】转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。ng.net

分支的概念,在我们了解git的之后,应该【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。都是理解的。进程分支就是和这种分支概念是本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。一样的,但是在操作上并没有那么复杂。ph转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。p中本身是没有这种进程分支的,因此要我们本文作者:唐霜,转载请注明出处。【未经授权禁止转载】自己来设计。它和多进程是不同的两种思路,【版权所有】唐霜 www.tangshuang.net【本文受版权保护】多进程是指多管齐下,而且各个进程之间可以著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net相互通信。但是进程分支强调的是,从一个主本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】进程分出一个支进程,完成特定的任务,在必本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】要的情况下,又重新合并到主进程,主进程和著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】支进程之间可能存在一定的数据依赖关系。

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshua【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。ngnet】

上图描述的是一种特殊的进程分支状态,用来【作者:唐霜】原创内容,盗版必究。回答进程分支可以解决什么问题。在我们以往未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。所有的php异步实现中,必须依赖两段几乎【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。完全分离的代码来实现,异步回调都是必须新【未经授权禁止转载】【原创不易,请尊重版权】起一段代码,无论是在同一个php文件中通本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。过url参数来进行判断,还是另外写一个新原创内容,盗版必究。原创内容,盗版必究。的php文件。而进程分支,主要解决的,就原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。php的异步回调问题。

著作权归作者所有,禁止商业用途转载。【本文受版权保护】

php多进程和多线程

首先,简单区分一下进程和线程。

【访问 www.tangshuang.n【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】et 获取更多精彩内容】【本文受版权保护】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

进程是一个程序赖以存在与内存中的基础,一【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net个程序启动了,就会在内存中划分内存区域,未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。保存一些变量之类的,它可能还要依赖系统环【本文受版权保护】本文作者:唐霜,转载请注明出处。境,其他应用程序,以及cpu,这一系列的【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net系统资源消耗的总和,被称为进程。但是,一【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。个应用程序可以是多进程应用。单进程应用你原创内容,盗版必究。【本文首发于唐霜的博客】只能开启一次,比如qq客户端,Photo【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netshop等,而有些应用可以同时开多个,比【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。如记事本、浏览器等,但是这并不意味着它是【本文受版权保护】【版权所有,侵权必究】多进程应用,它仅仅是开启多个独立的进程来本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。支撑其每个独立窗口的运行而已,多进程应用【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。的意思是,开启应用之后,它会启用多个进程【作者:唐霜】【版权所有,侵权必究】进行处理,也就是同一时间存在多个进程。

著作权归作者所有,禁止商业用途转载。【本文受版权保护】

线程是比进程更小的单位,它是某个指令相关【转载请注明来源】未经授权,禁止复制转载。的一组联系较为紧密的系统资源的集合,包括【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net该指令相关的指针、栈、寄存器、私有数据区未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net

【本文受版权保护】未经授权,禁止复制转载。

一个进程可以包含多个线程,多个线程组成一原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。个进程,进程与进程之间互不干扰(可以通信本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net),线程与线程之间(同一进程)可以互用资【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。源,不同进程之间的线程没有半毛钱关系。

【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。ngnet】【未经授权禁止转载】转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。ng.net

其次,php的进程和线程。

【关注微信公众号:wwwtangshua转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。ngnet】【本文受版权保护】【访问 www.tangshuang.n【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】et 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

php也是应用程序,它本身无需依赖apa未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netche或php-fpm才能运行,直接使用【本文受版权保护】【作者:唐霜】php也能运行我们撰写好的php文件。对【本文受版权保护】本文版权归作者所有,未经授权不得转载。于这个应用程序而言,它是单线程的,这就意【转载请注明来源】著作权归作者所有,禁止商业用途转载。味着,每一个php进程内只有一个线程。

【访问 www.tangshuang.n【本文首发于唐霜的博客】【作者:唐霜】et 获取更多精彩内容】【访问 www.tangshuang.n【版权所有,侵权必究】【原创不易,请尊重版权】et 获取更多精彩内容】【原创不易,请尊重版权】未经授权,禁止复制转载。

但是,不幸的是,我们的web服务器按照自本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】己的设定来调用php应用执行php代码,【版权所有】唐霜 www.tangshuang.net【转载请注明来源】实际上,php的进程是和web服务器,a【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。pache或php-fpm等的调用来控制【转载请注明来源】未经授权,禁止复制转载。的。当一个用户访问url时,web服务器【转载请注明来源】【本文首发于唐霜的博客】决定开启多少进程来执行php,一般而言,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。都只有一个,所以最终,httpd或php【本文受版权保护】【本文首发于唐霜的博客】-fpm的进程数量也就变成了服务器提供的本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】响应进程数量,也就是说后端php到底多少【未经授权禁止转载】本文作者:唐霜,转载请注明出处。进程数,对于服务器而言没有多大的意义,相原创内容,盗版必究。【未经授权禁止转载】反httpd或php-fpm的进程数,则【本文首发于唐霜的博客】【原创不易,请尊重版权】决定了消耗多少系统资源。

未经授权,禁止复制转载。【访问 www.tangshuang.n著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。et 获取更多精彩内容】【关注微信公众号:wwwtangshua【作者:唐霜】【原创内容,转载请注明出处】ngnet】【本文受版权保护】

最后,php的多进程和多线程。

转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】ng.net未经授权,禁止复制转载。未经授权,禁止复制转载。【未经授权禁止转载】

据了解,在php中,也有一些工具可以实现【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。php的多进程和多线程,下面简单讨论一下本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。

原创内容,盗版必究。【版权所有,侵权必究】【版权所有,侵权必究】【版权所有,侵权必究】

pcntl_fork简捷的实现子进程

未经授权,禁止复制转载。【访问 www.tangshuang.n【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】et 获取更多精彩内容】【本文首发于唐霜的博客】

需要通过phpize安装pcntl模块,本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net它可以创建子进程,并且可以根据进程情况执转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。行不同的代码:

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】未经授权,禁止复制转载。转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】ng.net
$pid = pcntl_fork();
if($pid > 0){ //父进程代码
  exit(0);
}
elseif($pid == 0) { //子进程代码
  exit(0);
}

这种情况下,你会发现httpd或php-【转载请注明来源】本文版权归作者所有,未经授权不得转载。fpm的进程会增加,也就是说,pcntl【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。其实是通过重新开启php进程,并通过其他原创内容,盗版必究。【本文首发于唐霜的博客】机制实现进程之间的通信的。

【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【本文受版权保护】

proc_open,popen也是利用h【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】ttpd来实现多进程

【本文首发于唐霜的博客】【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ngnet】【未经授权禁止转载】
$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 获取更多精彩内容】未经授权,禁止复制转载。多数虚拟主机上是实现不了的。而大部分主机【本文受版权保护】【关注微信公众号:wwwtangshuangnet】可以实现socket,简单的说就是通过p本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。hp代码来再发起一个非阻塞模式的(url转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net)请求,相当于在访客访问你写的php页面著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。的同时,你的这个php文件中,也有一个新【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。的访问,从而在目标页面执行另外一个任务,【本文首发于唐霜的博客】【转载请注明来源】这也可以被认为是多进程。实际上,这个时候【本文受版权保护】【作者:唐霜】,也是会增加httpd或php-fpm的【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。进程数,与上面的方法殊途同归。

原创内容,盗版必究。原创内容,盗版必究。【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。et 获取更多精彩内容】

多线程

本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】未经授权,禁止复制转载。

PHP官方没有提供多线程的扩展,pecl原创内容,盗版必究。本文作者:唐霜,转载请注明出处。中有一个pthreads扩展提供了多线程著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】的特性,关于pthreads,可以在ph【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。p官方文档具体去了解。

转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。ng.net本文版权归作者所有,未经授权不得转载。【作者:唐霜】【访问 www.tangshuang.n【作者:唐霜】原创内容,盗版必究。et 获取更多精彩内容】

php异步回调

使用场景:我创建了一个自动备份的脚本,自【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】动备份有这么几个步骤:查询数据库,并把查【转载请注明来源】【作者:唐霜】询结果备份为.sql文件;把这些.sql本文作者:唐霜,转载请注明出处。【未经授权禁止转载】文件压缩为一个.zip;通过接口,将该.【本文受版权保护】【未经授权禁止转载】zip文件上传到云盘保存。

转载请注明出处:www.tangshua【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ng.net转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。【本文受版权保护】ng.net

这个过程很消耗服务器资源,每一步都面临服【版权所有】唐霜 www.tangshuang.net【本文受版权保护】务器资源耗尽而被抛出500以上的服务器错【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】误,导致备份失败。有没有一种方法,在程序【原创内容,转载请注明出处】原创内容,盗版必究。执行过程中,可以不要立即去执行上面的步骤【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net,而是一步一步的完成,每一步基于上一步的未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。结果,但是不在同一个进程中全部执行完,而【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】是分阶段执行,每一个步骤执行完之后,可以未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。释放掉内存,从而可以节省服务器资源。

【原创内容,转载请注明出处】转载请注明出处:www.tangshua【本文受版权保护】【版权所有,侵权必究】ng.net

如果是用户操作界面,我们可以通过java【作者:唐霜】本文作者:唐霜,转载请注明出处。script来控制,通过$.ajax的回【未经授权禁止转载】未经授权,禁止复制转载。调来实现。通过ajax去请求第一个步骤所未经授权,禁止复制转载。【本文受版权保护】在的页面,得到结果后,在回调函数中继续去【未经授权禁止转载】转载请注明出处:www.tangshuang.net请求第二个步骤所在的页面,在得到结果后,未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。再在回调函数中去请求第三个步骤所在的页面著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,如此写下去。每一个ajax请求仅会调起【作者:唐霜】【转载请注明来源】一个php进程,上一个进程会被释放,因此著作权归作者所有,禁止商业用途转载。【本文受版权保护】执行时间仅算一个进程的,内存也会被释放掉【原创内容,转载请注明出处】【原创不易,请尊重版权】,服务器压力就小了很多。

【本文受版权保护】未经授权,禁止复制转载。【本文受版权保护】原创内容,盗版必究。

可是我们无法通过服务器本身来触发页面内的【版权所有,侵权必究】【未经授权禁止转载】$.ajax请求,而php本身没有aja未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】x的回调函数类似的操作。这才是我们本文的原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。最终核心点,我们试图构建一个模型,可以实【转载请注明来源】本文版权归作者所有,未经授权不得转载。现类似$.ajax的回调函数一样的代码模著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。型。

【本文首发于唐霜的博客】【访问 www.tangshuang.n【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

事件、监听和回调

首先,让我们通过jquery来先梳理一下著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。事件、监听和回调的一些场景。

未经授权,禁止复制转载。原创内容,盗版必究。

事件:名词,导致状态发生变化的触发。进程转载请注明出处:www.tangshuang.net【未经授权禁止转载】中任何一次变化,都有可能是事件,关键在于【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。我们如何定义我们需要的事件。例如在jqu【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netery中click mouseenter本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net blur scroll等等,都是事件。

【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】【原创内容,转载请注明出处】

监听:动词,主动监测事件是否发生。进程中【未经授权禁止转载】【原创不易,请尊重版权】的所有事件一旦发生,一定会引起一些变化,【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】而能够监测到这些事件是否发生,需要通过我【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。们手工去写代码来实现。例如jquery中【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。,当click事件发生时,浏览器会得到该【作者:唐霜】本文作者:唐霜,转载请注明出处。事件,并由jquery库中的一段代码来判本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net断该事件是否发生。

本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.n【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】【版权所有,侵权必究】【本文受版权保护】

回调:动词,当监听到事件发生时,所采取的【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】行为。一般而言,回调通过函数实现,通过传转载请注明出处:www.tangshuang.net【版权所有,侵权必究】入一个函数给监听作为参数,即可在监听到该本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】事件时,执行该回调函数。

【作者:唐霜】未经授权,禁止复制转载。转载请注明出处:www.tangshua【作者:唐霜】著作权归作者所有,禁止商业用途转载。ng.net

让我们来看下jquery中的经典代码:

【版权所有】唐霜 www.tangshu【转载请注明来源】【转载请注明来源】ang.net原创内容,盗版必究。
$(document).ready(function(){
  $('a').on('click',function(){
    $(this).attr('target','_blank');
  });
});

上面这段jquery代码,是给a标签绑定转载请注明出处:www.tangshuang.net【转载请注明来源】一个事件监听的过程,其中,要监听的事件为未经授权,禁止复制转载。【本文首发于唐霜的博客】click,当click事件发生时,执行本文版权归作者所有,未经授权不得转载。【作者:唐霜】function中的代码,而绑定使用了o【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。n(event,call_fun)来实现未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netngnet】本文作者:唐霜,转载请注明出处。

php中的事件绑定和监听

从上面这节的叙述来看,实际上,我们真正需著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。要事件的,是事件的绑定和监听两个动作。我本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。们来举一个例子,假如存在下面这种php代【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。码:

【作者:唐霜】著作权归作者所有,禁止商业用途转载。
<?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作为回调函数。

【关注微信公众号:wwwtangshua【未经授权禁止转载】【作者:唐霜】ngnet】【作者:唐霜】未经授权,禁止复制转载。

php中的钩子机制

本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。原创内容,盗版必究。转载请注明出处:www.tangshua【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】ng.net

在很多php框架中加入了钩子机制(hoo【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。k),也就是在原始的完整的代码流程中,加【本文首发于唐霜的博客】【本文首发于唐霜的博客】入一些挂载点,通过在这些挂载点加入一些处未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】理函数,实现在代码流程中自由的增加新功能【版权所有】唐霜 www.tangshuang.net【本文受版权保护】。比如wordpress中的add_ac本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.nettion和add_filter,比如th本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netinkphp中的\Think\Hook。而这种钩子机制,完全可以实现我们上面所原创内容,盗版必究。【作者:唐霜】提出来的监听绑定和回调。

转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netng.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

php的回调函数,可以参考这篇文章

【原创不易,请尊重版权】转载请注明出处:www.tangshua【本文受版权保护】本文作者:唐霜,转载请注明出处。ng.net

php进程分支的最终实现

但是,最最最大的问题,在于,我们无法做到【版权所有,侵权必究】【本文首发于唐霜的博客】在这种钩子机制中异步回调。这是我们本文最【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】大的问题,核心问题和终极目标。

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshu【转载请注明来源】本文版权归作者所有,未经授权不得转载。ang.net未经授权,禁止复制转载。【作者:唐霜】

我们仍然要回到jquery的$.ajax原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。,我们即使有了php的钩子机制,仍然无法【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。做到像jquery那样,非阻塞的实现异步原创内容,盗版必究。【本文首发于唐霜的博客】回调。我们究竟如何来实现这个过程呢?

【关注微信公众号:wwwtangshua【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netngnet】【版权所有,侵权必究】【版权所有】唐霜 www.tangshu【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】ang.net【作者:唐霜】

我专门写了一个项目,来实现这个过程,你可【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。以在github上fork这个项目通过里面的代码来了解我【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。的实现方法,该方法不需要特殊的服务器配置【作者:唐霜】【版权所有,侵权必究】,甚至可以在大部分虚拟主机上跑。

【本文首发于唐霜的博客】【转载请注明来源】【未经授权禁止转载】【版权所有】唐霜 www.tangshu【作者:唐霜】本文作者:唐霜,转载请注明出处。ang.net

我们来看下一个延时操作是怎么实现的:

原创内容,盗版必究。【本文受版权保护】【访问 www.tangshuang.n转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netet 获取更多精彩内容】【原创不易,请尊重版权】
<?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文件内部【作者:唐霜】著作权归作者所有,禁止商业用途转载。实现回调操作,而无需另外写php文件来实转载请注明出处:www.tangshuang.net【本文受版权保护】现,这和javascript实现setT本文作者:唐霜,转载请注明出处。【本文受版权保护】imeout()的效果是一样的(虽机制不原创内容,盗版必究。【未经授权禁止转载】同)。

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【版权所有】唐霜 www.tangshu本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。ang.net转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.netng.net

2016-02-18 9732

为价值买单,打赏一杯咖啡

本文价值97.32RMB