1. 程式人生 > >PHP多程序處理並行處理任務例項

PHP多程序處理並行處理任務例項

本文目的

本文通過例子講解linux環境下,使用php進行併發任務處理,以及如何通過pipe用於程序間的資料同步。寫得比較簡單,作為備忘錄。

PHP多程序

通過pcntl_XXX系列函式使用多程序功能。注意:pcntl_XXX只能執行在php CLI(命令列)環境下,在web伺服器環境下,會出現無法預期的結果,請慎用!

管道PIPE

管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序A將資料寫到管道P中,然後程序B從管道P中讀取資料。php提供的管道操作API與操作檔案的API基本一樣,除了建立管道使用posix_mkfifo函式,讀寫等操作均與檔案操作函式相同。當然,你可以直接使用檔案模擬管道,但是那樣無法使用管道的特性了。

殭屍程序

子程序結束時,父程序沒有等待它(通過呼叫wait或者waitpid),那麼子程序結束後不會釋放所有資源(浪費呀!),這種程序被稱為殭屍程序,他裡面存放了子程序結束時的相關資料,如果殭屍程序過多,會佔用大量系統資源(如記憶體),影響機器效能。

程式碼

廢話少說直接上程式碼

/**
 * this is a demo for php fork and pipe usage. fork use
 * to create child process and pipe is used to sychoroize
 * the child process and its main process.
 * @author bourneli
 * @date: 2012-7-6
 */
 
define("PC", 10); // 程序個數
define("TO", 4); // 超時
define("TS", 4); // 事件跨度,用於模擬任務延時
 
if (!function_exists('pcntl_fork')) {
    die("pcntl_fork not existing");
}
 
// 建立管道
$sPipePath = "my_pipe.".posix_getpid();
if (!posix_mkfifo($sPipePath, 0666)) {
    die("create pipe {$sPipePath} error");
}
 
// 模擬任務併發
for ($i = 0; $i < PC; ++$i ) {
    $nPID = pcntl_fork(); // 建立子程序
    if ($nPID == 0) {
        // 子程序過程
        sleep(rand(1,TS)); // 模擬延時
        $oW = fopen($sPipePath, 'w');
        fwrite($oW, $i."\n"); // 當前任務處理完比,在管道中寫入資料
        fclose($oW);
        exit(0); // 執行完後退出
    }
}
 
// 父程序
$oR = fopen($sPipePath, 'r');
stream_set_blocking($oR, FALSE); // 將管道設定為非堵塞,用於適應超時機制
$sData = ''; // 存放管道中的資料
$nLine = 0;
$nStart = time();
while ($nLine < PC && (time() - $nStart) < TO) {
    $sLine = fread($oR, 1024);
    if (empty($sLine)) {
        continue;   
    }   
     
    echo "current line: {$sLine}\n";
    // 用於分析多少任務處理完畢,通過‘\n’標識
    foreach(str_split($sLine) as $c) {
        if ("\n" == $c) {
            ++$nLine;
        }
    }
    $sData .= $sLine;
}
echo "Final line count:$nLine\n";
fclose($oR);
unlink($sPipePath); // 刪除管道,已經沒有作用了
 
// 等待子程序執行完畢,避免殭屍程序
$n = 0;
while ($n < PC) {
    $nStatus = -1;
    $nPID = pcntl_wait($nStatus, WNOHANG);
    if ($nPID > 0) {
        echo "{$nPID} exit\n";
        ++$n;
    }
}
 
// 驗證結果,主要檢視結果中是否每個任務都完成了
$arr2 = array();
foreach(explode("\n", $sData) as $i) {// trim all
    if (is_numeric(trim($i))) {
        array_push($arr2, $i);  
    }
}
$arr2 = array_unique($arr2);
if ( count($arr2) == PC) {  
    echo 'ok'; 
} else {
    echo  "error count " . count($arr2) . "\n";
    var_dump($arr2);
}

ok,完畢,註釋寫的比較清除,執行結果如下:

clip_image002


相關推薦

PHP程序處理並行處理任務例項

本文目的 本文通過例子講解linux環境下,使用php進行併發任務處理,以及如何通過pipe用於程序間的資料同步。寫得比較簡單,作為備忘錄。 PHP多程序 通過pcntl_XXX系列函式使用多程序功能。注意:pcntl_XXX只能執行在php CLI(命令列)環境下

程序+協程 處理IO問題

from multiprocessing import Pool import gevent,os import time def recursion(n): if n == 1 or n ==2: return 1 else: re

SAP ABAP程式優化-執行緒並行處理

                實際專案實施過程中,我們會遇到程式效能優化的問題,這裡介紹一種方法:通過RFC介面進行遠端函式的非同步呼叫實現程式的並行處理。   同步/非同步呼叫函式語法同步呼叫:CALL FUNCTION 'AAA' ;同步呼叫的實質:程式進行單執行緒執行。非同步呼叫:CALL FUNCT

SAP_ABAP程式優化-執行緒並行處理 (轉)

實際專案實施過程中,我們會遇到程式效能優化的問題,這裡介紹一種方法:通過RFC介面進行遠端函式的非同步呼叫實現程式的並行處理。   同步/非同步呼叫函式語法同步呼叫:CALL FUNCTION 'AAA' ;同步呼叫的實質:程式進行單執行緒執行。非同步呼叫:CALL F

Python執行緒、程序和協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

PHP程序初探 --- 利用程序開發點兒東西吧

[原文地址:https://blog.ti-node.com/blog...] 乾巴巴地叨逼叨了這麼久,時候表演真正的技術了! 做個高階點兒的玩意吧,加入我們要做一個任務系統,這個系統可以在後臺幫我們完成一大波(注意是一大波)資料的處理,那麼我們自然想到,多開幾個程序分開處理這些資料,同時我們不能執行了p

websocket基於php 記一次結合PHP程序和socket.io解決問題的經歷

記一次結合PHP多程序和socket.io解決問題的經歷     公司是做棋牌遊戲的。前段時間接到一個後臺人工鑑定並處理通牌作弊玩家的需求,其中需要根據幾個玩家的遊戲ID查詢並計算他們在某段時間內彼此之間玩牌輸贏次數和輸贏總額。   牌局資料是儲存在日誌中心的,他們把牌

PHP程序引發的msyql連線數問題

PHP多程序引發的msyql連線數問題 業務中有一塊採用了PHP的pcntl_fork多程序,希望能提高效率,但是在執行的時候資料庫報錯 PDO::prepare(): Premature end of data (mysqlnd_wireprotocol

php 程序下mysql連線 gone away

php 在命令列模式下啟動多程序如果父程序有sql查詢,可能會導致子程序裡面的sql查詢 報錯  General error: 2006 MySQL server has gone away 當fork的子程序都共用相同的mysql連線的時候,會出現該錯誤,每個子程序單獨一

php程序單例模式下的 MySQL及Redis連線錯誤修復

問題描述: 前幾天寫了個php常駐指令碼,主要邏輯如下 //跑完資料後休息60秒 $sleepTime = 60; $maxWorker = 10; while (true) { $htmlModel = new DetailHtmlMode

PHP程序抓取百度搜索結果

<?php /** * 多程序抓取百度結果頁自然結果,包括標題、摘要、圖片、連結、來源 * @since 2016-04-15 */ class NaturalResultSpider { private $_strQuery = null; pub

OSX中php程序安裝pcntl

php實現多程序,原始檔: <?php $pid = pcntl_fork(); if($pid == -1){ die('could not fork'); }else{ if ($pid) { var_dump('parent:'.$pid);

php程序使用場景

pcntl介紹 擴充套件介紹 Note: 1. 此擴充套件在 Windows 平臺上不可用。 2. 程序控制不能被應用在Web伺服器環境,當其被用於Web服務環境時可能會帶來意外的結果。因此,不能再PHP Web開發中使用多程序。

從0到1優雅的實現PHP程序管理

業務場景 在我們實際的業務場景中(PHP技術棧),我們可能需要定時或者近乎實時的執行一些業務邏輯,簡單的我們可以使用unix系統自帶的crontab實現定時任務,但是對於一些實時性要求比較高的業務就不適用了,所以我們就需要一個常駐記憶體的任務管理工具,為了保證實時

php程序實現

來源:http://blog.csdn.net/e421083458/article/details/22186475 PHP多程序實現 PHP有一組程序控制函式(編譯時需要–enable-pcntl與posix擴充套件),使得php能在nginx系統中實現跟c一樣的建立

PHP程序程式設計理論+實戰

這篇文章主要介紹了PHP多程序程式設計例項,本文講解的是在Linux下實現PHP多程序程式設計,需要的朋友可以參考下: 羨慕火影忍者裡鳴人的影分身麼?沒錯,PHP程式是可以開動影分身的!想完成任務,又覺得一個程序太慢,那麼,試試用多程序來搞吧。這篇文章將會介紹一下PHP多

php 程序程式設計

第一步: $ php -m 命令檢視php是否安裝pcntl 和 posix擴充套件,若沒有則安裝 使用場景: 1. 要進行大量的網路耗時的操作 2. 要做大量的運算,並且,系統有多個cpu,為了讓使用者有更快的體驗,把一個任務,分成幾個小任務

popen——php程序利器

標題有點兒誇張, 我(們,本來想用們的,還會去掉了)執行系統命令常常用exec,system之類的, 但是今天發現了proc_open和popen,proc_open自稱比popen多一些功能,確實,proc_open有很多功能,可以與程式互動, ——但是,他是同步的,就

SimpleFork php程序併發框架

SimpleFork 基於PCNTL擴充套件的多程序程序併發框架,介面類似與Java的Thread和Runnable 為什麼要寫SimpleFork 多程序程式的編寫相比較多執行緒編寫更加複雜,需要考慮程序回收、同步、互斥、通訊等問題。對於初學者來說,處理上述問題

shell模擬php程序從redis獲取資料(個庫)

背景:現在的資料已經寫到了redis佇列裡面,完成了入棧的操作,後期打算從redis獲取資料,完成出棧的操作,出棧後然後做一系列的邏輯處理       環境: VMware虛擬機器  記憶體:1G   硬碟:60G  php環境:PHP Version 5.6.31  ph