linux下php多进程编程

转载地址:

http://blog.csdn.net/wzllai/article/details/8257091

   php在很多情况用在web开发中,通常情况下一次请求对应一个php进程,进程执行完返回数据销毁执行过程中的中间变量代码,在一些perfork类型的的sapi中,它又会等待下一个请求过来重新初始化执行环境、执行脚本,已经执行完成后的清理工作。但在如命令行下有时候一个进程满足不了需求,比如微博的异步发送,如果是用php脚本处理的话,脚本需要从发送队列中取数据,然后对数据进行处理,一个进程显然太慢,解决这种问题可以用php自带的popen、exect之类的函数,也可以用php多进程编程来解决。

  

  php的多进程管理需要pcntlposix扩展,在官方手册中:

POSIX functions are enabled by default. You can disable POSIX-like functions with --disable-posix 。

Process Control support in PHP is not enabled by default. You have to compile the CGI or CLI version of PHP with --enable-pcntl configuration option when compiling PHP to enable Process Control support.

因为posix协议是针对unix系的,window下就不考虑了。下面用这两个扩展中的函数写一个多进程的daemon进程。

[php]  view plain copy
  1. <?php  
  2. $max     = 6;  
  3. $current = 0;  
  4. pcntl_signal(SIGCHLD, "reduce_current");  
  5.   
  6. /* 
  7.  * signal callback function  
  8. */  
  9. function reduce_current($signal)  
  10. {  
  11.     global $current;  
  12.     if ($signal === SIGCHLD) {  
  13.         $current--;  
  14.     }  
  15. }  
  16.   
  17. // become a daemon  
  18. if (($pid = pcntl_fork()) === -1) {  
  19.     die("fork error");  
  20. elseif ($pid) {  
  21.     exit;  
  22. else {  
  23.     if (posix_setsid() === -1)  
  24.         die("setsid error");  
  25.   
  26.     if (($pid = pcntl_fork()) === -1)   
  27.         die("fork error");  
  28.     elseif($pid)   
  29.         exit;  
  30.   
  31. }  
  32.   
  33. while(1) {  
  34.     $current++;  
  35.     if (($pid = pcntl_fork()) === -1) {  
  36.         //log and  exit  
  37.   
  38.     } elseif ($pid) {  
  39.         //father process  
  40.         if ($current >= $max ) {  
  41.             //blocking  
  42.             if(pcntl_wait($status) === -1) {  
  43.                 //log or exit  
  44.             }  
  45.         }  
  46.   
  47.     } else {  
  48.         //child process   
  49.         //do something repalce sleep  
  50.         sleep(3);  
  51.         exit;  
  52.     }  
  53. }  

   代码中规定脚本最大可以fork出6个进程,但数据达到6个后,会调用pcntl_warit使父进程挂起。当子进程执行完自己的任务(此处以sleep 3 秒代替)后退出时,父进程通过 捕获子进程退出状态,通过pcntl_signal 注册的的回调函数使其子进程数量减1,然后又可以继续fork子进程。如图中,父进程通过两次fork变成一个daemon进程,其父进程id为1(即init进程),其6个子进程的ppid与它的pid一样,都是918。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux多进程编程是指在Linux操作系统下,使用多个进程同时执行任务的编程方式。 在Linux中,每个进程都是一个独立的执行环境,有自己独立的地址空间和资源。多进程编程可以通过创建多个进程来同时执行不同的任务,从而提高程序的并发性和效率。 在Linux中,可以使用fork()系统调用创建一个新的进程。原有进程称为父进程,新创建的进程称为子进程,父进程和子进程具有相同的代码段和数据段,但拥有不同的进程ID。 通过fork()创建的进程在执行时,会复制父进程的所有资源,包括打开的文件、文件描述符等。子进程独立于父进程运行,并且可以通过exec()系列函数来加载新的程序,替代原有的代码段和数据段,实现不同的任务。 多进程编程可以通过父子进程间的通信来实现数据交换。常用的通信方式包括管道、共享内存、信号和套接字等。父进程可以通过管道或共享内存将数据传递给子进程,子进程可以通过套接字与其他进程进行通信,实现进程间的数据共享和同步。 多进程编程也需要注意避免进程之间的竞争条件和死锁。可以使用进程同步机制,如互斥锁和信号量,来保证多个进程对共享资源的互斥访问和同步执行。 总而言之,Linux多进程编程是一种有效利用多核处理器和提高程序并发性的编程方式,可以通过创建多个进程来同时执行不同的任务,并通过不同的进程间通信方式来实现数据交换和同步执行。 ### 回答2: Linux多进程编程是指在Linux操作系统上使用多个进程同时执行任务的编程方式。 Linux作为一个多用户、多任务的操作系统,支持多进程的并行执行。多进程编程可以充分利用操作系统提供的资源管理和调度机制,实现并发性和并行性。 在Linux中,一个程序可以通过创建新的进程来执行不同的任务。多进程编程可以通过调用系统调用fork()创建新的进程,从而将任务分配给不同的进程执行。同时,通过调用系统调用exec()可以在子进程中加载新的程序代码,实现任务的切换和执行。 多进程编程可以实现任务的分割和并行化处理,提高了程序的执行效率和响应速度。不同的进程之间可以通过进程间通信(IPC)机制来进行数据的交换和协调,如管道、信号、共享内存等。 在多进程编程中,需要注意进程的创建和销毁、进程间通信的机制、进程间的同步与互斥等问题。合理使用多进程编程可以更好地利用多核处理器的计算能力和资源,提高程序的并发性和性能。 总之,Linux多进程编程是一种高效利用操作系统资源的编程方式,可以实现任务的并行处理,提高程序的执行效率和响应速度。 ### 回答3: Linux多进程编程是指在Linux操作系统上使用多个进程进行编程的一种方法。在Linux下,可以创建多个进程来同时执行不同的任务,扩展系统的处理能力,提高整体的效率和响应速度。 多进程编程的主要特点是可以实现并发执行,每个进程独立运行,相互之间不会相互干扰。在Linux中,可以使用fork()系统调用来创建新的进程,子进程的运行和父进程是并行的。子进程可以继承父进程的资源,如打开的文件描述符、信号处理等,也可以通过exec()系列系统调用来加载新的程序,实现进程的替换。 在多进程编程中,进程之间可以通过进程间通信(IPC)方式进行数据交换和同步。常用的IPC机制有管道、共享内存、消息队列和信号量等。这些机制可以让多个进程之间传递数据、共享资源,实现各个进程之间的协作和通信。 多进程编程还可以通过进程管理和调度来控制各个进程的执行顺序和优先级,提高系统的整体性能。Linux提供了丰富的进程管理工具和调度算法,可以根据实际需求进行调整和配置,以达到最佳的性能和资源利用率。 总之,Linux多进程编程是一种高效的编程模式,可以充分利用多核处理器的优势,实现并发执行和资源共享。它不仅可以提高系统的处理能力和响应速度,还可以提高系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值