注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

proc_open  

2010-08-18 18:05:00|  分类: Web技术-Php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一个简单的proc类
WHAT IS PROC_OPEN?

proc_open() is used open a process which it returns as a resource .(更多信息看手册,由于百度文章内容字数限制...so....)<?php
/**
* 使用proc_open打开一个进程
* @author FC_LAMP
* @internal
*/

class proc{

private $proc = NULL;
private $timeout = 30;
private $cmd = NULL;
private $descriptorspec = array(array("pipe","r"),array("pipe","w"),array("file","./proc_error.log","a"));
private $pipes = NULL;    
private $cwd = NULL;
private $env = NULL;
private $other_options = NULL;

/**
* 初始化操作
* @param
*   arra,$ini_data = array('cmd'=>'','descriptorspec'=>array());
* @return
*   bool
*/
function ini($ini_data = array()){
if(empty($ini_data) or !isset($ini_data['cmd'])){
return FALSE;
}
foreach($ini_data as $key=>$value){
$this->$key = $value;
}

}

/**
* 打开一个进程
* @return
* bool
*/
public function open(){
$this->proc = proc_open($this->cmd,$this->descriptorspec,$this->pipes,$this->cwd,$this->env,$this->other_options);
return $this->_check_alive();
}

/**
* 写入信息到子进程
* @param
*  string,$msg
* @return
* bool
*/
public function write($msg){
if(!$this->_check_alive()){
return FALSE;
}
return fwrite($this->pipes[0],$msg,strlen($msg));
}


/**
* 从进程管道中读取出信息
* @return unknown_type
*/
public function output($stop_flag = ''){
if(!$this->_check_alive()){
return FALSE;
}
while(TRUE){
//stream_set_timeout($this->pipes[1],$this->timeout);
$str = fgets($this->pipes[1]);
if($str == FALSE){
return FALSE;
}
$str = trim($str)."\r\n";      
echo $str;
ob_flush();
flush();
}
}

/**
* 试着关闭链接
* @return
*  bool
*/
public function close(){
if(!$this->_check_alive()){
return FALSE;
}
//先关闭管道
foreach((array)$this->pipes as $value){
fclose($value) ;
}
//
proc_close($this->proc);
$this->pipes = NULL;
$this->proc = NULL;
return TRUE;
}

/**
* 得到由proc_open打的进程的状态信息
* @return
*   false,失败
*   array,成功返回关联数组
*/
public function get_process_status(){
if(!empty($this->proc) and is_resource($this->proc)){
return proc_get_status($this->proc);
}
return FALSE;
}

/**
* 检查进程是否可用
* @return
* bool true or false
*/
private function _check_alive(){

return  (!empty($this->proc)
&& is_resource($this->proc)
&& !empty($this->pipes)
&& is_resource($this->pipes[0])
&& is_resource($this->pipes[1])) ? TRUE : FALSE;
}    
}#class end
/************File end**************/

DEMO
require 'proc.class.php';
$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","d:/phpcli/error.log","a")
) ;
$cwd = "D:/xx/xx/xx" ;
$proc = new proc();
$ini_data = array('cmd'=>'php run.php','descriptorspec'=>$descriptorspec,'cwd'=>$cwd);
$proc->ini($ini_data);
$proc->open();
//var_dump($proc->get_process_status());
//$proc->write($msg);
$proc->output();
$proc->close();

  评论这张
 
阅读(334)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017