通過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
int
main(
int
argc,
char
**argv)
else
if
(pid == 0)
}
else
if
(pid > 0)
//程式最初的父程序在這裡**子程序。
waitpid(pid, null, 0);
return
0;
}
編譯完該檔案之後,我們需要對執行檔案的許可權進行一下處理
chmod u+s samplesample是由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.啟動...