-
Notifications
You must be signed in to change notification settings - Fork 0
/
WebServer.php
77 lines (70 loc) · 2.37 KB
/
WebServer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/5/7
* Time: 16:37
*/
namespace app;
class WebServer
{
private $list;
public function __construct()
{
$this->list = [];
}
public function master($requests)
{
$start = microtime(true);
echo "处理开始时间: " . $start . PHP_EOL;
foreach ($requests as $request) {
$pid = $this->worker($request);
if (!$pid) {
echo 'handle fail!' . PHP_EOL;
return;
}
array_push($this->list, $pid);
}
while (count($this->list) > 0) {
foreach ($this->list as $k => $pid) {
// pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] ) : int — 等待或返回fork的子进程状态
//< -1 等待任意进程组ID等于参数pid给定值的绝对值的进程。
//-1 等待任意子进程;与pcntl_wait函数行为一致。
//0 等待任意与调用进程组ID相同的子进程。
//> 0 等待进程号等于参数pid值的子进程。
$res = pcntl_waitpid($pid, $status, WNOHANG);
if ($res == -1 || $res > 0) {
unset($this->list[$k]);
}
}
usleep(100);
}
$end = microtime(true);
$cost = $end - $start;
echo '所有请求花费时间:'. $cost . '秒'.PHP_EOL;
}
public function worker($request)
{
//创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同
//父进程和子进程 都从fork的位置开始向下继续执行
$pid = pcntl_fork();
//创建子进程失败时返回-1.
if ($pid == -1) {
return false;
}
//父进程执行过程中,得到的fork返回值为子进程号,所以$pid>0,这里是父进程
if ($pid > 0) {
return $pid;
}
//子进程得到的是0, 所以这里是子进程执行的逻辑。
if ($pid == 0) {
$method = $request[1];
$start = microtime(true);
file_get_contents($method);
$end = microtime(true);
$cost = $end - $start;
echo '本次花费时间:' . $cost . PHP_EOL;
exit(0);
}
}
}