Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysłanie zakończenia strony do przeglądarki
Forum PHP.pl > Forum > PHP
neuromancer
Mam dosyć nietypowy problem, ponieważ mój skrypt zapisuje zmiany w konfigu apache, następnie apache jest ponownie uruchamiany (aby ponownie wczytać konfiguracje).

Żeby go zrestartować użyłem tego:
  1. <?php
  2. system("net stop apache2 & net start apache2");
  3. ?>

Jednak w ten sposób przeglądarka poprostu staje i nie ładuje strony do końca i w końcu wywala 404.
Więc chciałbym przed tą komendą wysłać do przeglądarki coś co spowoduje zakończenie ładowania strony i powiedzmy wyświetli napis "proszę zaczekać 10 sekund...", a skrypt wykona komendę restartu apache.
Wydaje mi sie że żeby to zadziałało musze ustawić "ignore_user_abort = On" w php.ini

Można do sprawy podejść inaczej.
Można wykonać komende "D:\Server\Apache2\bin\Apache.exe -k restart" - kiedy wykonam to z wiersza poleceń (oczywiście kiedy usługa apache jest uruchomiona) to apache wczyta konfig ponownie, ale jak umieszcze to w skrypcie php to nic sie nie dzieje... skrypt dochodzi do końca, a configi nie są wczytywane ponownie, nie wiem czemu, tak jakby to sie w ogóle nie wykonywało.

A może jest jeszcze jakiś inny magiczny sposób zmuszenia apache'a do ponownego wczytania configu, którego nie znam?

EDIT: Coś czułem, że odpowiedzi nie bedzie szybko, o ile wogóle ktoś odpowie...
misiek172
hmm może zrób tak, iż każesz zrobić stop w tym pliku a start np w okienku POPUP który uruchomi to polecenie np. po 10 sekundach.

Lub (tego nie jestem pewien) poprzez AJAX dasz start();
gWd
Próbowałeś czegoś takiego?:

  1. <?php
  2. echo '<html><head><meta http-equiv="refresh" content="5;URL=http://localhost/proba.php"></head></html>';
  3. system("net stop apache2 & net start apache2");
  4. ?>
neuromancer
Niestety, nie działa, przeglądarka nie dostaje tej zawartości, dostaje ją dopiero jak cały skrypt sie wykona.

Myśle nad napisaniem jakiego skryptu BAT który załatwi te komendy, a PHP go tylko wykona. Skrypt BAT bedzie sobie czekał 5 sekund i potem zamknie Apache i ponownie uruchomi, dając 5 sekund przeglądarce na wyświetlenie komunikatu, iż trzeba poczekać ~10 sekund na ponowną dostępność servera.

Mam problem jednak z funkcją exec
W manualu http://pl2.php.net/manual/en/function.exec.php pisze coś takiego:
Cytat
Note: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.

Właśnie chciałbym ten skrypt odpalić jako program w tle, żeby php go odpaliło i nie czekało aż sie on sie zakończy.
Piszą że trzeba przekierować wyjście (2 parametr funkcji exec) do pliku albo gdzieś indziej... ale jak to zrobić?

Ponawiam jeszcze pytanie z 1 posta: Czy ktoś zna inny sposób restartu apache?
exec("D:\Server\Apache2\bin\Apache.exe -k restart"); niestety sie nie wykonuje, Apache powinien wczytać konfigi ponownie, ale tak sie nie dzieje.
Siemion
A nie możesz mieć dwóch apache`y ? Do konfiguracji jednego używałbyś drugiego który obsługuje np tylko i wyłacznie jedną subdomenę.
PiotrLegnica
Jak chcesz wysłać output do przeglądarki przed zakończeniem skryptu, użyj flush.
neuromancer
Też nie działa sad.gif
Próbowałem umieścić przed nim ob_flush ale też nie działa...

Część skryptu jest taka:
  1. <?php
  2. //MySQL
  3. mysql_db_query($srvdb, "UPDATE `regs` SET `lock` = 'nie' WHERE `id` = '$actid'");
  4. mysql_db_query('mysql', "UPDATE `db` SET `Select_priv` = 'Y', `Insert_priv` = 'Y', `Update_priv` = 'Y', `Delete_priv` = 'Y', `Create_priv` = 'Y', `Drop_priv` = 'Y', `Index_priv` = 'Y', `Alter_priv` = 'Y', `Create_tmp_table_priv` = 'Y', `Lock_tables_priv` = 'Y' WHERE `User` = '$actuser'");
  5. mysql_query('FLUSH PRIVILEGES');
  6. //FTP
  7. $conn_id = ftp_connect($servdomain, $ftpp, 10); 
  8. $login_admin = ftp_login($conn_id, $admuser, $admpass);
  9. ftp_site ($conn_id, "enable $actuser");
  10. ftp_quit($conn_id);
  11. //Apache
  12. unlink("$confdir/users/$actuser/blocked.conf");
  13. header("Location: wait.php");
  14. flush();
  15. sleep('5');
  16. system("net stop apache2 & net start apache2");
  17. ?>

Jak widzicie Apache musi zostać zrestartowany aby załapać że niema już pliku blocked.conf - który ma regułe blokady konta użytkownika (pokazuje na jego stronie 403).
To dzieje sie przy odblokowaniu konta użytkownika.
Wsadziłem tam przekierowanie na wait.php - ale bez skutku...

Jak zrobić żeby apache wczytał ponownie configi w jakiś inny sposób?
Siemion
Szkoda, że kompletnie zignorowałeś mojego poprzedniego posta. No nic... rozwinę trochę myśl, to może bardziej się zainteresujesz pomysłem.

Po pierwsze nadawanie uprawnień Apache wykorzystywanemu "globalnie" takich by byl w stanie modyfikować pliki konfiguracyjne jest w moim mniemaniu dosyć niebezpieczne i unikałbym tego jak ognia. Dlatego właśnie zasugerowałem rozwiązanie, które oparte jest o dwa Apache z różnymi uprawnieniami. Jeden z większymi uprawnieniami działał by jako obsługa części administracyjnej, a drugi jako "globalny" do wszystkiego innego. Ten pierwszy miałby dostęp do plików konfiguracyjnych, a drugi okrojony uprawnieniami tak daleko jak się da. Przy takim rozwiązaniu śmiało mozesz sobie zmieniać ustawienia plików cfg "podrzędnego" apache i restartować go, bez utraty aplikacji administracyjnej.

No nic - koniec wstepu do głębszej myśli. Można by było się rozpisać mocniej, ale chyba nie ma to sensu ;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.