2013-10-21 12 views
6

Also, ich benutze Ratchet mit PHP und habe gerade ein erfolgreiches WebSocket-Beispiel auf meinen Server hochgeladen.Wie kann ich einen Websocket-Server laufen lassen, selbst nachdem ich das SSH-Terminal geschlossen habe?

Es funktioniert, nachdem ich SSH gehen, und führen Sie dann nur manuell "php ist/Chat-server.php".

Was ich habe mich gefragt, dass in einer kommerziellen Situation, wie verhindere ich die Chat-Server läuft?

Danke.

+0

Dieses Tutorial zeigt eine wirklich coole Art, die WebSocket in einem * nix-Dienst des Drehens zu machen, bestehen Selbst wenn Sie Ihre SSH-Verbindung schließen. http://blog.samuelattard.com/the-tutorial-for-php-websockets-that-i-wish-had-existed/ – MarshallOfSound

Antwort

6

Erstellen Sie einen Daemon.

Wenn Sie Symfony2 verwenden, können Sie die Process Component verwenden.

// in your server start command 
$process = new Process('/usr/bin/php bin/chat-server.php'); 
$process->start(); 
sleep(1); 
if ($process->isRunning()) { 
    echo "Server started.\n"; 
} else { 
    echo $process->getErrorOutput(); 
} 

// in your server stop command 
$process = new Process('ps ax | grep bin/chat-server.php'); 
$process->run(); 
$output = $process->getOutput(); 
$lines = preg_split('/\n/', $output); 
// kill everything (there can be multiple processes if they are spawned) 
$stopped = False; 
foreach ($lines as $line) { 
    $ar = preg_split('/\s+/', trim($line)); 
    if (in_array('/usr/bin/php', $ar) 
     and in_array('bin/chat-server.php', $ar)) { 
     $pid = (int) $ar[0]; 
     posix_kill($pid, SIGKILL); 
     $stopped = True; 
    } 
} 
if ($stopped) { 
    echo "Server stopped.\n"; 
} else { 
    echo "Server not found. Are you sure it's running?\n"; 
} 

Wenn Sie nativen PHP verwenden, keine Angst, popen ist dein Freund!

// in your server start command 
_ = popen('/usr/bin/php bin/chat-server.php', 'r'); 
echo "Server started.\n"; 

// in your server stop command 
$output = array(); 
exec('ps ax | grep bin/chat-server.php', &$output); 
$lines = preg_split('/\n/', $output); 
// kill everything (there can be multiple processes if they are spawned) 
$stopped = False; 
foreach ($lines as $line) { 
    $ar = preg_split('/\s+/', trim($line)); 
    if (in_array('/usr/bin/php', $ar) 
     and in_array('bin/chat-server.php', $ar)) { 
     $pid = (int) $ar[0]; 
     posix_kill($pid, SIGKILL); 
     $stopped = True; 
    } 
} 
if ($stopped) { 
    echo "Server stopped.\n"; 
} else { 
    echo "Server not found. Are you sure it's running?\n"; 
} 

Es gibt natürlich auch andere hilfreiche PHP-Bibliotheken für die Arbeit mit Daemons. Googling "php daemon" wird Ihnen eine Menge Hinweise geben.

+0

Es funktioniert immer noch nicht nach dem Schließen der Konsole. – itsazzad

+0

@mattexx was meinst du '// in deinem Server Startbefehl' ?? – SlimenTN

0

es für * nix-Server in /etc/rc.d/rc starten. Dies sollte Ihr PHP-Skript beim Booten des Servers starten.

Ich weiß eigentlich nicht, wie die Industrie es macht, da ich gerade ein Programmierer/Linux-Bastler und Student bin, aber das ist der Weg, den ich auf einem persönlichen Server gehen würde.

-1

Die Ratsche Dokumentation hat eine deploy Seite. Hast du es überprüft?

Alte Antwort: Es kann eine schlechte Idee, auf einem prod Server sein (das ist eine persönliche Annahme), aber Sie können den screen Befehl verwenden, um einen Terminal zu öffnen, starten Sie Ihren Daemon, und drücken Sie Strg-A, Strg- D, und Ihr Terminal ist immer noch lebendig, im Hintergrund geöffnet. Stellen Sie eine Verbindung mit diesem Server her, und geben Sie screen -r ein.

1

Dieses Tutorial zeigt eine wirklich coole Art, die WebSocket in einen * nix-Service drehen, um es noch zu machen anhalten, wenn Sie Ihre SSH-Verbindung zu schließen.

Im Grunde machen Sie eine Datei /etc/init/socket.conf mit folgendem Inhalt

# Info 
description "Runs the Web Socket" 
author  "Your Name Here" 

# Events 
start on startup 
stop on shutdown 

# Automatically respawn 
respawn 
respawn limit 20 5 

# Run the script! 
# Note, in this example, if your PHP script (the socket) returns 
# the string "ERROR", the daemon will stop itself. 
script 
    [ $(exec /usr/bin/php -f /path/to/socket.php) = 'ERROR' ] && (stop; exit 1;) 
end script 

Blog:
http://blog.samuelattard.com/the-tutorial-for-php-websockets-that-i-wish-had-existed/

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. –

+1

@Uchiha Antwort wurde aktualisiert, um den relavent Inhalt zu enthalten, danke, dass Sie darauf hingewiesen haben – MarshallOfSound

+0

Keine schlechte Antwort - könnte eher ein Kommentar sein, aber trotzdem danke! : D – think123