PHP的Pcntl多进程扩展的用法介绍

来源:不言 发布时间:2019-02-27 10:55:36 阅读量:957

本篇文章给大家带来的内容是关于PHP的Pcntl多进程扩展的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

PHP提供了一个Pcntl扩展,Pcntl基于Linux的进程,Windows系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站内信等。

示例代码:

代码是基于Laravel 框架的,建议使用此框架来允许这部分代码。

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

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

public function index(Request $request)

 

    {

 

        pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。 

 

        $max = 8000;

 

        $workers = 10;

 

         

 

        $pids = array();

 

        for($i = 0; $i < $workers; $i++){

 

            $pids[$i] = pcntl_fork();

 

            $pid = posix_getpid();

 

            switch ($pids[$i]) {

 

                case -1:

 

                    echo "fork error : {$i} \r\n";

 

                    exit;

 

                case 0:

 

                    $param = array(

 

                        'lastid' => $max / $workers * $i,

 

                        'maxid' => $max / $workers * ($i+1),

 

                    );

 

                    $this->doSomething($pid, $param);

 

                    exit;

 

                default:

 

                    break;

 

            }

 

        }

 

         

 

        foreach ($pids as $i => $pid) {

 

            if($pid) {

 

                //父进程会得到子进程号,所以这里是父进程执行的逻辑 

 

                //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成: 

 

                pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。

 

                //pcntl_waitpid($pid, $status);

 

            }

 

        }

 

    }

 

 

 

// 可以看到那个子进程在处理哪些数据

 

    public function doSomething($filename, $param)

 

    {

 

        for ($i = $param['lastid']; $i < $param['maxid']; $i++) {

 

            $path = "./test/";

 

            if (!is_dir($path)){

 

                mkdir($path, 0777, true);

 

            }

            $content = $i . '|';

            $file = $path . $filename . ".txt";

            file_put_contents($file, $content, FILE_APPEND);

        }

    }


标签: PHP
分享:
评论:
你还没有登录,请先