作者热门文章
- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
根据 Android docs ,activity生命周期如下: onCreate() onStart() onResume() onPause() onStop() onDestroy() 问题是,
我有一门类(class)有很多专栏,但这个问题只需要其中三个: ---------------------------------------- | start_date | start_time
给定在同一个 Tomcat 6 上运行的两个 Web 应用程序。如果您从一个应用程序到另一个应用程序进行 http 调用,Tomcat 是否会“短路”此调用,或者它会在调用之前一直在 interweb
我是一名优秀的程序员,十分优秀!