- Symfony的:4.1
- PHP:7.1
我一直在使用工作的WebSocket服务器棘轮 。 WebSocket的工作本身鳍。 我可以从终端使用的Symfony的运行命令
php bin/console app:websocket:execute
我无法让周围的一些问题:
- 你需要一个终端献给运行此命令
- 大多数虚拟主机服务,不给你访问终端
- 我想管理员能够打开和关闭WebSocket的服务器
- 管理员不需要知道什么是终端
对于问题1,我尝试用这种“分离”作弊,但它并没有解决问题2:
php bin/console app:websocket:execute > /dev/null 2>&1 &
为了解决所有的四个问题。 我一直在使用的过程审判。 但这种方法的问题是:
-
$process->run()
-运行与工艺php bin/console
始终处于超时结束 -
$process-start()
-在启动过程意味着它异步运行,但它也意味着处理结束,一旦请求结束,结束我的WebSocket服务器了。
下面是一个例子
$process = new Process("php bin/console");
$process->setWorkingDirectory(getcwd() . "/../");
$process->setTimeout(10);
$process->run(); // Stalls for 10 seconds, then throws timeout exception
$process-start(); // Doesn't stall, but terminates at end of request
// $process->run() ==== unreachable code
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
我曾尝试创建一个控制台应用程序,并从那里运行命令。 但同样的问题是一个过程适用于此处。
$application = new Application($this->kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'app:websocket:execute'
));
try {
$ob = new BufferedOutput();
$application->run($input, $ob);
$output = $ob->fetch();
} catch (\Exception $e) {
return null;
}
作为最后的手段,我尝试了所谓的捆绑DtcQueueBundle ,因为它提到了以下:
使用方便
- 用一行代码或两个开球后台任务
- 轻松添加背景工人服务
- 将任意代码到后台任务几行
所以我做了什么,他们问,造就了工人,并试图运行它作为“后台任务”
use App\Ratchet\ForumUpdater;
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class SocketWorker extends \Dtc\QueueBundle\Model\Worker
{
public function execute()
{
$server = IoServer::factory(
new HttpServer(
new WsServer(
new ForumUpdater()
)
),
8080
);
$server->run();
return "Websocket started";
}
public function getName()
{
return "websocket-server";
}
}
他们的文档是绝对最差! 我甚至尝试挖掘到他们的代码从我的控制器内开始工作。 但我无法得到它在分离的方式运行。
无论发生什么,我相信我的命令没有运行,因为它highjacks我的PHP线程。 我想知道,是否有可能脱离这个漫长的过程? 它甚至有可能运行两个PHP对象实例? 我会这样想!
感谢您的帮助,对不起,长职位