pcntl_fork 多进程

日期:2020-07-16 浏览:110次
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
<?php
set_time_limit(0);
if (!function_exists("pcntl_fork")) {
    die("pcntl extention is must !");
}

$forkNums = 6; //开启的进程数
for ($i = 0; $i < $forkNums; $i++) {
    $pid = pcntl_fork();    //创建子进程

    if ($pid == -1) {
        //错误处理:创建子进程失败时返回-1.
        mysql_inset("错误处理:创建子进程失败时返回-1");
        die('could not fork');
    } else if ($pid) {
        mysql_inset("我是PId:$pid 次");
       
        //父进程会得到子进程号,所以这里是父进程执行的逻辑
        //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
        pcntl_wait($status, WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。
    } else {
        try {
            //这里写子进程执行的逻辑
            mysql_inset("我是子进程,第:$i 次 ");
        } finally {
            posix_kill(posix_getpid() , SIGTERM);//自杀自己的进程
        }
        //这里写子进程执行的逻辑
        // mysql_inset("我是子进程,第:$i 次");
        // exit(0);*/*/
    }
}

// 等待子进程执行结束
while (pcntl_waitpid(0, $status) != - 1) {
    $status = pcntl_wexitstatus($status);
    mysql_inset('等待子进程执行结束');
}



function mysql_inset($desc)
{
    $dbhost = '39.108.91.84';  // mysql服务器主机地址
    $dbuser = 'test.liusongs';            // mysql用户名
    $dbpass = 'fEWJKLJEBs5RiKd';          // mysql用户名密码
    $conn = mysqli_connect($dbhost, $dbuser, $dbpass);
    if (!$conn) {
        die('Could not connect: ' . mysqli_error());
    }
    // 设置编码,防止中文乱码
    mysqli_query($conn, "set names utf8");
    mysqli_select_db($conn, 'test.liusongs');
    $sql = "INSERT INTO pcntl (name) VALUES ('$desc')";
    mysqli_query($conn, $sql);
    mysqli_close($conn);
}

没有评论

发表评论