欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP實(shí)現(xiàn)執(zhí)行外部程序的方法詳解

 更新時(shí)間:2017年08月17日 10:59:39   作者:Jackwoo  
這篇文章主要介紹了PHP實(shí)現(xiàn)執(zhí)行外部程序的方法,結(jié)合實(shí)例形式分析了php執(zhí)行外部程序的常用函數(shù)相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP實(shí)現(xiàn)執(zhí)行外部程序的方法。分享給大家供大家參考,具體如下:

在一些特殊情況下,會(huì)使用PHP調(diào)用外部程序執(zhí)行,比如:調(diào)用shell命令、shell腳本、可執(zhí)行程序等等,今天在源碼中了解了一下PHP執(zhí)行外部程序的方法,借此機(jī)會(huì)順便整理一下。

在源碼中 exec.h文件中,列出了可調(diào)用外部程序的幾個(gè)函數(shù),藍(lán)色框里的兩個(gè)函數(shù)只是輔助作用,本文只對(duì)其他幾個(gè)函數(shù)做介紹。

前提

1 PHP沒有運(yùn)行在安全模式,關(guān)掉安全模式,即:safe_mode = off

2 禁用函數(shù)列表 disable_functions =  exec, system, shell_exec,proc_open, popen, 如果禁用了,就關(guān)掉。

注意:執(zhí)行外部程序是存在風(fēng)險(xiǎn)的,所以使用這些函數(shù)要在確保安全的情況下使用。

exec() 函數(shù)

原型:string exec ( string command [, array &output [, int &return_var]] )

描述:返回值保存最后的輸出結(jié)果,而所有輸出結(jié)果將會(huì)保存到$output數(shù)組,$return_var用來保存命令執(zhí)行的狀態(tài)碼(用來檢測(cè)成功或失?。?。

例子:

<?php
exec('whoami',$output, $status);
var_dump($output);
exit;

輸出結(jié)果:

array(1) {
 [0]=>
 string(7) "hedong"
}

注意:

① 輸出結(jié)果會(huì)逐行追加到$output中,因此在調(diào)用exec之前需要unset($output),特別是循環(huán)調(diào)用的時(shí)候。

② 如果想通過exec調(diào)用外部程序后馬上繼續(xù)執(zhí)行后續(xù)代碼,僅僅在命令里加"&"是不夠的,此時(shí)exec依然會(huì)等待命令執(zhí)行完畢;需要再將標(biāo)準(zhǔn)輸出做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);

shell_exec() 函數(shù)

原型:string shell_exec( string command)

描述:通過 shell 環(huán)境執(zhí)行命令,并且將完整的輸出以字符串的方式返回。

例子:

<?php
$output = shell_exec('whoami');
echo "$output"; // hedong
exit;

注意:

當(dāng)進(jìn)程執(zhí)行過程中發(fā)生錯(cuò)誤,或者進(jìn)程不產(chǎn)生輸出的情況下,都會(huì)返回 NULL, 所以,使用本函數(shù)無法通過返回值檢測(cè)進(jìn)程是否成功執(zhí)行。 如果需要檢查進(jìn)程執(zhí)行的退出碼,請(qǐng)使用 exec() 函數(shù)。

system() 函數(shù)

原型:string system ( string command [, int &return_var] )

描述:執(zhí)行給定的命令,返回最后的輸出結(jié)果;第二個(gè)參數(shù)是可選的,用來得到命令執(zhí)行后的狀態(tài)碼。

例子:

<?php
system("whoami", $status); // 直接輸出
var_dump($status); // 成功時(shí)狀態(tài)碼是 0
exit;

輸出結(jié)果:hedong

passthru() 函數(shù)

原型:void passthru (string command [, int return_var])

描述:執(zhí)行給定的命令,但不返回任何輸出結(jié)果,而是直接輸出到顯示設(shè)備上;第二個(gè)參數(shù)可選,用來得到命令執(zhí)行后的狀態(tài)碼。

用途:當(dāng)所執(zhí)行的 Unix 命令輸出二進(jìn)制數(shù)據(jù), 并且需要直接傳送到瀏覽器的時(shí)候, 需要用此函數(shù)來替代 exec() 或 system() 函數(shù)

例子:

<?php
passthru("whoami", $status); // 直接輸出
var_dump($status); // 成功時(shí)狀態(tài)碼是 0
exit;

輸出結(jié)果:hedong

popen() 函數(shù)

原型:resource popen ( string command, string mode )

描述:打開一個(gè)指向進(jìn)程的管道,該進(jìn)程由派生給定的 command 命令執(zhí)行而產(chǎn)生。 返回一個(gè)和 fopen() 所返回的相同的文件指針,只不過它是單向的(只能用于讀或?qū)懀┎⑶冶仨氂?pclose() 來關(guān)閉。此指針可以用于 fgets(),fgetss() 和 fwrite()。

例子:

$fd = popen("command", 'r');
$ret = fgets($fd);

注意:只能打開單向管道,不是'r'就是'w';并且需要使用pclose()來關(guān)閉。

proc_open() 函數(shù)

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

描述:與popen類似,但是可以提供雙向管道。

例子:

<?php
/**
 * @author: hedong
 * @date 2017-04-04
 */
// 管道配置
$descriptors = array(
  0 => array("pipe", "r"),
  1 => array("pipe", "w")
);
$process = proc_open("php", $descriptors, $pipes);
if (is_resource($process)) {
  fwrite($pipes[0], "<?php\n");
  fwrite($pipes[0], " \$rand = rand(1,2);\n");
  fwrite($pipes[0], " if (\$rand == 1) {\n");
  fwrite($pipes[0], "  echo \"Hello, World!\n\";\n");
  fwrite($pipes[0], " } else {");
  fwrite($pipes[0], "  echo \"Goodbye, World!\n\";\n");
  fwrite($pipes[0], " }");
  fwrite($pipes[0], "?>");
  fclose($pipes[0]);
  $output = "";
  while (!feof($pipes[1])) {
    $output .= fgets($pipes[1]);
  }
  $output = strtoupper($output);
  echo $output; fclose($pipes[1]);
  proc_close($process);
}

輸出結(jié)果:

GOODBYE, WORLD!

注意:

① 后面需要使用proc_close()關(guān)閉資源,并且如果是pipe類型,需要用pclose()關(guān)閉句柄。
② proc_open打開的程序作為php的子進(jìn)程,php退出后該子進(jìn)程也會(huì)退出。

總結(jié):

exec函數(shù)將輸出結(jié)果保存在第二個(gè)參數(shù)上;

shell_exec函數(shù)沒有參數(shù)中接收返回值,而且沒有執(zhí)行成功的狀態(tài)碼;

system函數(shù)將執(zhí)行的結(jié)果直接輸出;passthru函數(shù)同system函數(shù),不同之處是適合處理輸出二進(jìn)制數(shù)據(jù);

popen函數(shù)會(huì)fork一個(gè)子進(jìn)程,返回文件指針

proc_open函數(shù)同popen,但可提供雙向通道

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》、《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)》及《php正則表達(dá)式用法總結(jié)

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 詳解PHP中的mb_detect_encoding函數(shù)使用方法

    詳解PHP中的mb_detect_encoding函數(shù)使用方法

    這篇文章主要介紹了詳解PHP中的mb_detect_encoding函數(shù)使用方法,包括對(duì)字符串編碼的轉(zhuǎn)換和判斷以及Call to undefined function mb_detect_encoding()錯(cuò)誤的解決,需要的朋友可以參考下
    2015-08-08
  • PHP實(shí)現(xiàn)簡(jiǎn)單的協(xié)程任務(wù)調(diào)度demo示例

    PHP實(shí)現(xiàn)簡(jiǎn)單的協(xié)程任務(wù)調(diào)度demo示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)簡(jiǎn)單的協(xié)程任務(wù)調(diào)度demo,結(jié)合實(shí)例形式詳細(xì)分析了PHP基于協(xié)程的任務(wù)調(diào)度基本原理、定義及使用技巧,需要的朋友可以參考下
    2020-02-02
  • php中利用str_pad函數(shù)生成數(shù)字遞增形式的產(chǎn)品編號(hào)

    php中利用str_pad函數(shù)生成數(shù)字遞增形式的產(chǎn)品編號(hào)

    PHP開發(fā)項(xiàng)目中,在做產(chǎn)品編號(hào)時(shí),客戶反要求自動(dòng)生成產(chǎn)品編號(hào),格式如”QB00001″,數(shù)字遞增形式
    2013-09-09
  • php判斷當(dāng)前用戶已在別處登錄的方法

    php判斷當(dāng)前用戶已在別處登錄的方法

    這篇文章主要介紹了php判斷當(dāng)前用戶已在別處登錄的方法,主要利用session記錄用戶登錄信息來完成這一功能,是非常實(shí)用的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • php寫入txt亂碼的解決方法

    php寫入txt亂碼的解決方法

    在本篇文章里小編給大家分享的是關(guān)于php寫入txt亂碼的知識(shí)點(diǎn)以及解決方法,有需要的朋友們參考下。
    2019-09-09
  • PHP循環(huán)與分支知識(shí)點(diǎn)梳理

    PHP循環(huán)與分支知識(shí)點(diǎn)梳理

    涉及到一些比較復(fù)雜的邏輯,分支與循環(huán)是必不可少的。通過分支和循環(huán)的結(jié)合使用可以使業(yè)務(wù)更加復(fù)雜,代碼功能更加強(qiáng)大,這篇文章主要介紹了PHP循環(huán)與分支知識(shí)點(diǎn)
    2022-11-11
  • php輸出全球各個(gè)時(shí)區(qū)列表的方法

    php輸出全球各個(gè)時(shí)區(qū)列表的方法

    這篇文章主要介紹了php輸出全球各個(gè)時(shí)區(qū)列表的方法,自定義了一個(gè)數(shù)組變量用于存放全球各個(gè)時(shí)區(qū)信息,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • PHP抽象類與接口的區(qū)別詳解

    PHP抽象類與接口的區(qū)別詳解

    今天小編就為大家分享一篇關(guān)于PHP抽象類與接口的區(qū)別詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • PHP緩存技術(shù)的使用說明

    PHP緩存技術(shù)的使用說明

    PHP緩存技術(shù)的應(yīng)用時(shí)相當(dāng)普遍的,也許有些人還對(duì)這項(xiàng)技術(shù)不太了解,我們現(xiàn)在就為大家詳細(xì)的介紹一下PHP緩存技術(shù)的相關(guān)應(yīng)用技巧。
    2011-08-08
  • php中使用url傳遞數(shù)組的方法

    php中使用url傳遞數(shù)組的方法

    這篇文章主要介紹了php中使用url傳遞數(shù)組的方法,實(shí)例分析了URL傳遞數(shù)組發(fā)送與接收的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評(píng)論