利用php重啟apache程序

2021-06-22 12:16:59 字數 2316 閱讀 6760

通過php重啟apache可以把apache的控制放到web頁面上。

但是由於php本身的執行模式,一般而言,除非apache具備root許可權,否則php連/etc都訪問不了,更不用說反過來控制apache了。

因此,我們需要找到別的方法。

通過system,exec等方法,php可以呼出一些許可權之內的命令,或者執行一些可執行的程式。

因此我們可以事先編譯乙個重啟apache的可執行程式,並賦予其root許可權,然後讓php呼叫該程式來實現apache的重啟動。

首先我們建立sample.c檔案,並進行編譯:

幫助

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#include

#include

#include

#include

#include

intmain(intargc,char**argv)

elseif(pid == 0)

}

elseif(pid > 0)

//程式最初的父程序在這裡**子程序。

waitpid(pid, null, 0);

return0;

}

編譯完該檔案之後,我們需要對執行檔案的許可權進行一下處理

chmod u+s sample
sample是由root建立,root編譯,因此原本也只能由root執行呼叫。

但通過上面這個命令,其他使用者也可以呼叫這個檔案了。

然後我們在php中呼叫這個檔案就可以重啟apache了。

一些關鍵點的解說

1:重啟apache的系統命令很多,比起**中的呼叫,更有名的應該是/etc/init.d/httpd restart,但是很遺憾,在本應用中這個系統命令是不能呼叫的,如果使用這個命令,那麼apache會在中止掉自己程序的瞬間,終止這個程式的繼續執行,也就無法對自身進行重啟動,因此我們需要通過傳送訊號給apache,在不中止程序的情況下重啟apache,這一點非常重要。

關於apachectl -k restart的詳細資訊,可以參照下面的**

2: 雙重fork。 如果只是重啟apache,而不在乎程式本身的動作,那麼我們可以直接在**中執行system(「apachectl -k restart」)而不必產生新的程序。

但是,考慮一下整個流程,如果我們這樣做了,那麼當我們訪問php頁面的時候,php(apache)呼叫檔案,瞬間重啟自身,那麼很自然,結果就是頁面崩潰。

當然,apache依然可以重啟成功,但是,這一點也不優雅。

因此,使用雙重fork可以讓我們避免當前頁面崩潰而對apache進行重啟動。

3: 更進一步的安全措施:

編譯完sample後,計算其md5值,並把該值固化到php中,然後在php中加入校驗**,以防止sample被惡意替換。

定時重啟 MySQL 定時重啟 Apache

有時候覺得,伺服器執行時間過長,程式上無法釋放mysql,造成伺服器壓力過大。因此,設想一下,不用重新啟動伺服器的情況下,完成apache和mysql的記憶體釋放。首先,apache的重新啟動。操作步驟 開始 程式 附件 管理工具 任務計畫 新增任務計畫 下一步 apache restart 選擇時...

ubuntu linux下重啟apache命令

linux系統下重啟apache命令 首先要知道的是重啟apache命令需要root許可權,若不是root使用者需要在命令前新增sudo命令臨時轉換為超級使用者root 1.啟動apache服務 start etc init.d apache2 start root使用者 sudo etc init...

linux 如何重啟apache

檢視apache2的命令 httpd v 其中httpd root和server config file 就可以確定httpd.conf的路徑了 假設當前linux使用者的apahce安裝目錄為 usr local apache2,那麼在命令列終端中使用以下命令啟動,停止和重啟apache。1.啟動...