成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

php 的多進(jìn)程操作實(shí)踐案例分析

瀏覽:226日期:2022-09-11 13:01:58

本文實(shí)例講述了php 的多進(jìn)程操作。分享給大家供大家參考,具體如下:

php的多進(jìn)程處理依賴于pcntl擴(kuò)展,通過pcntl_fork創(chuàng)建子進(jìn)程來進(jìn)行并行處理。

例1如下:

<?php$pid = pcntl_fork();if($pid == -1) { //錯(cuò)誤處理:創(chuàng)建子進(jìn)程失敗時(shí)返回-1. die(’fork error’);} else if ($pid) { //父進(jìn)程會(huì)得到子進(jìn)程號(hào),所以這里是父進(jìn)程執(zhí)行的邏輯 echo 'parent n'; //等待子進(jìn)程中斷,防止子進(jìn)程成為僵尸進(jìn)程。 pcntl_wait($status);} else { //子進(jìn)程得到的$pid為0, 所以這里是子進(jìn)程執(zhí)行的邏輯。 echo 'child n'; exit;}

pcntl_fork創(chuàng)建了子進(jìn)程,父進(jìn)程和子進(jìn)程都繼續(xù)向下執(zhí)行,而不同是父進(jìn)程會(huì)獲取子進(jìn)程的$pid也就是$pid不為零。而子進(jìn)程會(huì)獲取$pid為零。通過if else語句判斷$pid我們就可以在指定位置寫上不同的邏輯代碼。

上述代碼會(huì)分別輸出parent和child。那么輸出的parent和child是否會(huì)有順序之分?是父進(jìn)程會(huì)先執(zhí)行?

例2如下:

<?php$pid = pcntl_fork();if($pid == -1) { die(’fork error’);} else if ($pid) { sleep(3); echo 'parent n'; pcntl_wait($status);} else { echo 'child n'; exit;}

我們在父進(jìn)程中通過sleep來延緩執(zhí)行,看看效果。

結(jié)果是,很快輸出了child,等待了接近3秒后,才輸出parent。所以父進(jìn)程和子進(jìn)程的執(zhí)行是相對獨(dú)立的,沒有先后之分。

那么問題又來了?pcntl_wait是做什么用的?會(huì)掛起當(dāng)前進(jìn)程,直到子進(jìn)程退出,如果子進(jìn)程在調(diào)用此函數(shù)之前就已退出,此函數(shù)會(huì)立刻返回。子進(jìn)程使用的資源將被釋放。

例3如下:

<?php$pid = pcntl_fork();if($pid == -1) { die(’fork error’);} else if ($pid) { pcntl_wait ($status); echo 'parent n';} else { sleep(3); echo 'child n'; exit;}

上述代碼,我們可以看到,父進(jìn)程執(zhí)行pcntl_wait時(shí)就已經(jīng)掛起,直到等待3秒后輸出child,子進(jìn)程退出后。父進(jìn)程繼續(xù)執(zhí)行,輸出parent。

例4如下:

<?phpdefine(’FORK_NUMS’, 3);$pids = array();for($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if($pids[$i] == -1) { die(’fork error’); } else if ($pids[$i]) { pcntl_waitpid($pids[$i], $status); echo 'pernet n'; } else { sleep(3); echo 'child id:' . getmypid() . ' n'; exit; }}

上述代碼,我們創(chuàng)建3個(gè)子進(jìn)程,父進(jìn)程分別掛起等待子進(jìn)程結(jié)束后,輸出parent。

輸出結(jié)果如下:

child id:19090pernetchild id:19091pernetchild id:19092pernet

例5如下:

<?phpdefine(’FORK_NUMS’, 3);$pids = array();for($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if($pids[$i] == -1) { die(’fork error’); } else if ($pids[$i]) { } else { sleep(3); echo 'child id:' . getmypid() . ' n'; exit; }}foreach($pids as $k => $v) { if($v) { pcntl_waitpid($v, $status); echo 'parent n'; }}

輸出結(jié)果如下:

child id:19118child id:19119child id:19120parentparentparent

為什么上述代碼跟例4的輸出結(jié)果不一樣?

我們可以看到例5的pcntl_waitpid函數(shù)放在了foreach中,foreach代碼是在主進(jìn)程中,也就是父進(jìn)程的代碼中。當(dāng)執(zhí)行foreach時(shí),可能子進(jìn)程已經(jīng)全部執(zhí)行完畢并退出。pcntl_waitpid會(huì)立刻返回,連續(xù)輸出三個(gè)parent。

(*在子進(jìn)程中,需通過exit來退出,不然會(huì)產(chǎn)生遞歸多進(jìn)程,父進(jìn)程中不需要exit,不然會(huì)中斷多進(jìn)程。)

例6如下:

<?phpdefine(’FORK_NUMS’, 3);$pids = array();$fp = fopen(’./test.log’, ’wb’);$num = 1;for($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if($pids[$i] == -1) { die(’fork error’); } else if ($pids[$i]) { } else { for($i = 0; $i < 5; ++$i) { flock($fp, LOCK_EX); fwrite($fp, getmypid() . ’ : ’ . date(’Y-m-d H:i:s’) . ' : {$num} rn'); flock($fp, LOCK_UN); echo getmypid(), ': success rn'; ++$num; } exit; }}foreach($pids as $k => $v) { if($v) { pcntl_waitpid($v, $status); }}fclose($fp);

代碼如上:我們創(chuàng)建三個(gè)子進(jìn)程,來同時(shí)向test.log文件寫入內(nèi)容,test.log內(nèi)容如下:

19507 : 2016-03-16 20:40:52 : 119507 : 2016-03-16 20:40:52 : 219507 : 2016-03-16 20:40:52 : 319507 : 2016-03-16 20:40:52 : 419507 : 2016-03-16 20:40:52 : 519509 : 2016-03-16 20:40:52 : 119509 : 2016-03-16 20:40:52 : 219509 : 2016-03-16 20:40:52 : 319509 : 2016-03-16 20:40:52 : 419509 : 2016-03-16 20:40:52 : 519508 : 2016-03-16 20:40:52 : 119508 : 2016-03-16 20:40:52 : 219508 : 2016-03-16 20:40:52 : 319508 : 2016-03-16 20:40:52 : 419508 : 2016-03-16 20:40:52 : 5

我們可以看到三個(gè)子進(jìn)程的pid,它們分別執(zhí)行了5次,時(shí)間幾乎是在同時(shí)。但是$num的值并沒像我們期望的那樣從1-15進(jìn)行遞增。子進(jìn)程中的變量是各自獨(dú)立的,互不影響。子進(jìn)程會(huì)自動(dòng)復(fù)制父進(jìn)程空間里的變量。

如何在進(jìn)程中共享數(shù)據(jù)?

我們通過php的共享內(nèi)存函數(shù)shmop來實(shí)現(xiàn)。

<?phpdefine(’FORK_NUMS’, 3);$pids = array();$fp = fopen(’./test.log’, ’wb’);$num = 1;//共享內(nèi)存段的key$shmKey = 123;//創(chuàng)建共享內(nèi)存段$shmId = shmop_open($shmKey, ’c’, 0777, 64);//寫入數(shù)據(jù)到共享內(nèi)存段shmop_write($shmId, $num, 0);for($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if($pids[$i] == -1) { die(’fork error’); } else if ($pids[$i]) { //阻塞,等待子進(jìn)程退出 //注意這里,如果是非阻塞的話,$num的計(jì)數(shù)會(huì)出現(xiàn)問題。 pcntl_waitpid($pids[$i], $status); } else { //讀取共享內(nèi)存段中的數(shù)據(jù) $num = shmop_read($shmId, 0, 64); for($i = 0; $i < 5; ++$i) { fwrite($fp, getmypid() . ’ : ’ . date(’Y-m-d H:i:s’) . ' : {$num} rn'); echo getmypid(), ': success rn'; //遞增$num $num = intval($num) + 1; } //寫入到共享內(nèi)存段中 shmop_write($shmId, $num, 0); exit; }}//shmop_delete不會(huì)實(shí)際刪除該內(nèi)存段,它將該內(nèi)存段標(biāo)記為刪除。shmop_delete($shmId);shmop_close($shmId);fclose($fp);

上述代碼的運(yùn)行結(jié)果如下:

19923 : 2016-03-17 00:05:18 : 119923 : 2016-03-17 00:05:18 : 219923 : 2016-03-17 00:05:18 : 319923 : 2016-03-17 00:05:18 : 419923 : 2016-03-17 00:05:18 : 519924 : 2016-03-17 00:05:18 : 619924 : 2016-03-17 00:05:18 : 719924 : 2016-03-17 00:05:18 : 819924 : 2016-03-17 00:05:18 : 919924 : 2016-03-17 00:05:18 : 1019925 : 2016-03-17 00:05:18 : 1119925 : 2016-03-17 00:05:18 : 1219925 : 2016-03-17 00:05:18 : 1319925 : 2016-03-17 00:05:18 : 1419925 : 2016-03-17 00:05:18 : 15

這樣我們就在進(jìn)程間共享了$num的數(shù)據(jù)。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。

標(biāo)簽: PHP
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产欧美1区2区3区| 久久大逼视频| 亚洲黄色高清| 欧美精品一区二区三区四区 | 欧美国产国产综合| proumb性欧美在线观看| 91精品国产aⅴ一区二区| 精品一区二区免费视频| 欧美日韩日日摸| 国产一区二区视频在线| 欧美丝袜丝交足nylons图片| 六月丁香婷婷色狠狠久久| 日本电影亚洲天堂一区| 人妖欧美一区二区| 91黄色免费观看| 麻豆精品一区二区综合av| 91久久人澡人人添人人爽欧美| 日本视频一区二区| 欧美亚洲一区三区| 国产一区二区三区av电影| 欧美一区二区二区| av网站一区二区三区| 久久久五月婷婷| 国产一区二区三区四区三区四| 国产日韩精品视频一区| 国产一区二区三区四区hd| 亚洲视频一区在线| 国产欧美午夜| 亚洲国产成人av| 91久久一区二区| 精品亚洲国内自在自线福利| 在线成人午夜影院| 成人白浆超碰人人人人| 国产亚洲一区字幕| 狠狠入ady亚洲精品经典电影| 国产精品美女一区二区三区| 亚洲免费黄色| 爽爽淫人综合网网站| 欧美日韩在线三级| 成人天堂资源www在线| 欧美国产成人精品| 一本色道久久综合亚洲精品婷婷| 亚洲最色的网站| 精品国产一区二区亚洲人成毛片| 91网站最新地址| 国产精品乱码一区二区三区软件 | 亚洲国产影院| 亚洲一二三区不卡| 欧美影视一区二区三区| 国产成人免费在线| 国产精品网站在线| 亚洲日本视频| 日韩不卡在线观看日韩不卡视频| 欧美无砖专区一中文字| 成人晚上爱看视频| 专区另类欧美日韩| 日本电影亚洲天堂一区| 国产成人av电影免费在线观看| 久久精品网站免费观看| 国产一级久久| 极品少妇一区二区| 国产视频一区二区在线| 亚洲中字黄色| 国产东北露脸精品视频| 国产精品理论片在线观看| 久久综合狠狠| 成人av免费在线播放| 亚洲日本va午夜在线影院| 一本久久a久久精品亚洲| 高清日韩电视剧大全免费| 国产精品免费视频观看| 91久久国产综合久久| 国产黄色91视频| 1000部国产精品成人观看| 色视频欧美一区二区三区| jlzzjlzz欧美大全| 亚洲一级二级三级| 日韩免费观看高清完整版在线观看| 亚洲国产欧美不卡在线观看| 久久国产麻豆精品| 国产农村妇女毛片精品久久麻豆| 亚洲一区二区高清视频| 国产精品自拍av| 亚洲另类在线一区| 91精品国产91久久久久久一区二区| 亚洲无毛电影| 韩国av一区二区三区在线观看| 欧美韩国日本综合| 欧美在线小视频| 欧美成人嫩草网站| 日本视频一区二区| 久久婷婷久久一区二区三区| 久久看片网站| 91麻豆高清视频| 日本aⅴ免费视频一区二区三区| 久久综合色一综合色88| 免费日韩精品中文字幕视频在线| 国产凹凸在线观看一区二区| 亚洲激情av在线| 日韩免费高清av| 久久婷婷丁香| 欧美日韩在线播放一区二区| 美女视频黄免费的久久 | 欧美不卡视频| 日本在线不卡视频一二三区| 欧美极品少妇xxxxⅹ高跟鞋 | 一区在线视频观看| 激情五月播播久久久精品| 亚洲人123区| 日韩欧美一级精品久久| 国产偷国产偷亚洲高清97cao| 成人精品一区二区三区四区| 午夜国产不卡在线观看视频| 亚洲国产高清在线观看视频| 91超碰这里只有精品国产| 中国女人久久久| 91捆绑美女网站| 极品少妇一区二区| 亚洲国产欧美日韩另类综合| 国产女同性恋一区二区| 在线观看91av| 蜜乳av另类精品一区二区| 欧美精品一区在线发布| 国产精品一区专区| 亚洲成人资源在线| 欧美国产97人人爽人人喊| 91精品久久久久久久久99蜜臂| 久久精品麻豆| 激情自拍一区| 色综合婷婷久久| 国产电影精品久久禁18| 日本视频一区二区三区| 亚洲免费观看在线视频| 国产校园另类小说区| 日韩视频一区二区| 欧美区一区二区三区| 久久久久久一区二区| 一本色道久久综合一区| 欧美极品一区| 99综合电影在线视频| 国产在线播精品第三| 日韩精品一二三| 亚洲综合在线五月| 亚洲欧洲综合另类| 亚洲国产精品黑人久久久 | 亚洲综合色网站| 国产精品久久久久久久久免费樱桃 | 色欧美片视频在线观看在线视频| 亚洲视频免费| aaa欧美色吧激情视频| 国产成人综合在线播放| 极品销魂美女一区二区三区| 日本免费新一区视频| 婷婷开心激情综合| 亚洲女爱视频在线| 中文字幕一区二区三区在线不卡| 久久久亚洲精品一区二区三区| 日韩欧美一级片| 日韩一区二区三区视频在线观看| 欧美艳星brazzers| 色美美综合视频| 色悠久久久久综合欧美99| 久久xxxx| 国产精品久久久一区二区三区| 日韩视频在线播放 | 欧美日韩国产系列| 欧美亚洲图片小说| 欧美性三三影院| 欧美性猛交xxxx黑人交| 在线观看av一区| 在线视频欧美精品| 欧美在线小视频| 欧美日韩一区二区三区高清 | 国产精品久久免费看| 中文字幕国产一区| 亚洲国产高清aⅴ视频| 国产清纯在线一区二区www| 久久久久99精品国产片| 国产区在线观看成人精品| 中文字幕成人av| 国产精品激情偷乱一区二区∴| 中文字幕在线不卡| 亚洲欧美偷拍卡通变态| 一区二区三区在线视频观看| 亚洲一区影音先锋| 亚洲一区二区三区四区的| 亚洲成人综合网站| 青椒成人免费视频| 久久精品国产亚洲5555| 久久人人97超碰国产公开结果| 一本一道综合狠狠老| 久久久久国产精品一区二区| 91成人免费电影| 91精品国产一区二区三区| 日韩视频中午一区| 国产午夜精品理论片a级大结局| 国产午夜精品美女毛片视频| 成人欧美一区二区三区1314 | 国产亚洲短视频| 国产精品不卡在线观看|