gpt4 book ai didi

php进程间通讯实例分析

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章php进程间通讯实例分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例讲述了php进程间通讯的方法。分享给大家供大家参考,具体如下:

php单进程单线程处理批量任务太慢了,受不鸟了,但是php不能多线程,最终选择了多进程处理批量任务. 。

php多进程主要使用for进行分裂,然后利用的unix/linux的信号量进行进程间通讯. 。

本例使用的是:生产者=>消费者=>收集器,的模式. 。

?
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
<?php
// ===== 全局变量 =====
// ipc进程间通讯
$key = ftok ( __FILE__ , "a" );
$queue = msg_get_queue( $key );
// 进程ID
$producer_pid = 0;
$consumers_pid = array ();
$collector_pid = posix_getpid();
// ===== 消费者 =====
for ( $i =0; $i < 2; $i ++) {
   $consumer_pid = pcntl_fork();
   if ( $consumer_pid == -1) {
     exit ( "could not fork!\n" );
   } else if ( $consumer_pid ) {
     // pcntl_wait($status);
     echo "consumer_pid: $consumer_pid\n" ;
     $consumers_pid [] = $consumer_pid ;
   } else {
     $pid = posix_getpid();
     echo "consumer_pid: $pid start\n" ;
     while (true) {
       msg_receive( $queue , $pid , $msgtype , 1024, $message );
       if ( $message == "exit" ) {
         break ;
       }
       // 数据处理
       $n = intval ( $message );
       msg_send( $queue , $collector_pid , $n * $n );
     }
     exit ( "consumer ok!\n" );
   }
}
// ===== 产生者 =====
$producer_pid = pcntl_fork();
if ( $producer_pid == -1) {
   exit ( "could not fork!\n" );
} else if ( $producer_pid ) {
   // pcntl_wait($status);
   echo "producer_pid: $producer_pid\n" ;
} else {
   $pid = posix_getpid();
   echo "producer_pid: $pid start\n" ;
   $n = 0;
   for ( $i =0; $i < 10; $i ++) {
     foreach ( $consumers_pid as $consumer_pid ) {
       $n ++;
       msg_send( $queue , $consumer_pid , $n );
     }
     sleep(1);
   }
   foreach ( $consumers_pid as $consumer_pid ) {
     msg_send( $queue , $consumer_pid , "exit" );
   }
   sleep(1);
   msg_send( $queue , $collector_pid , "exit" );
   exit ( "producer ok!\n" );
}
// ===== 收集器 =====
while (true) {
   msg_receive( $queue , $collector_pid , $msgtype , 1024, $message );
   if ( $message == "exit" ) {
     break ;
   }
   echo sprintf( "% 5d: %d\n" , $msgtype , $message );
}
exit ( "collector ok!\n" );

希望本文所述对大家PHP程序设计有所帮助.

最后此篇关于php进程间通讯实例分析的文章就讲到这里了,如果你想了解更多关于php进程间通讯实例分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com