如何设计一个可执行繁重任务并在前端显示结果的应用程序(例如 Google Search Console)

How to design an app that does heavy tasks and show the result in the frontend (ex Google Search Console)

让我们想象一下:

  1. 我必须从 URL;
  2. 下载 XML 文档
  3. 我必须详细说明此文档并将其信息保存在数据库中,创建或更新大量实体。

我认为最好的方法是使用队列。或者也许我也可以使用 cronjobs。

我的问题是:如果我使用同一个应用程序来执行繁重的任务并向最终用户显示这些繁重任务的结果,那么繁重的任务可能会减慢主网站的速度。

从现实生活中举一个更具体的例子:Google Search Console(或任何其他执行繁重任务并向最终用户显示结果的应用程序)。

Google Search Console 获取 XML 地图,然后开始下载每个网页,在每个网页上执行大量分析,然后将结果保存到数据库中,以便最终用户查看他网站的错误和其他有用的信息。

那么,假设我想重新构建 Google Search Console 作为 Symfony 应用程序,有哪些可能的方法?

我认为我肯定必须使用队列,但下载网页的应用程序和处理这些网页的应用程序以及显示这些操作结果的 public 前端是同一个应用程序或是两个还是三个独立的应用程序?

也就是说,我是否需要创建一个独特的应用程序来执行所有这些操作,或者我创建一个应用程序来下载网页,一个应用程序处理这些网页,另一个应用程序向用户显示结果?

我在这方面想了很多,但找不到好的设计可以遵循。

因为我的本能是为每个任务创建多个应用程序来完成工作,但创建多个 Symfony 应用程序似乎不是一个好的选择:Symfony 2 multiple apps?

所以我真的不知道该走哪条路:多个应用程序还是一个大应用程序?如果我使用一个大应用程序,我应该使用 cronjobs 还是我必须使用队列?

  1. 我将首先详细介绍架构 :

  1. 你可以做一个 Service 比如 this :

namespace SomeBundle\Utils;

use SomeBundle\Entity\MyEntity;
use SomeBundle\myException;

class SomeService 
{
  private $var;

  public function __construct()
  {

  }

  public function doStuff()
  {
    // Do stuff
  }
}

要调试您的服务,您可以从 testControllerbasic Controller.

调用它
  1. 您可以使 Commandthis :

namespace SomeBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use SomeBundle\Utils\SomeService;

class SomeCommand extends ContainerAwareCommand 
{
  protected function configure()
  {
    $this->setName('some:command')
         ->setDescription('My awesome command');
  }

  protected function execute(InputInterface $input, OutputInterface $output)
  {
    $container = $this->getContainer();
    $sevice = new SomeService($container);
    $results = $service->doStuff();
  }
}
  1. 您可以执行 命令应用程序 ,例如 this :

require __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/app/AppKernel.php';

$kernel = new AppKernel('dev', true);

use SomeBundle\Command\SomeCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;

$application = new Application($kernel);
$application->add(new SomeCommand());
$application->run();

希望对您有所帮助!