成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PHP 進(jìn)程的實(shí)現(xiàn)與管理

testbird / 3352人閱讀

摘要:運(yùn)行模式實(shí)現(xiàn)進(jìn)程前,需了解常見的的運(yùn)行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運(yùn)行的基本實(shí)現(xiàn)中提供了一個(gè)擴(kuò)展,可以利用操作系統(tǒng)的調(diào)用來實(shí)現(xiàn)多進(jìn)程。

應(yīng)用場(chǎng)景

一些耗時(shí)任務(wù):

大數(shù)據(jù)表分表后的統(tǒng)計(jì)信息功能

分批發(fā)送短信或郵件功能

其他可分目標(biāo)的任務(wù)功能(很多種)

所以我們就需要一個(gè)常駐內(nèi)存的任務(wù)管理工具,為了保證實(shí)時(shí)性,一方面我們讓它一直執(zhí)行任務(wù)(適當(dāng)?shù)乃?,保證cpu不被100%占用),另一方面我們實(shí)現(xiàn)多進(jìn)程保證并發(fā)的執(zhí)行任務(wù),當(dāng)然除此之外也可按情況使用線程、協(xié)程實(shí)現(xiàn)。

運(yùn)行模式

實(shí)現(xiàn)PHP進(jìn)程前,需了解常見的php的運(yùn)行模式:

CGI通用網(wǎng)關(guān)接口模式

FAST-CGI模式

CLI命令行模式 (php xxx.php)

模塊模式(作為服務(wù)器模塊)

而php進(jìn)程則是使用CLI命令行模式運(yùn)行的

基本實(shí)現(xiàn)

PHP中提供了一個(gè)擴(kuò)展pcntl,可以利用操作系統(tǒng)的fork調(diào)用來實(shí)現(xiàn)多進(jìn)程。fork調(diào)用后執(zhí)行的代碼將是并行的,且只能在linux下運(yùn)行。

$ppid = posix_getpid();// 獲取當(dāng)前進(jìn)程PID
$pid  = pcntl_fork(); //創(chuàng)建進(jìn)程

switch ($pid){
        // 創(chuàng)建進(jìn)程錯(cuò)誤
    case -1:
        throw new Exception("fork子進(jìn)程失敗!");
        break;

        // 子進(jìn)程worker
    case 0:
        $cpid = posix_getpid();
        cli_set_process_title("我是{$ppid}的子進(jìn)程,我的進(jìn)程id是{$cpid}.");
        sleep(30);
        exit; // 這里exit掉,避免worker繼續(xù)執(zhí)行下面的代碼而造成一些問題
        break;

        // 主進(jìn)程master
    default:
        cli_set_process_title("我是父進(jìn)程,我的進(jìn)程id是{$ppid}.");
        pcntl_wait($status); // 掛起父進(jìn)程,等待并返回子進(jìn)程狀態(tài),防止子進(jìn)程成為僵尸進(jìn)程
        break;
}

在命令行php xxx.php運(yùn)行后,使用ps aux | grep 進(jìn)程可以看到:

如果沒看到,可能是中文亂碼了,使用ps aux,查看

或者使用ps –ajft查看層次顯示

進(jìn)程管理-防止進(jìn)程成為僵尸進(jìn)程

創(chuàng)建好了進(jìn)程,那么怎么對(duì)子進(jìn)程進(jìn)行管理呢?使用信號(hào),對(duì)子進(jìn)程的管理,一般有兩種情況:
posix_kill():此函數(shù)并不能顧名思義,它通過向子進(jìn)程發(fā)送一個(gè)信號(hào)來操作子進(jìn)程,在需要要時(shí)可以選擇給子進(jìn)程發(fā)送進(jìn)程終止信號(hào)來終止子進(jìn)程;
pcntl_waitpid():等待或返回fork的子進(jìn)程狀態(tài),如果指定的子進(jìn)程在此函數(shù)調(diào)用時(shí)已經(jīng)退出(俗稱僵尸進(jìn)程),此函數(shù)將立刻返回,并釋放子進(jìn)程的所有系統(tǒng)資源,此進(jìn)程可以避免子進(jìn)程變成僵尸進(jìn)程,造成系統(tǒng)資源浪費(fèi);

孤兒進(jìn)程:父進(jìn)程掛了,子進(jìn)程被pid=1的init進(jìn)程接管(wait/waitpid),直到子進(jìn)程自身生命周期結(jié)束被系統(tǒng)回收資源和父進(jìn)程 采取相關(guān)的回收操作
僵尸進(jìn)程:子進(jìn)程exit退出,父進(jìn)程沒有通過wait/waitpid獲取子進(jìn)程狀態(tài),子進(jìn)程占用的進(jìn)程號(hào)等描述資源符還存在,產(chǎn)生危害:例如進(jìn)程號(hào)是有限的,無法釋放進(jìn)程號(hào)導(dǎo)致未來可能無進(jìn)程號(hào)可用

**父進(jìn)程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成為僵尸進(jìn)程
作用:使用pcntl_wait()后,在子進(jìn)程死掉后,父進(jìn)程也會(huì)被停止**

最后我們通過下圖(1-1)來簡(jiǎn)單的總結(jié)和描述這個(gè)多進(jìn)程實(shí)現(xiàn)的過程:

進(jìn)程管理-進(jìn)程間通信

隊(duì)列:如Redis,推薦
socket:推薦
管道:實(shí)現(xiàn)復(fù)雜,且管道(pipe),使用文件形式存在,存在硬盤IO性能瓶頸
信號(hào):承載信息量少,不好管理

進(jìn)程管理-切換為守護(hù)進(jìn)程

使用&實(shí)現(xiàn)
php deadloop.php &

實(shí)際多進(jìn)程的使用

一個(gè)耗時(shí)10S的任務(wù),執(zhí)行2次,總耗時(shí)20S,而開2個(gè)進(jìn)程,只需10S,如下:

job.php:

index.php(進(jìn)程開啟腳本):
echo "開始時(shí)間:".date("H:i:s", time())."
";

$cmds = [
    ["./job.php", 0, 50000],//執(zhí)行腳本,并傳參
    ["./job.php", 50000, 100000]
];
for ($i = 0; $i < 2; $i++){
    $ppid = posix_getpid();// 獲取當(dāng)前進(jìn)程PID
    $pid  = pcntl_fork(); //創(chuàng)建進(jìn)程
    switch ($pid){
        // 創(chuàng)建進(jìn)程錯(cuò)誤
        case -1:
            throw new Exception("fork子進(jìn)程失敗!");
            break;

        // 子進(jìn)程worker
        case 0:
            $cpid = posix_getpid();
            cli_set_process_title("我是{$ppid}的子進(jìn)程,我的進(jìn)程id是{$cpid}.");

            // 執(zhí)行業(yè)務(wù)腳本
            pcntl_exec("/usr/local/php/bin/php", $cmds[$i]);

            exit; // 這里exit掉,避免worker繼續(xù)執(zhí)行下面的代碼而造成一些問題
            break;
    }
}

// 等待子進(jìn)程結(jié)束
while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
    echo "子進(jìn)程結(jié)束時(shí)間:".date("H:i:s", time())."
";
}

運(yùn)行php index.php后:

實(shí)例達(dá)到理想效果。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/39930.html

相關(guān)文章

  • PHP 進(jìn)程實(shí)現(xiàn)管理

    摘要:運(yùn)行模式實(shí)現(xiàn)進(jìn)程前,需了解常見的的運(yùn)行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運(yùn)行的基本實(shí)現(xiàn)中提供了一個(gè)擴(kuò)展,可以利用操作系統(tǒng)的調(diào)用來實(shí)現(xiàn)多進(jìn)程。 應(yīng)用場(chǎng)景 一些耗時(shí)任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計(jì)信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個(gè)常駐內(nèi)存的任務(wù)管理工具,為了保證實(shí)時(shí)性,一方面我們讓它一直執(zhí)行任...

    MockingBird 評(píng)論0 收藏0
  • PHP 運(yùn)行模式運(yùn)行原理

    摘要:當(dāng)客戶端請(qǐng)求到達(dá)時(shí),進(jìn)程管理器選擇并連接到一個(gè)解釋器。子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回。子進(jìn)程接著等待并處理來自進(jìn)程管理器運(yùn)行在中的下一個(gè)連接。 目前常見的4種PHP運(yùn)行模式 CGI通用網(wǎng)關(guān)接口模式 FAST-CGI模式 CLI命令行模式 模塊模式 運(yùn)行模式 CGI通用網(wǎng)關(guān)接口模式 每有一個(gè)用戶請(qǐng)求,都會(huì)先要?jiǎng)?chuàng)建cgi的子進(jìn)程,然后處理請(qǐng)求,處理完后結(jié)束這個(gè)子進(jìn)程...

    Pocher 評(píng)論0 收藏0
  • (PHP7內(nèi)核剖析-1) CGIFastCGI

    摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...

    rubyshen 評(píng)論0 收藏0
  • (PHP7內(nèi)核剖析-1) CGIFastCGI

    摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...

    Salamander 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<