PHP的Pcntl多進程擴展基礎使用

PHP提供了一個Pcntl擴展,Pcntl基於Linux的進程,Windows系統暫時沒有這個擴展,用於實現基礎的多進程實現,能夠利用這個處理一個很耗時的任務,例如發訂閱郵件,短信,站內信等。php

參考連接:html

http://php.net/manual/zh/ref....swoole

http://php.net/manual/zh/ref....框架

http://blog.csdn.net/huyanpin...學習

http://rango.swoole.com/archi...this

https://www.lvtao.net/dev/php....net

示例代碼:線程

代碼是基於Laravel 框架的,建議使用此框架來容許這部分代碼。code

public function index(Request $request)

    {

        pcntl_signal(SIGCHLD, SIG_IGN); //若是父進程不關心子進程何時結束,子進程結束後,內核會回收。  

        $max = 8000;

        $workers = 10;

        

        $pids = array();

        for($i = 0; $i < $workers; $i++){

            $pids[$i] = pcntl_fork();

            $pid = posix_getpid();

            switch ($pids[$i]) {

                case -1:

                    echo "fork error : {$i} \r\n";

                    exit;

                case 0:

                    $param = array(

                        'lastid' => $max / $workers * $i,

                        'maxid' => $max / $workers * ($i+1),

                    );

                    $this->doSomething($pid, $param);

                    exit;

                default:

                    break;

            }

        }

        

        foreach ($pids as $i => $pid) {

            if($pid) {

                //父進程會獲得子進程號,因此這裏是父進程執行的邏輯  

                //若是不須要阻塞進程,而又想獲得子進程的退出狀態,則能夠註釋掉pcntl_wait($status)語句,或寫成:  

                pcntl_wait($status,WNOHANG); //等待子進程中斷,防止子進程成爲殭屍進程。

                //pcntl_waitpid($pid, $status);

            }

        }

    }



// 能夠看到那個子進程在處理哪些數據

    public function doSomething($filename, $param)

    {

        for ($i = $param['lastid']; $i < $param['maxid']; $i++) {

            $path = "./test/";

            if (!is_dir($path)){

                mkdir($path, 0777, true);

            }

            $content = $i . '|';

            $file = $path . $filename . ".txt";

            file_put_contents($file, $content, FILE_APPEND);

        }

    }

更多建議讀文檔,進程和線程,還有不少內容的,須要讀書去學習了htm

相關文章
相關標籤/搜索