PHP多进程编程

php要使用多进程需要安装pcntl扩展,扩展安装方法百度即可。使用pcntl_fork来fork出多个进程来并行执行代码。

pcntl_fork
pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

if (!function_exists('pcntl_fork')) {
die("pcntl extention is must !");
}

$pid = pcntl_fork();
if ($pid == -1) {
die("创建子进程失败!");
} elseif ($pid) {
// > 0
// 父进程逻辑
pcntl_wait($status); // 等待子进程结束,为了防止子进程变成僵尸进程
} else {
// 0
// 子进程逻辑
}

多进程可以用来进行大文件的处理,如一个文件有几亿行数据,则可以将文件拆分成多个小文件进程处理。(百度好看视频面试题)

假如文件有10万行,则可以拆分成4个文件,每个文件2.5万行,可以使用split。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

shell_exec('split -l 25000 -d access.log prefix_name')

// 3个子进程处理
for ($i = 0; $i < 3; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die("创建子进程失败!");
} elseif ($pid) {
// 父进程
} else {
$content = file_get_contents("prefix_name0" . $i);
// 处理逻辑
exit;
}
}

while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status); // 回收子进程
echo "回收进程" . $status;
}