【发布时间】:2016-11-12 10:40:28
【问题描述】:
我正在尝试启动 Ratchet 的 chat-server.php 文件,该文件是从 php 文件启动套接字服务器所需的,这样每当客户端访问该页面时,服务器就会启动但它不会发生。这个 chat-server.php 文件需要从终端运行,但我试图在用户访问时从主页运行它。
文件结构
./index.php
./config.php
./vendor/(所有供应商文件)
./src/MyApp/Chat.php
./js/app.js
./inc/connect.php
./inc/send-message.php
./inc/startServer.php
./inc/bg.php
./inc/serverStatus.txt
./css/index.css
./css/reset.css
./bin/chat-server.php
config.php
<?php
include_once ("./inc/startServer.php");
?>
聊天服务器.php
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
if(isset($startNow)){
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
}
?>
bg.php
<?php
$startNow = 1;
include_once ("../bin/chat-server.php");
?>
startServer.php
<?php
$statusFile = dirname(__FILE__).'/serverStatus.txt';
$status = file_get_contents($statusFile);
if($status == "0"){
function execInBackground($cmd) {
if(substr(php_uname(), 0, 7) == "WINDOWS") {
pclose(popen('start /B ' . $cmd, 'r'));
file_put_contents($statusFile, 1);
}
else {
exec($cmd . ' > /dev/null &');
file_put_contents($statusFile, 1);
}
}
execInBackground("php " . dirname(__FILE__) . "/bg.php");
}
?>
serverStatus.txt
其默认值已设置为0
注意:相应地更新了代码,但现在仍然无法使用。
另外我不知道如何在出现任何故障时重新启动服务器,也不知道如何在所有客户端离开时关闭服务器。
【问题讨论】:
-
我真的不明白为什么这个问题被否决但仍然感谢它。
-
您正在为每个客户端启动一个新服务器?为什么需要手动启动服务器而不是让它在后台运行?这个问题只是尖叫XY问题。
-
@PeeHaa,不,这段代码应该只为所有客户端启动一个服务器。看一下,有关于服务器状态的检查。
-
为什么要手动启动服务器?再次:XY Problem
-
@PeeHaa 首先,我使用 Ratchet 来构建聊天应用程序。在 Ratchet 文档中,我们被要求从终端启动一个名为
chat-server.php的文件,该文件将打开 Web 套接字。所以我们需要手动启动它们(在WIN中)。在 *nix 中我们可以使用 supervisord。因此,想象在公共服务器上使用聊天应用程序时,管理员需要在每次用户想要使用它时进入终端。
标签: php filepath popen ratchet pclose