phpcommand-lineproc-open

PHP using proc_open so that it doesn't wait for the script it opens (runs) to finish?


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));

Solution

  • 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]);
            }
    }