多进程应用帮助PHP解决难题_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

多进程应用帮助PHP解决难题

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:解决难题帮助应用
黑客防线网安网讯:  PHP在很多时候不适合做常驻的SHELl进程,他没有专门的gc例程,也没有有效的内存管理途径.所以如果用PHP做常驻SHELL,你会经常被内存耗尽导致abort而unhappy.    而且,如果输入数据非法...
  PHP在很多时候不适合做常驻的SHELl进程,他没有专门的gc例程,也没有有效的内存管理途径.所以如果用PHP做常驻SHELL,你会经常被内存耗尽导致abort而unhappy.
  
  而且,如果输入数据非法,而脚本没有检测,导致abort,也会让你很不开心.
  
  那?怎么办呢?
  
  呵呵,别着急,多进程来帮您!
  
  那,这是为什么呢?
  
  优点:
  
  1.使用多进程,子进程结束以后,内核会负责回收资源
  
  2.使用多进程,子进程异常退出不会导致整个进程Thread退出.父进程还有机会重建流程.
  
  3.一个常驻主进程,只负责任务分发,逻辑更清楚.
  
  Then,怎么做呢?
  
  接下来,我们使用PHP提供的POSIX和Pcntl系列函数,来实现一个PHP命令解析器,主进程负责接受用户输入,然后fork子进程执行,并负责回显子进程的结束状态.
  
  代码如下,我加了注释,如果有不懂的地方,可以翻阅手册相关函数,或者回复留言.
  
  #!/bin/envphp
  
  <?php
  
  /**Aexampledenotedmuti-processapplicationinphp
  
  *@filenamefork.php
  
  *@touchdateWed10Jun200910:25:51PMCST
  
  *@authorLaruence<laruence@baidu.com>
  
  *@licensehttp://www.zend.com/license/3_0.txtPHPLicense3.0
  
  *@version1.0.0
  
  */
  
  /**确保这个函数只能运行在SHELL中*/
  
  if
  
  (substr(php_sapi_name(),0,3)!=='cli')
  
  {
  
  die("ThisProgramecanonlyberuninCLImode");
  
  }
  
  /**关闭最大执行事件限制,在CLI模式下,这个语句其实不必要*/
  
  set_time_limit(0);
  
  $pid=posix_getpid();//取得主进程ID
  
  $user=posix_getlogin();//取得用户名
  
  echo
  
  <<<EOD
  
  USAGE:[command|expression]
  
  inputphpcodetoexecutebyforkanewprocess
  
  inputquittoexit
  
  ShellExecutorversion1.0.0bylaruence
  
  EOD;
  
  while
  
  (true)
  
  {
  
  $prompt=" {$user}$";
  
  $input=readline($prompt);
  
  readline_add_history($input);
  
  if
  
  ($input=='quit')
  
  {
  
  break;
  
  }
  
  process_execute($input.';');
  
  }
  
  exit(0);
  
  function
  
  process_execute($input)
  
  {
  
  $pid=pcntl_fork();//创建子进程
  
  if
  
  ($pid==0)
  
  {//子进程
  
  $pid=posix_getpid();
  
  echo
  
  "*Process{$pid}wascreated,andExecuted: ";
  
  eval($input);//解析命令
  
  exit;
  
  }
  
  else
  
  {//主进程
  
  $pid=pcntl_wait($status,WUNTRACED);//取得子进程结束状态
  
  if
  
  (pcntl_wifexited($status))
  
  {
  
  echo
  
  " *Subprocess:{$return['pid']}exitedwith{$status}";
  
  }
  
  }
  
  }
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17564-1.html
网站维护教程更新时间:2012-09-21 05:21:22  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer