运行Symfony的一种超然的无尽的任务(Run a detached endless job in

2019-10-29 23:45发布

  • Symfony的:4.1
  • PHP:7.1

我一直在使用工作的WebSocket服务器棘轮 。 WebSocket的工作本身鳍。 我可以从终端使用的Symfony的运行命令

php bin/console app:websocket:execute

我无法让周围的一些问题:

  1. 你需要一个终端献给运行此命令
  2. 大多数虚拟主机服务,不给你访问终端
  3. 我想管理员能够打开和关闭WebSocket的服务器
  4. 管理员不需要知道什么是终端

对于问题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对象实例? 我会这样想!

感谢您的帮助,对不起,长职位

文章来源: Run a detached endless job in Symfony