Heim  >  Artikel  >  Backend-Entwicklung  >  理解 php 多线程的妙用

理解 php 多线程的妙用

WBOY
WBOYOriginal
2016-07-25 08:57:191084Durchsuche
本文介绍下,在linux环境下,php多线程的妙用,有需要的朋友参考下。

本节分享的php多线程的知识,需要用到php的pcntl_fork函数,此函数依赖操作系统fork的实现,以上内容仅适用于linux/unix系统。

来看下pcntl_fork函数的用法:

<?php
$pid = pcntl_fork();
if ($pid == -1) {
   die('could not fork');
} else if ($pid) {
   // we are the parent
   pcntl_wait($status); //Protect against Zombie children
} else {
   // we are the child
}
?>

通过pcntl_fork创建一个子进程。 如果返回值是-1的话,那么说明子进程创建失败。 创建成功的进程id会返回给父进程,0返回给子进程。

习惯这样写:

<?php
$pid = pcntl_fork();
if($pid == -1){
   //创建失败咱就退出呗,没啥好说的
   die('could not fork');
}
else{
  if($pid){
    //父进程代码,由于是系统程序,请退出值给出返回值
    exit(0);
  }
  else{
    //在新的进程中执行的程序,正常退出的话,也需要返回值
    exit(0);
  }
}
?>

如果父进程希望知道子进程正常退出的话,可以加上前面的pcntl_wait。

下面说说其在实际开发中的作用。

1,后台程序 命令行程序好写,服务程序也好写,笔者觉得这服务程序最难写。

linux想让个命令行程序在后台运行,直接在命令后面加个&就搞定了.但是这样总觉得土.有了pcntl_fork突然发现世界是那么的美好.当主进程成功创建子进程并获得子进程的id以后,自己在临死前还不忘说一句:"我已成功运行,我的id是:xxxx(子进程的id)",完了还给系统返回个0(正常退出)。

前面说的是程序常驻内存的情况,注意内存的释放以及向日志文件打印信息,而不是往屏幕上(一打印信息程序就退出的哟).还有一种情况是:程序被其它脚本调用,其它脚本只关心程序是不是正常运行,如果程序要运行很长时间才能运行完的话,最好不让脚本等待.这样的话pcntl_fork又派上用场了:)

2,延时处理. 有时程序退出时要清理自身产生的东西,比如说要删除自己(当然了linux下面是可以删除正在运行的文件的,只是举个例子),这个时候就可以另起动一个进程,然后自己结束了,把事情交给另一个进程来做.当我们写服务程序时,我们肯定是写日志文件记录程序的运行情况(要不谁知道程序是不是在那睡大觉的:0).程序正常退出时我们可以写一条日志说程序退出了,但是当程序收到linux下伟大的kill -9时,怎么记录自己的退出行为呢?额.....这个和php的进程信号有关好像和这个没多大关系。

情况2,一个完善的程序一般都支持start,stop,restart这样的参数.start好说,stop也好说,既然start和stop都好说了,这个restart就先stop然后再start就可以了啊.额...好像又和pcntl_fork没多大关系,当收到重启的信号总不能还是kill然后再start吧。

温柔些的做法就是当前进程退出,让另外的进程再把它拉起来。

3,不死进程 也就是所谓的双进程。



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn