在Symfony中进行无休止的独立工作

时间:2018-11-26 21:58:11

标签: php bash symfony websocket symfony-process

  • Symfony:4.1
  • PHP:7.1

我使用Ratchet的websocket服务器正常工作。 websocket本身可以正常工作。我可以使用Symfony的commands

从终端运行它
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";
    }
}

他们的文档绝对是最糟糕的!我什至试图深入研究他们的代码以从控制器内部开始工作。但是我无法让它以分离的方式运行。

无论如何,我相信我的命令没有运行,因为它劫持了我的PHP线程。我想知道,是否有可能分离这个无休止的过程?甚至可以同时运行两个PHP实例吗?我会这样想!

感谢您的帮助,对冗长的帖子表示歉意

0 个答案:

没有答案