proc_open

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

proc_open 执锟斤拷一锟斤拷锟斤拷锟筋,锟斤拷锟揭达拷锟斤拷锟斤拷锟斤拷锟斤拷/锟斤拷锟斤拷锟斤拷募锟街革拷搿�

说锟斤拷

proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] ) : resource

锟斤拷锟斤拷 popen() 锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷 proc_open() 锟结供锟剿革拷锟斤拷强锟斤拷目锟斤拷瞥锟斤拷锟街达拷械锟斤拷锟斤拷锟斤拷锟�

锟斤拷锟斤拷

cmd

要执锟叫碉拷锟斤拷锟斤拷

descriptorspec

一锟斤拷锟斤拷锟斤拷锟斤拷锟介。 锟斤拷锟斤拷募锟斤拷锟绞撅拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆拷锟街碉拷锟绞� PHP 锟斤拷谓锟斤拷锟叫╋拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷咏锟斤拷獭锟� 0 锟斤拷示锟斤拷准锟斤拷锟诫(stdin锟斤拷锟斤拷1 锟斤拷示锟斤拷准锟斤拷锟斤拷锟絪tdout锟斤拷锟斤拷2 锟斤拷示锟斤拷准锟斤拷锟斤拷stderr锟斤拷锟斤拷

锟斤拷锟斤拷锟叫碉拷元锟截匡拷锟斤拷锟角o拷

  • 锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤拷锟斤拷锟教的管碉拷锟斤拷锟斤拷锟斤拷锟斤拷息锟斤拷 锟斤拷一锟斤拷元锟斤拷为锟斤拷锟斤拷锟斤拷锟斤拷锟酵o拷 锟节讹拷锟斤拷元锟斤拷锟斤拷锟斤拷愿锟斤拷锟斤拷锟斤拷锟斤拷锟窖★拷睢� 锟斤拷效锟斤拷锟斤拷锟斤拷锟叫o拷pipe 锟斤拷锟节讹拷锟斤拷元锟截匡拷锟斤拷锟角o拷 r 锟斤拷锟斤拷檀锟斤拷透霉艿锟斤拷亩锟饺★拷耍锟�w 锟斤拷锟斤拷檀锟斤拷透霉艿锟斤拷锟叫达拷锟剿o拷锟斤拷 锟皆硷拷 file锟斤拷锟节讹拷锟斤拷元锟斤拷为锟侥硷拷锟斤拷锟斤拷锟斤拷
  • 锟斤拷锟揭伙拷锟斤拷锟绞碉拷募锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆达拷锟斤拷锟� 锟斤拷锟斤拷锟界:锟窖打开碉拷锟侥硷拷锟斤拷一锟斤拷 socket 锟剿口o拷STDIN锟斤拷锟斤拷

锟侥硷拷锟斤拷锟斤拷锟斤拷锟斤拷值锟斤拷锟斤拷锟斤拷 0锟斤拷1 锟斤拷 2锟斤拷锟斤拷锟斤拷锟绞癸拷锟斤拷魏锟斤拷锟叫э拷锟斤拷募锟斤拷锟斤拷锟斤拷锟� 锟斤拷锟斤拷锟戒传锟斤拷锟斤拷锟接斤拷锟教★拷 锟斤拷使锟斤拷锟斤拷慕疟锟斤拷锟斤拷院锟斤拷锟斤拷锟斤拷疟锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� 锟斤拷锟界,锟斤拷锟斤拷通锟斤拷指锟斤拷锟侥硷拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆革拷锟接帮拷全锟侥凤拷式 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 PGP锟斤拷GPG 锟斤拷 openssl 锟斤拷锟斤拷 同时也锟斤拷锟皆很凤拷锟斤拷幕锟饺★拷锟叫╋拷锟斤拷锟斤拷状态锟斤拷息锟斤拷

pipes

锟斤拷锟斤拷锟斤拷为锟斤拷锟斤拷锟斤拷锟介, 锟斤拷锟叫碉拷元锟斤拷锟角憋拷执锟叫筹拷锟津创斤拷锟侥管碉拷锟斤拷应锟斤拷 PHP 锟斤拷一锟剿碉拷锟侥硷拷指锟诫。

cwd

要执锟斤拷锟斤拷锟斤拷某锟绞硷拷锟斤拷锟侥柯硷拷锟� 锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷 路锟斤拷锟斤拷 锟斤拷锟矫此诧拷锟斤拷为 NULL 锟斤拷示使锟斤拷默锟斤拷值锟斤拷锟斤拷前 PHP 锟斤拷锟教的癸拷锟斤拷目录锟斤拷锟斤拷

env

要执锟叫碉拷锟斤拷锟斤拷锟斤拷使锟矫的伙拷锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷锟矫此诧拷锟斤拷为 NULL 锟斤拷示使锟矫和碉拷前 PHP 锟斤拷锟斤拷锟斤拷同锟侥伙拷锟斤拷锟斤拷锟斤拷锟斤拷

other_options

锟姐还锟斤拷锟斤拷指锟斤拷一些锟斤拷锟斤拷选锟筋。 目前支锟街碉拷选锟斤拷锟斤拷锟斤拷锟�

  • suppress_errors 锟斤拷锟斤拷锟斤拷锟斤拷 Windows 平台锟斤拷锟斤拷 锟斤拷锟斤拷为 TRUE 锟斤拷示锟斤拷锟狡憋拷锟斤拷锟斤拷锟斤拷锟斤拷锟侥达拷锟斤拷
  • bypass_shell 锟斤拷锟斤拷锟斤拷锟斤拷 Windows 平台锟斤拷锟斤拷 锟斤拷锟斤拷为 TRUE 锟斤拷示锟狡癸拷 cmd.exe shell锟斤拷

锟斤拷锟斤拷值

锟斤拷锟截憋拷示锟斤拷锟教碉拷锟斤拷源锟斤拷锟酵o拷 锟斤拷使锟斤拷锟斤拷锟街拷锟斤拷锟斤拷锟斤拷 proc_close() 锟斤拷锟斤拷锟斤拷锟截闭达拷锟斤拷源锟斤拷 锟斤拷锟绞э拷埽锟斤拷锟斤拷锟� FALSE锟斤拷

锟斤拷锟斤拷锟斤拷志

锟芥本 说锟斤拷
5.2.1 other_options 锟斤拷锟斤拷锟斤拷锟斤拷 bypass_shell 选锟筋。

锟斤拷锟斤拷

Example #1 proc_open() 锟斤拷锟斤拷

<?php
$descriptorspec 
= array(
   
=> array("pipe""r"),  // 锟斤拷准锟斤拷锟诫,锟接斤拷锟教从此管碉拷锟叫讹拷取锟斤拷锟斤拷
   
=> array("pipe""w"),  // 锟斤拷准锟斤拷锟斤拷锟斤拷咏锟斤拷锟斤拷锟剿管碉拷锟斤拷写锟斤拷锟斤拷锟斤拷
   
=> array("file""/tmp/error-output.txt""a"// 锟斤拷准锟斤拷锟斤拷写锟诫到一锟斤拷锟侥硷拷
);

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

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

if (
is_resource($process)) {
    
// $pipes 锟斤拷锟节匡拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟侥o拷
    // 0 => 锟斤拷锟斤拷锟斤拷锟接斤拷锟教憋拷准锟斤拷锟斤拷写锟斤拷木锟斤拷
    // 1 => 锟斤拷锟皆达拷锟接斤拷锟教憋拷准锟斤拷锟斤拷锟饺★拷木锟斤拷
    // 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟阶凤拷拥锟斤拷募锟� /tmp/error-output.txt

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

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

    
// 锟叫记o拷锟节碉拷锟斤拷 proc_close 之前锟截憋拷锟斤拷锟叫的管碉拷锟皆憋拷锟斤拷锟斤拷锟斤拷锟斤拷
    
$return_value proc_close($process);

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

锟斤拷锟斤拷锟斤拷锟教碉拷锟斤拷锟斤拷锟斤拷锟斤拷冢锟�

Array
(
    [some_option] => aeiou
    [PWD] => /tmp
    [SHLVL] => 1
    [_] => /usr/local/bin/php
)
command returned 0

注锟斤拷

Note:

Windows 锟斤拷锟斤拷锟皆o拷锟斤拷锟斤拷 2 锟斤拷锟斤拷锟斤拷锟斤拷也锟斤拷锟斤拷锟斤拷为锟缴继承的撅拷锟斤拷锟斤拷偷锟斤拷咏锟斤拷獭锟� 锟斤拷锟角o拷锟斤拷锟斤拷 Windows 锟侥架癸拷锟斤拷锟斤拷锟斤拷锟侥硷拷锟斤拷锟斤拷锟斤拷锟酵底诧拷锟斤拷锟斤拷锟叫癸拷锟斤拷锟斤拷 锟斤拷锟皆o拷锟接斤拷锟斤拷锟睫凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟侥撅拷锟斤拷锟� 锟斤拷准锟斤拷锟诫,锟斤拷准锟斤拷锟斤拷捅锟阶拷锟斤拷锟结按锟斤拷预锟节癸拷锟斤拷锟斤拷

Note:

锟斤拷锟斤拷锟街伙拷锟揭拷锟斤拷锟侥斤拷锟教管碉拷锟斤拷 使锟斤拷 popen() 锟斤拷锟斤拷锟斤拷锟斤拷蛹虻ァ锟�

锟轿硷拷

  • popen() - 锟津开斤拷锟斤拷锟侥硷拷指锟斤拷
  • exec() - 执锟斤拷一锟斤拷锟解部锟斤拷锟斤拷
  • system() - 执锟斤拷锟解部锟斤拷锟津,诧拷锟斤拷锟斤拷示锟斤拷锟�
  • passthru() - 执锟斤拷锟解部锟斤拷锟斤拷锟斤拷锟斤拷示原始锟斤拷锟�
  • stream_select() - Runs the equivalent of the select() system call on the given arrays of streams with a timeout specified by tv_sec and tv_usec
  • The 执锟叫诧拷锟斤拷锟斤拷