php系統函數,php語法和常用的函數

本文目錄一覽:

PHP執行linux系統命令的常用函數使用說明

system函數

說明:執行外部程序並顯示輸出資料。

語法:string

system(string

command,

int

[return_var]);

返回值:

字元串

詳細介紹:

本函數就像是

C

語中的函數

system(),用來執行指令,並輸出結果。若是

return_var

參數存在,則執行

command

之後的狀態會填入

return_var

中。同樣值得注意的是若需要處理用戶輸入的資料,而又要防止用戶耍花招破解系統,則可以使用

EscapeShellCmd()。若

PHP

以模塊式的執行,本函數會在每一行輸出後自動更新

Web

伺服器的輸出緩衝暫存區。若需要完整的返回字元串,且不想經過不必要的其它中間的輸出界面,可以使用

PassThru()。

實例代碼:

複製代碼

代碼如下:

?php

$last_line

=

system(‘ls’,

$retval);

echo

‘Last

line

of

the

output:

.

$last_line;

echo

‘hr

/Return

value:

.

$retval;

?

exec函數

說明:執行外部程序。

語法:string

exec(string

command,

string

[array],

int

[return_var]);

返回值:

字元串

詳細介紹:

本函數執行輸入

command

的外部程序或外部指令。它的返回字元串只是外部程序執行後返回的最後一行;若需要完整的返回字元串,可以使用

PassThru()

這個函數。

要是參數

array

存在,command

會將

array

加到參數中執行,若不欲

array

被處理,可以在執行

exec()

之前呼叫

unset()。若是

return_var

array

二個參數都存在,則執行

command

之後的狀態會填入

return_var

中。

值得注意的是若需要處理使用者輸入的資料,而又要防止使用者耍花招破解系統,則可以使用

EscapeShellCmd()。

實例代碼:

複製代碼

代碼如下:

?php

echo

exec(‘whoami’);

?

popen函數

說明:打開文件。

語法:int

popen(string

command,

string

mode);

返回值:

整數

詳細介紹:

本函數執行指令開檔,而該文件是用管道方式處理的文件。用本函數打開的文件只能是單向的

(只能讀或只能寫),而且一定要用

pclose()

關閉。在文件操作上可使用

fgets()、fgetss()

fputs()。若是開檔發生錯誤,返回

false

值。

實例代碼:

複製代碼

代碼如下:

?

$fp

=

popen(“/bin/ls”,”r”

);

?

PHP監控linux伺服器負載

在實際項目的應用中,我們由於各種條件的現實,利用PHP來實現伺服器負載監控將是一種更為靈活的方式。

由於Web

Server以及PHP的實現方式所限,我們在現實環境中很難利用PHP去調用一些Linux中需要root許可權才能執行的程序,對此,我從網上找到另外一種方式來繞開這個限制。首先先寫個c程序中轉調用系統命令,然後用PHP去執行此c程序。

c程序

首先寫個c文件,比如/usr/local/ismole/w.c

複製代碼

代碼如下:

#includestdio.h

#includestdlib.h

#includesystypes.h

#includeunistd.h

int

main()

{

uid_t

uid

,euid;

//note

獲得當前的uid

uid

=

getuid();

//note

獲得當前euid

euid

=

geteuid();

//note

交換這兩個id

if(setreuid(euid,

uid))

perror(“setreuid”);

//note

執行將要執行linux系統命令

system(“/usr/bin/w”);

return0;

}

編譯該文件gcc

-o

w

-Wall

w.c,這時會在當前目錄下生成程序w。改變此程序的屬主chmod

u+s

./w。

PHP執行

文件內容如下,放在web目錄下,訪問就會輸出當前的伺服器負載情況。

複製代碼

代碼如下:

?php

/*

More

Original

PHP

Framwork

Copyright

(c)

2007

2008

IsMole

Inc.

$Id:

serverMonitor.php

408

2008-12-02

08:07:40Z

kimi

$

*/

//note

key的驗證過程

if($key

!=

$authkey)

{

//

exit(‘key

error);

}

$last_line

=

exec(‘/usr/local/ismole/w’,

$retval);

$returnArray

=

explode(“load

average:

“,

$retval[0]);

$returnString

=

$returnArray[1];

echo

$returnString; 

 按照上面的實例,我們可以用PHP來做任何我們想執行的Linux系統命令,SVN更新,伺服器監控,備份,恢復,日常維護等等。

10 個經典PHP函數

1.

sys_getloadavg()

sys_getloadavt()可以獲得系

統負載情況。該函數返回一個包含三個元素的數組,每個元素分別代表系統再過去的1、5和15分鐘內的平均負載。

與其讓伺服器因負

載過高而宕掉,不如在系統負載很高時主動die掉一個腳本,sys_getloadavg()就是用來幫你實現這個功能的。

不過很遺憾,該函數在windows下無效。

2.

pack()

Pack()

能將md5()返回的32位16進位字元串轉換為16位的二進位字元串,可以節省存儲空間。

3.

cal_days_in_month()

cal_days_in_month()能夠返回指定月份共有多少天。

4.

_()

WordPress開發者經常能見到這個函數,還有

_e()。這兩個函數功能相同,與gettext()函數結合使用,能實現網站的多語言化。具體可參見PHP手冊的相關部分介紹。

5.

get_browser()

在發送頁面前先看看用戶的瀏覽器都能做些什麼是

不是挺好?get_browser()能獲得用戶的瀏覽器類型,以及瀏覽器支持的功能,不過首先你需要一個php_browscap.ini文件,用來給

函數做參考文件。

要注意,該函數對瀏覽器功能的判斷是基於該類瀏覽器的一般特性的。例如,如果用戶關閉了瀏覽器對

JavaScript的支持,函數無法得知這一點。但是在判斷瀏覽器類型和OS平台方面,該函數還是很準確的。

6.

debug_print_backtrace()

這是一個調試用的函數,能幫助你發現代碼中的邏輯錯誤。要理

解這個函數,還是直接看個例子吧:

$a

=

0;

function

iterate()

{

global

$a;

if(

$a

10

)

recur();

echo

$a

.

「,

「;

}

function

recur()

{

global

$a;

$a++;

//

how

did

I

get

here?

echo

「\n\n\n」;

debug_print_backtrace();

if(

$a

10

)

iterate();

}

iterate();

#

OUTPUT:

#0

recur()

called

at

[C:\htdocs\php_stuff\index.php:8]

#1

iterate()

called

at

[C:\htdocs\php_stuff\index.php:25]

#0

recur()

called

at

[C:\htdocs\php_stuff\index.php:8]

#1

iterate()

called

at

[C:\htdocs\php_stuff\index.php:21]

#2

recur()

called

at

[C:\htdocs\php_stuff\index.php:8]

#3

iterate()

called

at

[C:\htdocs\php_stuff\index.php:25]

#0

recur()

called

at

[C:\htdocs\php_stuff\index.php:8]

#1

iterate()

called

at

[C:\htdocs\php_stuff\index.php:21]

#2

recur()

called

at

[C:\htdocs\php_stuff\index.php:8]

#3

iterate()

called

at

[C:\htdocs\php_stuff\index.php:21]

#4

recur()

called

at

[C:\htdocs\php_stuff\index.php:8]

#5

iterate()

called

at

[C:\htdocs\php_stuff\index.php:25]

7.

metaphone()

這個函數返回單詞的metaphone值,相同讀音的單詞具有相同的metaphone值,也就是說這個函數可以幫你判斷兩個單詞的讀音是否

相同。不過對中文就無效了。。。

8.

natsort()

natsort()能將一個數組以自然排序法

進行排列,直接看個例子吧:

$items

=

array(

「100

apples」,

「5

apples」,

「110

apples」,

「55

apples」

);

//

normal

sorting:

sort($items);

print_r($items);

#

Outputs:

#

Array

#

(

#

[0]

=

100

apples

#

[1]

=

110

apples

#

[2]

=

5

apples

#

[3]

=

55

apples

#

)

natsort($items);

print_r($items);

#

Outputs:

#

Array

#

(

#

[2]

=

5

apples

#

[3]

=

55

apples

#

[0]

=

100

apples

#

[1]

=

110

apples

#

)

9.

levenshtein()

Levenshtein()

告訴你兩個單詞之間的「距離」。它告訴你如果想把一個單詞變成另一個單詞,需要插入、替換和刪除多少字母。

看個例子吧:

$dictionary

=

array(

「php」,

「javascript」,

「css」

);

$word

=

「japhp」;

$best_match

=

$dictionary[0];

$match_value

=

levenshtein($dictionary[0],

$word);

foreach($dictionary

as

$w)

{

$value

=

levenshtein($word,

$w);

if(

$value

$match_value

)

{

$best_match

=

$w;

$match_value

=

$value;

}

}

echo

「Did

you

mean

the

『$best_match’

category?」;

10.

glob()

glob()會讓你覺得用

opendir(),

readdir()和closedir()來尋找文件非常蠢。

foreach

(glob(「*.php」)

as

$file)

echo

「$file\n」;

php執行函數

PHP提供4個專門的執行外部命令的函數:exec(), system(), passthru(), shell_exec()

1)exec()

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

說明: exec執行系統外部命令時不會輸出結果,而是返回結果的最後一行。如果想得到結果,可以使用第二個參數,讓其輸出到指定的數組。此數組一個記錄代表輸出的一行。即如果輸出結果有20行,則這個數組就有20條記錄,所以如果需要反覆輸出調用不同系統外部命令的結果,最好在輸出每一條系統外部命令結果時清空這個數組unset($output),以防混亂。第三個參數用來取得命令執行的狀態碼,通常執行成功都是返回0。

?php

exec(“dir”,$output);

print_r($output);

?

2)system()

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

說明: system和exec的區別在於,system在執行系統外部命令時,直接將結果輸出到遊覽器,如果執行命令成功則返回true,否則返回false。第二個參數與exec第三個參數含義一樣。

?php

system(“pwd”);

?

3)passthru()

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

說明: passthru與system的區別,passthru直接將結果輸出到遊覽器,不返回任何值,且其可以輸出二進位,比如圖像數據。第二個參數可選,是狀態碼。

?php

header(“Content-type:image/gif”);

passthru(“/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm”);

?

4)shell_exec()

原型: string shell_exec(string $cmd)

說明: 直接執行命令$cmd

?php

$output = shell_exec(‘ls -lart’);

echo “pre$output/pre”;

?

防超時的處理方法:

當執行命令的返回結果非常龐大時,可以需要考慮將返回結果輸出至其他文件,再另行讀取文件,這樣可以顯著提高程序執行的效率。

如果要執行的命令要花費很長的時間,那麼應該把這個命令放到系統的後台去運行。但在默認情況下,

象system()等函數要等到這個命令運行完才返回(實際上是在等命令的輸出結果),

這肯定會引起PHP腳本的超時。解決的辦法是把命令的輸出重定向到另外一個文件或流中,如:

?php

system(“/usr/local/bin/order_proc /tmp/abc “);

?

?

$filename=time().”.data”;

exec(“/app/gm/gm_center/test/hello.py $filename”,$output);

var_dump ($output);

?

PHP中的文件系統函數(一)

從這篇文章開始,我們將學習一系列的 PHP 文件系統相關函數。其實這些函數中,有很多都是我們經常用到的,大家並不需要刻意地去記住它們,只要知道有這麼個東西,在使用的時候記得來查文檔就可以了。

文件路徑相關的函數往往在一些框架中會比較常見,而且多會配合 __FILE__ 、 __DIR__ 之類的魔術常量使用。

basename() 函數是獲得路徑中的文件名,它有兩個參數,第一個是文件的路徑,第二個是過濾掉的內容,比如第一條測試語句我們過濾掉文件的後綴名。

dirname() 返回的是路徑中的路徑部分,也就是不包含文件名的那部分內容,和 basename() 正好是相反的功能。

pathinfo() 函數用於以數組的形式返迴路徑中的信息,從結果來看,我們可以看到文件的 dirname 部分,basename 部分,以及文件的擴展名 extension 和不包含擴展名的 filename 內容。

realpath() 返回的是規範化的絕對路徑名,它擴展所有的符號連接並且處理輸入的路徑中的 ./ 、 ../ 以及多餘的 / ,返回的內容是標準規範的絕對路徑。

接下來,我們學習一些修改文件相關屬性的函數,主要就是在 Linux 系統環境中的文件許可權信息的操作。

當然,首先我們得創建一個文件。和 Linux 中的命令是非常類似的。

touch() 函數除了給出要創建的文件名之外,還有兩個可選參數可以指定文件的創建時間及訪問時間,不給參數的話默認就是當前時間。這個文件名可以是相對或絕對路徑中有許可權的目錄,並在該目錄下創建一個空的文件。

通過 fileowner() 函數,我們可以獲得某個文件所屬的用戶,默認情況下我們的用戶是當前運行 PHP 腳本的用戶,也就是系統目前的登錄用戶。在這裡,我們使用 chown() 函數,將用戶改為 www 用戶。clearstatcache() 是用於清理文件系統的緩存信息,如果不清理一下的話,fileowner() 返回的依然還是之前的用戶信息。

同理,使用 filegroup() 函數獲得文件的屬組信息,chgrp() 用於修改文件的屬組。fileperms() 用於返迴文件的許可權信息,它返回的是數字模式的文件訪問許可權,這裡我們使用 sprintf() 格式化結果後獲得我們常用的 Linux 系統許可權格式。chmod() 函數用於修改文件的許可權,它的許可權參數是三個 8 進位數據組成的數字,也就是代表 Linux 系統中的 1 、2 、4 和它們的組合,所以我們需要在前面再加上一個 0 用於確保操作能夠正常執行。關於系統文件許可權的知識大家需要認真學習 Linux 系統中相關的內容。

注意,上述函數如果在命令行中運行失敗,大部分原因是沒有許可權,可以使用 sudo 進行測試。在 fastcgi 中運行時,就更加需要注意許可權問題,僅在我們伺服器可以操作的目錄中進行安全的文件許可權修改。

stat() 函數可以獲取到指定文件的所有屬性信息,在這裡我們可以看到文件的 uid 、 gid 、 ctime 、 mtime 等信息。

在 Linux 系統中,有軟連接和硬連接的相關知識。其實軟連接就像是 Windows 中的快捷方式,而硬連接相關於複製了一份數據。在 PHP 中,也為我們提供了創建軟硬連接以及相關的一些操作。

使用 link() 函數創建的就是一個指定文件的硬連接文件,而使用 symlink() 創建的則是一個軟連接文件。相對來說,我們使用軟連接的場景會更多一些。lstat() 就和 stat() 函數的功能一樣,查看文件的各種屬性信息,不過 lstat() 函數針對的是軟硬連接文件。

同樣地,我們也可以修改軟硬連接的用戶和用戶組信息,不過它們的信息不能通過 fileowner() 或 filegroup() 查看。因為它們是連接文件,本身還是和原始文件綁定在一起的,使用 fileowner() 這類的函數查看到的依然是原始文件的信息。我們可以在系統環境中使用 ls -l 查看連接文件的用戶和用戶組信息是否修改成功。

今天的內容比較簡單,而且修改許可權的操作也並不常用。不過對於系統安全來,它們還是非常有用的,比如對於上傳來說,我們要預防上傳可執行文件的話,就可以通過修改文件的許可權來讓文件無法直接運行,從而起到安全保護的作用。另外,目錄路徑相關的操作也是一些框架的基礎,幾乎所有框架的入口或者說是 Composer 的入口,都會見到 dirname() 以及 basename() 之類函數的身影。

測試代碼:

中的文件系統函數(一).php

參考文檔:

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236510.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:00
下一篇 2024-12-12 12:00

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬碟。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • 如何在樹莓派上安裝Windows 7系統?

    隨著樹莓派的普及,許多用戶想在樹莓派上安裝Windows 7操作系統。 一、準備工作 在開始之前,需要準備以下材料: 1.樹莓派4B一台; 2.一張8GB以上的SD卡; 3.下載並…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論