2016-08-09 97 views
1

Ich habe viele Websites, wo ich eine Menge von Includes verwendet. Diese Dateien, die ich einschließe, befinden sich auf einem externen Include-Server. Mein Problem ist: Ich möchte diese Dateien redundant machen, wenn der include Server ausfällt, werden sie von meinem zweiten include Server genommen. Das manuell auf jeder Website zu tun dauert viel zu lange, also frage ich mich, ob es eine Möglichkeit gibt, es zum Beispiel auf der Serverseite zu tun (wenn der Server also down ist, leitet es an den anderen Server weiter).PHP // Include-Datei von einem anderen Server, wenn der Standard-Include-Server heruntergefahren ist

Hier ist ein Beispiel dafür, wie ich gehören in der Regel meine Dateien:

<?php 

    $url = 'http://myincludeserver.com/folder/fileiwanttoinclude.php'; 

    function get_data($url) 
    { 
     $ch = curl_init($url); 
     $timeout = 5; 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $_REQUEST); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     $data = curl_exec($ch); 
     curl_close($ch); 

     return $data; 
    } 

    $returned_content = get_data($url); 

    if(!empty($returned_content)) 
    { 
     echo $returned_content; 
    } 
    else 
    { 
     include('includes/local_error_message.php'); 
    }; 

    ?> 

Danke fürs Lesen!

+1

Überprüfen Sie einfach, ob das Include erfolgreich ist und falls nicht, von dem anderen Include. – m02ph3u5

+0

Verwenden Sie Jquery-Ajax und erhalten Sie den Antwortcode mit '$ .ajax ({ // ... Erfolg: Funktion (Daten, TextStatus, xhr) { console.log (xhr.status); }, complete: Funktion (xhr, textStatus) { console.log (xhr.status); } }); 'dann wissen Sie Server ist fehlgeschlagen oder nicht – NaveenDA

+0

danke für die Antwort, aber das ist der einfache Teil! Wenn ich es so mache, müsste ich es bei jedem Include machen, das ich benutze (was wie 1000+ ist). Ich bin auf der Suche nach einer Möglichkeit, es zu tun, also muss ich nicht jede einzelne Datei auf jeder einzelnen Website bearbeiten – jogoe

Antwort

1

Kurze Antwort:

Sie sind mehr als wahrscheinlich gehen zu wollen Ihren Code Refactoring.

Längere Antwort: „Failover“

Wenn Sie wirklich auf der Serverebene, dies tun wollen, dann auf Sie suchen eine Implementierung Sie können den Artikel wikipedia oder diese howto guide für eine ausführlichere Erklärung lesen. Um zu erklären, es ist einfach, würden Sie im Grunde brauchen 3 Web-Server:

  1. Ihr gehören Server
  2. Ein Backup-Server
  3. Eine Überwachung/primären Server

Es klingt wie Sie bereits habe alle drei, aber bullet three wäre im Idealfall ein Dienst, der von einem Drittanbieter bereitgestellt wird, um zusätzliche Redundanz für die DNS-Verarbeitung zu gewährleisten (bei der Verbreitung von DNS-Updates kann es immer noch zu Ausfallzeiten kommen). Natürlich führt dies mehrere Fehler, die Sie am Ende Refactoring sowieso landen könnte. Zum Beispiel könnten Sie auf load balancing Herausforderungen stoßen; Ihre Anwendung muss jetzt freigegebene Ressourcen zwischen Servern berücksichtigen, z. B. alles, was auf Datenträger, Sitzungen oder Datenbanken geschrieben wurde. Werkzeuge wie HAProxy können helfen.

Die einfachere Option, vor allem, wenn die zugehörigen Domains mit der umfasst vor dem Benutzer versteckt wird, ist zu Refactoring und einfach Kugel drei mit einem ähnlichen Skript ersetzen, um Ihre get_data Funktion:

function ping($domain) { 
    $ch = curl_init($domain); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    $response = curl_exec($ch); 
    curl_close($ch); 
    return $response ? true : false; 
} 

$server1 = 'http://example.com'; 
$server2 = 'http://google.com'; 

if (ping($server1)) { 
    return $server1; 
} else { 
    return $server2; 
} 
exit; 

Diese Sie benötigen würden um alle Ihre Dateien zu aktualisieren, aber die gute Nachricht ist, dass Sie den Prozess automatisieren können, indem Sie alle Ihre PHP-Dateien durchlaufen und den Code über regex ersetzen oder indem Sie eine tokenizer verwenden. Wie Sie diese Option implementieren, hängt vollständig von Ihrem tatsächlichen Code zusammen mit den Unterschieden zwischen den einzelnen Websites ab.

Die einzige Einschränkung hier ist, dass es möglicherweise die Treffer auf Ihrem Server verdoppeln könnte, also wäre es wahrscheinlich besser, es so zu verwenden, dass Sie eine Umgebung oder globale Variable festlegen und dann regelmäßig ausführen lassen Cron.

Ich hoffe, dass hilft.

+0

Danke, dass Sie sich mit meinem Problem befasst haben und mir diese netten Ideen einfallen lassen! Ich werde es mir ansehen und ausprobieren! – jogoe