我使用Ratchet的websocket服务器正常工作。 websocket本身可以正常工作。我可以使用Symfony的commands
从终端运行它php bin/console app:websocket:execute
我无法解决其中一些问题:
对于问题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实例吗?我会这样想!
感谢您的帮助,对冗长的帖子表示歉意