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<$end;$start++){
echo $task_num . " " . $start . "\n";
}
//子进程执行完任务以后终止,当然你可以返回主进程的代码部分做相关操作。
exit();
}
原文地址:php多进程demo, 感谢原作者分享。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号