2016-01-20 6 views
7

जावा और पायथन में, आपके पास ProcessBuilder या subprocess मॉड्यूल हैं जो आपको अनचाहे तारों का उपयोग करके आसानी से प्रक्रिया शुरू करने देते हैं। ["ls", "some unescaped directory name"] - वे आपको शक्तिशाली उपकरण भी प्रदान करते हैं जैसे स्टडआउट, stderr से पढ़ने के लिए उपयोग। क्या PHP की कोई समतुल्य विशेषता है जो exec() से अधिक बुद्धिमान और उपयोगी है?PHP में subprocess के बराबर कोई समकक्ष?

+1

ईमानदारी से PHP प्रक्रियाओं को चलाने के लिए नहीं बनाया गया है। –

+0

वास्तव में? मैंने यही सोचा, हालांकि * आधुनिक PHP * में वे कहते हैं कि आप PHP को एक स्क्रिप्टिंग भाषा के रूप में उपयोग कर सकते हैं जैसे बैश - "PHP का उपयोग शक्तिशाली कमांड लाइन अनुप्रयोगों (जैसे बैश, रूबी, पायथन, आदि) के निर्माण के लिए भी किया जा सकता है। कई PHP डेवलपर्स इसका एहसास नहीं करते हैं और वास्तव में एक रोमांचक सुविधा पर चूक जाते हैं। " - http://shop.oreilly.com/product/0636920033868.do – NoBugs

+0

सुनिश्चित नहीं है कि [popen] (http://php.net/manual/en/function.popen.php) आपके लिए सहायक है। – Jigar

उत्तर

4

निकटतम बराबर है कि आप stdin, stdout, और stderr के लिए पहुँच, दो तरह से संचार के साथ देता है, proc_open() होगा।

<?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"; 
} 
?> 

आप केवल stdout और stdin, आप popen() उपयोग कर सकते हैं की जरूरत है:

यहाँ डॉक्स से उदाहरण दिया गया है।

के बाद से मैनुअल के बेकार है यह, मेरी संशोधित उदाहरण है:

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

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

pclose($handle); 

यह आउटपुट की लाइनों की एक सरणी में /path/to/executable के उत्पादन में पढ़ा जाएगा।

आपने तर्कों से बचने के बारे में भी पूछा। आप escapeshellarg() के साथ ऐसा कर सकते हैं:

$escapedArg = escapeshellarg($arg); 
संबंधित मुद्दे