PHP使用proc_open,以便它不等待它打开(运行)的脚本完成? [英] PHP using proc_open so that it doesn't wait for the script it opens (runs) to finish?
问题描述
我已经花了一段时间,但不能让这个工作,我道歉,因为我问一个有关的问题,关于这个,但删除它,所以我可以做更多的研究来缩小问题,在这一点我被卡住,因为我认为我有这个解决方案,但它不工作,因为我期望..我发现一个论坛,有人问一个类似的问题,他们给了代码,如下,我试图...它运行脚本,但它仍然等待它完成,然后进入下一行PHP代码
I've spent a while on this but can't get this to work, I apologize as I asked a somewhat related question about this earlier but deleted it so I could do more research to narrow down the question, at this point I am stuck as I thought I had the solution with this but its not working as I expect.. I found a forum where someone asked a similar question and they gave code like below, which I am trying.. it does run the script, but it still waits for it to finish before going to the next line in the PHP code
proc_close(proc_open ("/var/www/other_scripts/perl/apps/emails_extract_from_url.pl \"$stoopid\"", array(), $foo));
推荐答案
我使用proc_open
我有问题proc_close(10到30秒),所以我刚刚杀死进程使用linux命令kill
Some of my code when i played around with proc_open
I had issues with proc_close (10 to 30 seconds) so i just killed the process using linux command kill
$options=array();
$option['sleep-after-destroy']=0;
$option['sleep-after-create']=0;
$option['age-max']=40;
$option['dir-run']=dirname(__FILE__);
$option['step-sleep']=1;
$option['workers-max']=(int)file_get_contents($maxworkers_file);
$option['destroy-forcefull']=1;
$workers=array();
function endAWorker($i,$cansleep=true) {
global $workers;
global $option;
global $child_time_limit;
if(isset($workers[$i])) {
@doE('Ending worker [['.$i.']]'."\n");
if($option['destroy-forcefull']==1) {
$x=exec('ps x | grep "php check_working_child.php '.$i.' '.$child_time_limit.'" | grep -v "grep" | grep -v "sh -c"');
echo 'pscomm> '.$x."\n";
$x=explode(' ',trim(str_replace("\t",' ',$x)));
//print_r($x);
if(is_numeric($x[0])) {
$c='kill -9 '.$x[0];
echo 'killcommand> '.$c."\n";
$x=exec($c);
}
}
@proc_close($workers[$i]['link']);
unset($workers[$i]);
}
if($cansleep==true) {
sleep($option['sleep-after-destroy']);
}
}
function startAWorker($i) {
global $workers;
global $option;
global $child_time_limit;
$runcommand='php check_working_child.php '.$i.' '.$child_time_limit.' > check_working_child_logs/'.$i.'.normal.log';
doE('Starting [['.$i.']]: '.$runcommand."\n");
$workers[$i]=array(
'desc' => array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", 'check_working_child_logs/'.$i.'.error.log', "a")
),
'pipes' => null,
'link' => null,
'start-time' => mktime()
);
$workers[$i]['link']=proc_open(
$runcommand,
$workers[$i]['desc'],
$workers[$i]['pipes'],
$option['dir-run']
);
sleep($option['sleep-after-create']);
}
function checkAWorker($i) {
global $workers;
global $option;
$temp=proc_get_status($workers[$i]['link']);
if($temp['running']===false) {
doE('Worker [['.$i.']] finished'."\n");
if(is_file('check_working_child_logs/'.$i.'.normal.log') && filesize('check_working_child_logs/'.$i.'.normal.log')>0) {
doE('--------'."\n");
echo file_get_contents('check_working_child_logs/'.$i.'.normal.log');
doE('-------'."\n");
}
endAWorker($i);
} else {
if($option['age-max']>0) {
if($workers[$i]['start-time']+$option['age-max']$v) {
endAWorker($i,false);
}
@doE('Done killing workers.'."\n");
}
register_shutdown_function('endAllWorkers');
while(1) {
$step++;
foreach($workers as $index=>$v) {
checkAWorker($index);
}
if(count($workers)==$option['workers-max']) {
} elseif(count($workers)$option['workers-max']) {
$wl=array_keys($workers);
$wl=array_pop($wl);
doE('Killing worker [['.$wl.']]');
endAWorker($wl[0]);
}
}
这篇关于PHP使用proc_open,以便它不等待它打开(运行)的脚本完成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!