注意:异步子进程功能只能用在linux系统服务器才生效,并且要开启`pcntl`这个PHP扩展,但不影响windows执行,也就是说,windows服务器虽然不生效,但代码还是会执行的,只不过不能分子进程异步执行,而是同步执行,就是需要用户等待更长的时间而已 ***** 对于很耗时的,不需要用户交互的功能,比如用户回复贴子需要公众号或者手机信息或邮件通知楼主(这些都非常耗时的),同时还需要更新网站的今日发贴数,这些对回贴人来说,根本就不需要马上看到的效果,而程序处理起来又可能很耗时,就可以考虑开启子进程。 关键点有两个:其一,用户并不需要马上看到执行效果,其二,可能比较耗时。这个时候就可以考虑采用子进程了。 下面拿一个图讲解 ![](https://img.kancloud.cn/4b/25/4b250ff2cdc1f9e8d3eccde3540f1de8_1467x647.png) 其中`fork_set();` 函数后面的代码就开始进行子进程。这个函数前面的代码就是用户当前所等待执行的。 ![](https://img.kancloud.cn/f8/97/f8972254cbe91e778ad55d426160e3bf_1071x533.png) 如下图所示,从`fork_set()` 函数这个位置开始就启用子进程。你把耗时的,不需要用户关注的功能就放在子进程里,让他在后台异步执行。需要用户得到响应的结果,就要放在主进程里同步执行反馈给用户。 至于`fork_set()` 函数最好放在哪个位置呢? 一般放在用户提交数据入库以后那个分界点,因为入库前都需要做判断。并且也不能允许它重复入库。所以最合理的位置就是入库之后那个分界点。 异步子进程更适合POST数据,取数据的话不是很适合。 通过 `fork_main()`==true 可以判断是主进程 ,通过`fork_son()`==true 可以判断是子进程。 写代码的时候,只能这样写 ~~~ if( fork_main()){ //执行代码 } 或者 if( fork_main()==true){ //执行代码 } if( fork_son()){ //执行代码 } 或者 if( fork_son()==true){ //执行代码 } ~~~ 绝对不可以按下面的方法处理,也就是说不能判断为非这种情况,必须按是来判断,不能按非来判断。 ~~~ if( !fork_main()){ //执行代码 } if( fork_main()==false){ //执行代码 } if( fork_son()==false){ //执行代码 } if( !fork_son()){ //执行代码 } ~~~ 特别提醒,`fork_set()` 函数后面的代码如果不做判断的话,主进程与子进程都会同时执行,如果有入库的话,会导致重复入库,这一点务必要注意!!! 所以对于入库的操作必须要做判断处理。不入库的代码,取数据的代码,重复执行是没问题的。 `fork_set()` 函数前面的代码,就只执行一次,子进程不会单独再去执行。子进程只会从`fork_set()` 函数的后面开始执行。是异步开启一个进程去执行。`fork_set()` 函数前是什么变量值,子进程会继续沿用。子进程修改后的变量值不会影响到主进程,`fork_set()` 函数后的逻辑与变量,主进程 与子进程他们是互相隔离的。