Restarte Apache via PHP (Windows)
Det å jobbe med Apache og PHP på Windows kan ha sine konsekvenser, spesielt det at du ikke har tilgang til et eneste Linux-verktøy. Men det gjelder å tilpasse seg, noe jeg kan bevise i denne artikkelen.
Apache er installert med et program som heter httpd, hvor du for eksempel kan starte/stoppe serveren, sjekke hvilke moduler som er lastet inn og så videre. Jeg har tenkt å benytte meg av dette programmet, men trenger en fremgangsmåte.
Fremgangsmåter
Det er flere måter du kan restarte Apache på, men nå skal jeg prøve å beskrive mine to favoritter:
- Opprette en planlagt oppgave med PHP som kjøres én gang, og som restarter Apache
- Opprette en planlagt oppgave som kjører hvert minutt, og som sjekker om det finnes en bestemt fil på serveren. Om denne filen finnes, restarter vi Apache.
Med løsningen i første punkt er vi nødt til å kjøre PHP-filen for å restarte Apache, mens i den andre kan opprette denne spesielle filen via for eksempel FTP. Det hele er smak og behag, men jeg bruker løsningen i punkt 2 på min server, og det er denne jeg kommer til å skrive om videre.
Det første vi må gjøre er å opprette oppgaven som skal kjøres. Dette kan du gjøre enten via command prompt (CMD) eller via kontrollpanelet på Windows.
For å opprette oppgaven via CMD, skriver du inn følgende:
SCHTASKS /Create /TN «Apache Restarter» /SC MINUTE /MO 1 /TR C:\restart.vbs
Her oppretter vi en oppgave med navnet Apache Restarter som skal kjøre programmet C:\restart.vbs hvert minutt. Restart.vbs er programmet vårt som sjekker om den aktuelle filen eksisterer og som restarter Apache.
VBS er et nyttig skriptingspråk som brukes på Windows, og kan sammenlignes med Bash på Unix.
Opprett filen restart.vbs og lim inn følgende kode:
Set WshShell = CreateObject("WScript.Shell" )
REM # hiding the command prompt
If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
WshShell.Run "cscript """ & WScript.ScriptFullName & """", 0, False
WScript.Quit
End If
Set filesys = CreateObject("Scripting.FileSystemObject")
restart_flag = filesys.GetAbsolutePathName("C:\www\flags\restart")
If filesys.FileExists(restart_flag) Then
filesys.DeleteFile (restart_flag), True
WshShell.Exec ("httpd -k restart")
End If
Det eneste du trenger å endre her, er filnavnet «C:\www\flags\restart». På min server har jeg plassert denne i en mappe jeg har kalt for «flags». Filnavnet er «restart» uten noen filendelse.
Nå har vi egentlig satt opp rutinen vår:
Den planlagte oppgaven kjører restart.vbs hvert minutt, og det programmet sjekker om flagget «restart» finnes i mappen C:\www\flags\. Det eneste vi trenger å gjøre nå, er å opprette filen «restart» hver gang vi ønsker å restarte Apache: og det kan vi gjøre med PHP.
Opprett en ny fil som du kaller restart.php på serveren din, hvor du limer inn følgende kode:
$h = fopen ('C:\www\flags\restart', 'w+');
fclose ($h);
if (file_exists ('C:\www\flags\restart')) {
echo 'Apache will restart within one minute.';
}
Hver gang du ønsker å restarte Apache kan du da kjøre den PHP-filen fra nettleseren din, eller opprette flagget «restart» via en FTP.
Jeg ønsker løsningen i punkt 1, hva gjør jeg?
Ideen er den samme, bare du oppretter en oppgave via PHP som skal kjøres én gang med parameteret «httpd -k restart»:
exec ('SCHTASKS /Create /TN "Apache Restart" /SC ONCE /TR "httpd -k restart" /st ' . date ('H:i', strtotime ('+1 minute'));
Her oppretter vi en oppgave som skal kjøres én gang ett minutt i fremtiden.
Last ned
Her følger en ZIP-fil med de kodene du trenger.
Last ned apache_restart.zip
NB: Jeg refererer til programmet httpd.exe som kun httpd. Dette er fordi jeg har lagt bin-mappen til Apache i miljøvariabelen PATH. Om du ikke har gjort dette, må du referere til programmet med full sti, eks: C:\Apache2.2\bin\httpd.exe


