PHP多进程处理并行处理任务实例

简介:

本文目的

本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。写得比较简单,作为备忘录。

PHP多进程

通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!

管道PIPE

管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用文件模拟管道,但是那样无法使用管道的特性了。

僵尸进程

子进程结束时,父进程没有等待它(通过调用wait或者waitpid),那么子进程结束后不会释放所有资源(浪费呀!),这种进程被称为僵尸进程,他里面存放了子进程结束时的相关数据,如果僵尸进程过多,会占用大量系统资源(如内存),影响机器性能。

代码

废话少说直接上代码

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
/**
  * this is a demo for php fork and pipe usage. fork use
  * to create child process and pipe is used to sychoroize
  * the child process and its main process.
  * @author bourneli
  * @date: 2012-7-6
  */
 
define( "PC" , 10); // 进程个数
define( "TO" , 4); // 超时
define( "TS" , 4); // 事件跨度,用于模拟任务延时
 
if  (!function_exists( 'pcntl_fork' )) {
     die ( "pcntl_fork not existing" );
}
 
// 创建管道
$sPipePath  = "my_pipe." .posix_getpid();
if  (!posix_mkfifo( $sPipePath , 0666)) {
     die ( "create pipe {$sPipePath} error" );
}
 
// 模拟任务并发
for  ( $i  = 0; $i  < PC; ++ $i  ) {
     $nPID  = pcntl_fork(); // 创建子进程
     if  ( $nPID  == 0) {
         // 子进程过程
         sleep(rand(1,TS)); // 模拟延时
         $oW  = fopen ( $sPipePath , 'w' );
         fwrite( $oW , $i . "\n" ); // 当前任务处理完比,在管道中写入数据
         fclose( $oW );
         exit (0); // 执行完后退出
     }
}
 
// 父进程
$oR  = fopen ( $sPipePath , 'r' );
stream_set_blocking( $oR , FALSE); // 将管道设置为非堵塞,用于适应超时机制
$sData  = '' ; // 存放管道中的数据
$nLine  = 0;
$nStart  = time();
while  ( $nLine  < PC && (time() - $nStart ) < TO) {
     $sLine  = fread ( $oR , 1024);
     if  ( empty ( $sLine )) {
         continue ;  
     }  
     
     echo  "current line: {$sLine}\n" ;
     // 用于分析多少任务处理完毕,通过‘\n’标识
     foreach ( str_split ( $sLine ) as  $c ) {
         if  ( "\n"  == $c ) {
             ++ $nLine ;
         }
     }
     $sData  .= $sLine ;
}
echo  "Final line count:$nLine\n" ;
fclose( $oR );
unlink( $sPipePath ); // 删除管道,已经没有作用了
 
// 等待子进程执行完毕,避免僵尸进程
$n  = 0;
while  ( $n  < PC) {
     $nStatus  = -1;
     $nPID  = pcntl_wait( $nStatus , WNOHANG);
     if  ( $nPID  > 0) {
         echo  "{$nPID} exit\n" ;
         ++ $n ;
     }
}
 
// 验证结果,主要查看结果中是否每个任务都完成了
$arr2  = array ();
foreach ( explode ( "\n" , $sData ) as  $i ) { // trim all
     if  ( is_numeric (trim( $i ))) {
         array_push ( $arr2 , $i ); 
     }
}
$arr2  = array_unique ( $arr2 );
if  ( count ( $arr2 ) == PC) { 
     echo  'ok' ;
} else  {
     echo   "error count "  . count ( $arr2 ) . "\n" ;
     var_dump( $arr2 );
}

ok,完毕,注释写的比较清除,执行结果如下:

clip_image002

声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。
本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/07/06/2579893.html ,如需转载请自行联系原作者
相关文章
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
206 4
|
8月前
|
前端开发 测试技术 PHP
任务悬赏接单发布系统PHP源码
任务发布接单系统,目前最新最完善的一套源码,前后端全开源无加密,支持会员系统、 支持店铺认证 支持普通任务和线下任务 支持微信支付和支付宝支付 短信对接短信宝
345 13
|
9月前
|
PHP Docker 容器
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
179 14
|
9月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
456 0
|
11月前
|
数据可视化 项目管理
甘特图是什么?任务进程管理神器
甘特图是项目管理中的可视化工具,通过时间轴与任务列表展现项目进度和任务分配,支持任务间的依赖关系和里程碑设置,适用于项目管理、团队协作、日常任务安排及科研计划等多种场景,有效提升项目管理和团队协作效率。
1427 4
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
113 12
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
211 2
|
数据库连接 PHP 数据库
PHP中创建自定义函数以简化日常任务
【8月更文挑战第31天】在PHP编程中,自定义函数是提升代码重用性和清晰度的关键。本文将引导你了解如何创建和使用自定义函数,以及它们如何帮助你的日常开发工作变得更加高效。我们将通过具体案例探讨函数的构建,参数传递,返回值处理,并展示如何通过自定义函数简化复杂任务和减少冗余代码。