Ich verwende Joomla und ich liebe die Möglichkeit, die Website für Wartungsarbeiten herunterzufahren. Wie ich gesehen habe, werden alle Anfragen an die Website, wenn sie sich im Wartungsmodus befindet, auf eine einzige Seite umgeleitet. Wie kann ich mein eigenes Modul für das Herunterfahren der Website wegen Wartungsarbeiten für eine Nicht-Joomla-Site hinzufügen? Ich verwende ein MVC-Framework in PHP mit dem Namen Kohana in der Version 2, das mit Codeigniter vergleichbar ist. Ich habe eine Router-Klasse, in der ich steuern kann, wohin eine bestimmte Adresse geht. Der einzige Ansatz, den ich denken kann, ist, jede Anfrage an eine bestimmte Controller-Funktion umzuleiten, wenn die Website nicht verfügbar ist, aber wie mache ich das? Ich kann nicht möglicherweise manuell alle Urls richtig umleiten?
Antworten
Zu viele Anzeigen?Werfen Sie einen Blick auf die Streckenführung Dokumentation . Sie sollten in der Lage sein, einen regulären Ausdruck zu verwenden, der jede Uri an einen bestimmten Controller/Aktion umleitet. Die einzige Frage, die bleibt, ist, wie man diese Regel ein- und ausschaltet.
Kohana 3 : Sie können eine Catch-all-Route in Ihrem bootstrap.php
vor dem Kohana::modules()
Zeilen:
if (/* check if site is in under maintenance mode */) {
Route::set('defaulta', '(<id>)', array('id' => '.*'))
->defaults(array(
'controller' => 'errors',
'action' => 'maintenance',
));
}
Oder Sie können sogar die Anfrage so manipulieren, dass sie dasselbe tut:
if (/* check if site is in under maintenance mode */) {
echo Request::factory('errors/maintenance')
->execute()
->send_headers()
->response;
}
Kohana 2 : Sie müssten die Controller
und die Anzeige der Seite "under maintenance" im Konstruktor behandeln (Sie müssen jedoch sicherstellen, dass alle Ihre Controller diese Controllerklasse erweitern und nicht die Vanilla-Klasse):
abstract class Custom_Controller extends Controller {
public function __construct()
{
parent::__construct();
if (/* check if site is in under maintenance mode */) {
$page = new View('maintenance');
$page->render(TRUE);
exit;
}
}
}
Sie können dazu auch das Hook-System verwenden, indem Sie eine Datei in Ihrem hooks
Ordner (stellen Sie sicher, dass Sie Hooks in Ihrem config.php
):
Event::add('system.ready', 'check_maintenance_mode');
function check_maintenance_mode() {
if (/* check if site is in under maintenance mode */) {
Kohana::config_set('routes', array('_default' => 'errors/maintenance'));
}
}
Wie Sie sehen können, gibt es tatsächlich viele Möglichkeiten, wie man etwas in Kohana machen kann, weil es ein sehr flexibles PHP-Framework ist :)
Sie könnten ein Datenbankflag in einem gemeinsamen Header überprüfen (vermutlich haben Sie ein gemeinsames Include, das eine Verbindung zur Datenbank herstellt usw.), und wenn das Flag gesetzt ist, eine bestimmte Seite rendern und beenden (wobei Sie sicherstellen, dass Sie alle üblichen Aufräumarbeiten wie das Schließen von Datenbankverbindungen usw. durchführen).
Mir fallen zwei Ideen ein, um dies zu erreichen.
-
Wie Larry sagte, verwenden Sie reguläre Ausdrücke, um alle Anfragen an einen bestimmten Ort umzuleiten. Sie würden also zunächst feststellen, ob sich die Website im Wartungsmodus befindet (wahrscheinlich mithilfe eines Datenbankflags oder einer Konfigurationsdateieinstellung), und dann, wenn dies der Fall ist, die Routing-Funktion für reguläre Ausdrücke verwenden, um den gesamten Datenverkehr an einen Ort umzuleiten.
-
Sie könnten im Konstruktor jedes Controllers prüfen, ob sich die Site im Wartungsmodus befindet, und bei Bedarf eine Umleitung vornehmen. Dies ist wahrscheinlich nicht die optimalste Lösung, da Sie denselben Code für jeden Controller wiederholen würden. Obwohl es also funktionieren würde, wären Sie mit den regulären Ausdrücken wahrscheinlich besser dran.
Routenplanung in Kohana: http://docs.kohanaphp.com/general/routing
PHP Reguläre Ausdrücke: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
Kontrolleure in Kohana: http://docs.kohanaphp.com/general/controllers
- See previous answers
- Weitere Antworten anzeigen