request = $request; $this->output = ''; $descriptorspec = array( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w"), // stderr 3 => array("pipe", "w") // ); switch ($timeout_util) { case "BusyBox": $commandline = '/usr/bin/timeout -t 60 '.$command.' '.implode(' ', array_map('escapeshellarg', $args)); break; default: $commandline = '/usr/bin/timeout 60s '.$command.' '.implode(' ', array_map('escapeshellarg', $args)); } $this->handle = proc_open($commandline, $descriptorspec, $this->pipes); stream_set_blocking($this->pipes[1], 0); stream_set_blocking($this->pipes[2], 0); } /** * Get data from the child process * @return string output from the child process */ public function get_data() { if(isset($this->handle) && is_resource($this->handle)) { $out = fread($this->pipes[1], 4096); $this->output .= $out; $this->errors .= fread($this->pipes[2], 4096); if(feof($this->pipes[1]) && feof($this->pipes[2])) { foreach($this->pipes as $ref => $pipe) { fclose($this->pipes[$ref]); } unset($this->handle); if($this->errors) { echo $this->errors; $this->output = ''; } return array('done' => true, 'output' => $this->output); } } } /** * Delete the request that triggered this sync */ public function __destruct() { global $sync_request_dir; if(!is_null($this->request)) { $sync_request_dir->delete_sync_request($this->request); } } }