即使关闭SSH终端后,如何保持websocket服务器运行?

时间:2013-10-21 06:34:22

标签: php ssh ratchet

所以,我正在使用Ratchet和PHP,并且目前已将一个成功的websocket示例上传到我的服务器。

它在我转到SSH之后工作,然后只需手动运行“php bin / chat-server.php”。

我想知道的是,在商业环境中,如何让聊天服务器保持运行?

感谢。

5 个答案:

答案 0 :(得分:6)

制作一个守护进程。

如果您使用的是symfony2,则可以使用Process Component

// 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";
}

如果您使用的是本机PHP,请不要担心,popen是您的朋友!

// 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";
}

当然还有其他有用的PHP库用于处理守护进程。谷歌搜索“php守护进程”将给你很多指示。

答案 1 :(得分:1)

本教程展示了一种非常酷的方式,即将WebSocket转换为* nix服务,即使在关闭SSH连接时也能保持这种状态。

基本上,您使用以下内容制作文件lowess

/etc/init/socket.conf

博客文章:
http://blog.samuelattard.com/the-tutorial-for-php-websockets-that-i-wish-had-existed/

答案 2 :(得分:1)

在棘轮Deployment页上:

如果您正在运行Ubuntu,请遵循以下步骤:

  1. 安装主管是这样的: Installing Supervisor

  2. 将棘轮Web服务器配置为如下服务程序: Supervisor Process Control | Supervisord Install & Usage

在/etc/supervisor/conf.d/.conf中创建一个conf文件,并从Ratchet Deployment页面中填充conf示例代码:

[program:ratchet]
command                 = bash -c "ulimit -n 10000; exec /usr/bin/php /absolute/path/to/ratchet-server-file.php)"
process_name            = Ratchet
numprocs                = 1
autostart               = true
autorestart             = true
user                    = root
stdout_logfile          = ./logs/info.log
stdout_logfile_maxbytes = 1MB
stderr_logfile          = ./logs/error.log
stderr_logfile_maxbytes = 1MB
  1. 运行以下命令:

    • $ supervisorctl reread
    • $ supervisorctl update
    • 最后检查您的服务是否正在运行:$ supervisorctl

这些都是应该在“ Ratched Deployment”教程中添加的所有步骤。.但是,这种方法可能不是最佳方法。

答案 3 :(得分:0)

在* {1}}中为* nix服务器启动它。这应该在服务器启动时启动PHP脚本。

我实际上并不知道这个行业是如何做到的,因为我现在只是一个编程/ linux爱好者和学生,但这就是我在个人服务器上的路线。

答案 4 :(得分:-1)

棘轮文档有一个deploy页面。你看过了吗?

旧答案: 在prod服务器上这可能是一个坏主意(这是个人假设),但您可以使用screen命令打开终端,启动守护程序,然后按Ctrl-A,Ctrl-D和您的终端仍然是 alive ,在后台打开。要重新连接到此终端,请连接回服务器并键入screen -r