您现在的位置是:主页 > news > 西安网站维护兼职/南宁百度seo推广

西安网站维护兼职/南宁百度seo推广

admin2025/6/24 5:18:08news

简介西安网站维护兼职,南宁百度seo推广,各大行业网站,石家庄鹿泉网站建设php多进程开发不适合于WEB开发,主要是用于的任务处理,比如对前端提交的数据进行入库或者计算等,php多进程模块依赖php中的pcntl扩展,此扩展在Windows平台上是不可用的。我这里今天只用一个很简单的例子。功能:使用php启…

西安网站维护兼职,南宁百度seo推广,各大行业网站,石家庄鹿泉网站建设php多进程开发不适合于WEB开发,主要是用于的任务处理,比如对前端提交的数据进行入库或者计算等,php多进程模块依赖php中的pcntl扩展,此扩展在Windows平台上是不可用的。我这里今天只用一个很简单的例子。功能:使用php启…

php多进程开发不适合于WEB开发,主要是用于的任务处理,比如对前端提交的数据进行入库或者计算等,php多进程模块依赖php中的pcntl扩展,此扩展在Windows平台上是不可用的。我这里今天只用一个很简单的例子。

功能:使用php启动两个单独进程向redis写入数据,每个进程写10条数据然后关闭此进程,重新启一个进程再进行写。新建一个test.php文件,代码及解释如下:

// 必须加载扩展if(!function_exists("pcntl_fork")){exit("pcntl extention is must !");}//初始化一些参数$worker_pids=array();$running=true;posix_setsid();declare(ticks=1);//记录循环$cirle=0;while($running){//只启动两个进程if(count($worker_pids)==2){$child_id=pcntl_wait($status);if($child_id>0){unset($worker_pids[$child_id]);}}$cirle++;$pid=pcntl_fork();//子进程创建失败if($pid==-1){exit("无法产生子进程!");//成功创建子进程}elseif($pid){$worker_pids[$pid]=$pid;// 子进程逻辑}else{$test=newstdClass();$test->num=0;while($running&&$test->num<5){$redis=newRedis();$redis->connect('192.168.90.123',6380);$ppid=posix_getpid();$redis->set('key_'.time(),$cirle.'__'.$ppid);$test->num++;echo $cirle.'__'.$ppid."\n";print_r($worker_pids);sleep(2);}//退出进程exit();}}使用php执行以上文件,redis中的数据插入截图如下,从图中可以看到11022和11023在插入5条redis数据之后就exit,然后就生成11026和11027进程来插入数据。cirle的值也由1,2变成了3,4.

697bae89a9e6fb456cae776624c0c558.png

下图是在执行php的时候,可以查看到php的相关进程。见框里的进程ID值:

74a13a30d5b64401b9502b838647e39d.png

这里只是做为一个实验来实现php多进程的目的,用到的函数也不多,主要有posix_setsid,pcntl_wait,和pcntl_fork,php里是使用posix_setsid()来在这个子进程中创建会话,使得这个进程成为会话组组长,从而脱离启动的进程。在上面执行命令的时候如果带上&进入后台执行的话,关闭窗口命令依然会执行,效果就像和nohup一样,实际就是php在内部脱离了启动进程自己启动了单独的管理进程以及业务进程。pcntl_fork即是用来创建子进程的,而pcntl_wait($status,WUNTRACED);则是用来等待子进程的信号。

这个功能在数据采集、邮件群发、数据源更新、消化队列等业务中很常用,可以应对大规模的消化队列场景,那样就不是这么简单,需要进行异常管理、信号处理函数、及进程控制(特别是僵尸进程的处理)及扩展考虑等。