PHP爆炸功能无法按预期工作

时间:2014-08-12 20:16:22

标签: php arrays explode

我遇到的问题是PHP的explode()功能对我不起作用。如果我对它进行了讨论,我会得到Array ( [0] => 17396 17400 17404 17408 17412 17416 17420 17424 17428 )或类似的不同数字(这些数字是进程ID' s)。如果我vardump $temp,那么我得到string(53) "17396 17400 17404 17408 17412 17416 17420 17424 17428"。为什么explode()会像这样将它们放入数组中?

<?php
function status($pid){
        $command = 'ps -p '.$pid;
        exec($command,$op);
        if (!isset($op[1]))return false;
        else return true;
}

function checkProcesses($pids) {
    foreach ($pids as $i => $pid) {
        if( !status($pid)) {
            echo 'deleting value<br />';
            unset($pids[$i]);
        }
    }
    if( !empty($pids)) {
        echo 'recursion<br />';
        checkProcesses($pids);
    }
}
?>
<?php
    $cmd_array = array(291924,262437,231687,280261,229298,236197,230375,275225,230418);
    $processes = array();
    foreach($cmd_array as $i => $cmd) {
        $processes[$i] = new Process();
        $processes[$i]->command = 'wget -O ./files/'.$cmd.'.html http://www.example.com/'.$cmd;
        $temp = $processes[$i]->runCom();
    }
    $pids = explode(" ", $temp); // This is where I'm having the issue
    checkProcesses($pids);
    foreach($cmd_array as $i => $cmd) {
        echo 'wget for '.$cmd.' => PID: '.$pids[$i].'<br />';
    }  
?>
<?php
class Process
{
    public $pid;
    public $command;

    public function runCom(){
        $command = 'nohup '.$this->command.' > /dev/null &';
        shell_exec($command);
        $pid = shell_exec('ps -C wget -o pid=');
        return $pid;
    }

    public function stop(){
        $command = 'kill '.$this->pid;
        exec($command);
        if ($this->status() == false)return true;
        else return false;
    }
}
?>

3 个答案:

答案 0 :(得分:1)

你需要在循环中进行爆炸。

$pids = array();
foreach($cmd_array as $i => $cmd) {
    $processes[$i] = new Process();
    $processes[$i]->command = 'wget -O ./files/'.$cmd.'.html http://www.example.com/'.$cmd;
    $temp = $pprocesses[$i]->runCom();
    $pids = array_merge($pids, explode("\n", $temp));
}
$pids = array_unique($pids);

我还改变explode使用换行而不是空格。听起来你的Process类只是返回命令的输出,如果它类似于ps -o pid=,那么每个PID将在不同的行上,而不是以空格分隔。

答案 1 :(得分:0)

您可以尝试使用preg_split分割字符串:

$pids = preg_split('/\s+/',$temp);

将被whitepace“爆炸”。

答案 2 :(得分:0)

感谢@AbraCadaver的建议。就是这样。

“你在一个空间爆炸。没有空间。看起来像空间的东西是其他东西,也许换行\ n?”