更新:我正在使用流程功能在Symfony框架中创建长时间运行的后台任务。作为其中一部分: - 用户将填写表单并单击“提交”按钮 - 这将使用以下脚本
启动后台进程$rootDir = $this->get('kernel')->getRootDir();
$adk_process = new Process('php ../bin/console app:adkaction ' . $numcampaigns . ', ' . $timezone . ',' . $depdate);
$adk_process->setWorkingDirectory($rootDir);
$adk_process->setTimeout(null);
$adk_process->start();
为了让用户能够做其他事情,我们关闭当前会话并希望渲染特定的twig tempalate并使用下面的代码将特定变量传递给它
$ignore_user_abort(true);
$strURL = $rootDir;
header("Location: " . $strURL, false);
header("Connection: close", true);
header("Content-Encoding: none");
header("Content-Length: 0", true);
flush();
ob_flush();
session_write_close();
这很好但是我似乎找不到如何以这种方式传递变量的方法。我的Twig模板就像这样
{% if currprogress is defined %}
<div class="col-md-4 col-sm-4 col-xs-12">
<div class="x_panel">
<div class="x_title">
<div class="progress">
<div class="progress-bar progress-bar-striped active"
role="progressbar" aria-valuenow={{currprogress}}
aria-valuemin="0" aria-valuemax="100" style="width:{{currprogress}}%">
Campaign Generation - {{currprogress}}%
</div>
</div>
</div>
</div>
</div>
{% endif %}
因此,一旦currprogress变量值传递给Twig,它就会略有变化。关于如何使用标题+链接做任何想法。
答案 0 :(得分:0)
我已将JMSJobQueueBundle用于此目的。
在您的控制器中,创建一个新作业:
use JMS\JobQueueBundle\Entity\Job;
public function adkAction(Request $request)
{
$job = new Job('app:adkaction', [
'numcampaigns' => $request->request->get('numcampaigns'),
//...timezone, etc.
]);
$em = $this->getDoctrine()->getManager();
$em->persist($job);
$em->flush();
return Response('Ok, job scheduled!');
}
按照文档中的说明配置JMSJobQueueBundle,以便命令在保留后运行。
在您的工作中,将进度保存到数据库,内存,文件或任何您认为有用的内容:
class FooBarCommand extends ContainerAwareCommand
{
protected function execute(InputInterface $input, OutputInterface $output)
{
$entityManager = $this->getContainer()->get('doctrine')->getManager();
$someEntity = new SomeEntity($input->getArgument('numcampaigns'));
$someEntity->setProgress(5);
$entityManager->persist($someEntity);
$entityManager->flush();
//do something
$someEntity->setProgress(5);
$entityManager->persist($someEntity);
$entityManager->flush();
//do something else
$someEntity->setProgress(100);
$entityManager->persist($someEntity);
$entityManager->flush();
}
}
现在,您的工作将保存数据库中的进度,因此您可以创建一个控制器Action,用于查找该Job并使用它来修改进度条。