- Symfony:4.1
- PHP: 7.1
我有使用Ratchet的工作 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";
}
}
他们的文档绝对是最差的!我什至试图深入研究他们的代码以从我的控制器内部开始工作。但我无法让它以一种超然的方式运行。
不管发生什么,我相信我的命令没有运行,因为它劫持了我的 PHP 线程。我想知道,有没有可能把这个没完没了的过程分开?甚至可以同时运行两个 PHP 实例吗?我会这么认为!
感谢您的帮助,对不起,很长的帖子