2016-01-20 21 views
7

Trong Java và Python, bạn có các mô-đun ProcessBuilder hoặc subprocess cho phép bạn dễ dàng bắt đầu quá trình bằng cách sử dụng các chuỗi chưa thoát, ví dụ: ["ls", "some unescaped directory name"] - chúng cũng cung cấp cho bạn các công cụ mạnh mẽ như truy cập để đọc từ stdout, stderr. Có tính năng tương đương nào của PHP thông minh hơn và hữu ích hơn chỉ là exec() không?Bất kỳ tương đương với tiến trình con trong PHP?

+1

Thực ra PHP không được thực hiện để chạy quy trình. –

+0

Thật sao? Đó là những gì tôi nghĩ, mặc dù trong * PHP hiện đại * họ nói bạn có thể sử dụng PHP như một ngôn ngữ kịch bản như Bash - "PHP cũng có thể được sử dụng để xây dựng các ứng dụng dòng lệnh mạnh mẽ (giống như bash, Ruby, Python, vv) Nhiều nhà phát triển PHP không nhận ra điều này và bỏ lỡ một tính năng thực sự thú vị. " - http://shop.oreilly.com/product/0636920033868.do – NoBugs

+0

không chắc chắn nếu [popen] (http://php.net/manual/en/function.popen.php) hữu ích cho bạn. – Jigar

Trả lời

4

Tương đương gần nhất cung cấp cho bạn quyền truy cập vào stdin, stdoutstderr, với giao tiếp hai chiều, sẽ là proc_open().

Dưới đây là các ví dụ từ các tài liệu:

<?php 
$descriptorspec = array(
    0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
    1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
    2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to 
); 

$cwd = '/tmp'; 
$env = array('some_option' => 'aeiou'); 

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 

if (is_resource($process)) { 
    // $pipes now looks like this: 
    // 0 => writeable handle connected to child stdin 
    // 1 => readable handle connected to child stdout 
    // Any error output will be appended to /tmp/error-output.txt 

    fwrite($pipes[0], '<?php print_r($_ENV); ?>'); 
    fclose($pipes[0]); 

    echo stream_get_contents($pipes[1]); 
    fclose($pipes[1]); 

    // It is important that you close any pipes before calling 
    // proc_close in order to avoid a deadlock 
    $return_value = proc_close($process); 

    echo "command returned $return_value\n"; 
} 
?> 

Nếu bạn chỉ cần stdoutstdin, bạn có thể sử dụng popen().

Đây là ví dụ sửa đổi của tôi, từ những tay hút:

<?php 
$handle = popen('/path/to/executable', 'r'); 

$lines = []; 
while (!feof($handle)) 
{ 
    $lines[] = fgets($handle); 
} 

pclose($handle); 

này sẽ đọc đầu ra của /path/to/executable vào một loạt các dòng sản lượng.

Bạn cũng đã hỏi về các đối số thoát. Bạn có thể làm điều đó với escapeshellarg():

$escapedArg = escapeshellarg($arg); 
Các vấn đề liên quan