Home >php教程 >php手册 >php多进程demo

php多进程demo

WBOY
WBOYOriginal
2016-06-06 20:11:532058browse

php多进程的实现依赖于pcntl扩展,编译PHP的时候,可以加上enable-pcntl或者也可以单独编译。 有几点需要注意: 1.子进程不在执行fork之前的代码,只是把父进程的内存状况复制一份新的,所以,关于子进程的个性化设置需要单独设置。 2.输出重定向,程序中使

php多进程的实现依赖于pcntl扩展,编译PHP的时候,可以加上’–enable-pcntl’或者也可以单独编译。

有几点需要注意:
1.子进程不在执行fork之前的代码,只是把父进程的内存状况复制一份新的,所以,关于子进程的个性化设置需要单独设置。
2.输出重定向,程序中使用echo,或造成命令行的混乱,影响分辨。可以用ob_start重定向到log文件,当然,你直接使用log是更好的办法。此实例中log文件,按照进程pid分组。
3.父进程没有代码执行,将可能提前退出,子进程可能成为孤儿进程。

demo接受:
用10个子进程来处理输出任务,任务总量是1000,然后,按照任务数平均分到十个子进程当中去。

<?php //输出重定向到log文件                           
function echo_to_log($content){
    global $current_pid;
    $logfile =  __FILE__ . $current_pid .  '.log';
    $fp = fopen($logfile, 'a+');
    fwrite($fp, $content);
    fclose($fp);
}

ob_start('echo_to_log');
//获取当前进程pid
$current_pid = getmypid();
$fork_nums = 10; 
$total = 1000; 

for($i = 0; $i < $fork_nums; $i++){
    $pid = pcntl_fork();
    //等于0时,是子进程
    if($pid == 0){ 
        $current_pid = getmypid();
        do_task($i);   
    // 大于0时,是父进程,并且pid是产生的子进程PID 
    } else if ($pid > 0){
         
    }
}

//任务函数
function do_task($task_num){
    global $total;
    $start = $total / 10 * $task_num;
    $end = $total / 10 * ($task_num + 1);   
    for(;$start

    <p class="copyright">
        原文地址:php多进程demo, 感谢原作者分享。
    </p>
    
    


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn