2016-07-13 8 views
0

Ich baue ein Dashboard, mit dem ich meine Crontab visualisieren kann, während es läuft (Denken Sie an eine Warteschlange von bevorstehenden Aufgaben, die gerade ausgeführt werden und diejenigen, die beendet haben und ob Das Ergebnis war erfolgreich.) Um dies zu tun, muss ich Nachrichten von den Aufgaben (ausgeführt oder überwacht von PHP) auf meinem Server zu den Client-Browsern senden, die das Dashboard mit Javascript ausführen. Es muss auch sicher sein.PHP Secure Websocket Client Probleme, muss nicht blockierend sein

Um dieses Problem zu lösen, habe ich einen Twisted/Autobahn-Socket-Server in Python implementiert, der einwandfrei funktionierte, nachdem ich für die richtigen Sicherheitszertifikate bezahlt hatte. Das Problem, das ich habe, ist jedoch, dass PHP die crontasks in die Lage versetzt, Nachrichten an den webSocket - Server zu senden, der sie an die Client - Browser weiterleitet. Bisher habe ich das gehackt, indem ich einen Python - Client geschrieben habe, der die zu sendende Nachricht akzeptiert Argument und führen Sie dies als eine exec von PHP.

Offensichtlich ist dies keine robuste Lösung (die auch relativ langsam ausgeführt wird) und ich möchte jetzt Logfile-Einträge von den Crontasks über WebSockets an meine Dashboards senden, damit ich sehen kann, was auf meinen Servern passiert . Ich habe eine Weile gesucht und verschiedene Ansätze ausprobiert (die meisten sind zu lang zum Posten), aber sie reichen von Tutorials über Segmente von der PHP-Website bis hin zu Bibliotheken wie Thruway (die für meinen Anwendungsfall zu sehr entwickelt, spezialisiert) und schwer anzupassen).

Die besten Fortschritte, die ich bisher habe, ist Pawl, und mit dem folgenden Code ich bin in der Lage erfolgreich drei Nachrichten an den Python-Socket-Server senden WSS mit:

<?php 

    require __DIR__ . '/vendor/autoload.php'; 

    \Ratchet\Client\connect('wss://127.0.0.1:9000')->then(function($conn) { 
     $conn->on('message', function($msg) use ($conn) { 
      echo "Received: {$msg}\n"; 
      $conn->close(); 
     }); 

     $conn->send('MSG 1'); 

     $conn->send('MSG 2'); 

     $conn->send('MSG 3'); 

    }, function ($e) { 
     echo "Could not connect: {$e->getMessage()}\n"; 
    }); 
?> 

(Beachten Sie, dass dies auf die abhängig Bibliotheken gefunden

Das Problem, das ich habe, ist, dass ich in der Lage sein möchte, die Verbindung zu öffnen und zu schließen und Nachrichten als separate Schritte zu senden, in dem Codebeispiel (das ich Schwierigkeiten hatte) scheint Öffnen, senden und schließen sind alle in der then-Methode verpackt und anonyme Funktion kann ich nicht Rufen Sie diese Methoden getrennt auf. Idealerweise möchte ich die Verbindung zu Beginn meiner Crontask-Ausführung öffnen. Jedes Mal, wenn eine Nachricht protokolliert wird, rufen Sie die send-Methode auf und schließen die Verbindung am Ende, ohne Zeit für das Öffnen und Schließen einer Verbindung zu meinem Socket-Server zu verschwenden Botschaft. Bitte beachten Sie, dass das Anhören von Antworten nicht notwendig ist.

Auch alle Lösungen, die auf 127.0.0.1:9000 über WSS arbeiten und keine Bibliotheken benötigen oder eine andere verwenden, bin ich gerne zu prüfen. Bitte beachten Sie auch (nach dem Lesen anderer Beiträge), dass sich diese Frage speziell auf einen Websocket-Client und nicht auf einen Server bezieht.

Vielen Dank,

James

Antwort

1

Weggehen dies bei sonst jemand diese Endlösung willkommen findet:

Am Ende habe ich ein Modul eingewickelt genannt Textalk von Fredrik Liljegren et al in einer kleinen Klasse um es zugänglicher zu machen, und das hat mein Problem gelöst.Hier

ist der Code, den ich am Ende verwendet:

require('vendor/autoload.php'); 

use WebSocket\Client; 

     class secureSocketClient { 

       private $OClient; 

       function __construct($VProtocol, $VLocation, $VPort, $VDir) { 

         $this->OClient = new Client("$VProtocol://$VLocation:$VPort" . ($VDir != null ? "/$VDir" : "")); 
       } 

       function sendMessage($ORequestData) { 

         $VLocalMessage = json_encode($ORequestData); 

         $this->OClient->send($VLocalMessage); 
       } 

       function __destruct() { 

         $this->OClient->close(); 
       } 
     } 

, die als so aufgerufen werden kann:

require_once <class location> 

$this->OSecureSocketClient = new secureSocketClient("wss", "127.0.0.1", "9000", null); 

$this->OSecureSocketClient->sendMessage($OMSG1); 
$this->OSecureSocketClient->sendMessage($OMSG2); 
$this->OSecureSocketClient->sendMessage($OMSG3); 

Um textTalk zu installieren (unter Linux), können Sie die folgenden Befehle verwenden in das Verzeichnis, in dem sich die Klasse befindet:

curl -sS https://getcomposer.org/installer | php 

fügen Sie Folgendes zu composer.json hinzu (in demselben Director y):

{ 
    "require": { 
     "textalk/websocket": "1.0.*" 
    } 
} 

dann führen die folgenden:

sudo php composer.phar install 

Regards,

James

Verwandte Themen