【问题标题】:Background process takes time for execution in PHP with symfony 2.0使用 symfony 2.0 在 PHP 中执行后台进程需要时间
【发布时间】:2014-09-11 13:21:42
【问题描述】:

当我为后台进程调用 background.php 时,执行需要时间。执行后它将执行其余代码。我想在后台进程中执行它。它不应该等待执行。
在我的 index.php 文件下方

session_start();
$session_id = session_id();
$_SESSION['album_upload'] = "body message";
$command = file_get_contents('background.php');
$process = new PhpProcess($command, null, array('session_id' => $session_id));
$process->run(); // Taking time for execution which should not. 
//I have also check to using `$process->start();` but it doesn't run the backround.php(I guess because I doesn't get email.).

background.php代码如下

session_id($_SERVER['session_id']);
session_start();
mail("webmaster@example.com","example",$_SESSION['album_upload'],"From: $from\n");
// I also doing some copy() from another server to my server So it's take a long time.

我真的需要在后台进程中执行它。请给我解决方案。

【问题讨论】:

  • 您确定这不是并行过程吗?应该是...
  • @DonCallisto 是的。我明白了... $process->start() 将在后台运行代码而不会阻塞。但是,Symfony 会在其主线程完成时自动停止子进程,因此您的电子邮件可能无法发送.... 如何解决?

标签: php symfony background-process


【解决方案1】:

好的,首先你应该使用Symfony2 mailer service,它会为你提供一些你需要的不错的功能。

事实上,您可以spool 电子邮件消息。

假脱机有两种方法:

  • 内存中:http页面返回给客户端后发送消息
  • 文件:消息将保存到文件中,您需要一个 crontab 才能发送假脱机邮件

我想“内存中”的解决方案会适合你。

那么,你需要做什么?

1) 以这种方式在您的app/config/config.yml 中配置假脱机

swiftmailer:
  spool: { type: memory }

2) 如果您使用控制器,只需从容器中请求邮件服务

$mailer = $this->get('mailer');

2-1) 或者,如果您有服务或类似的东西,将邮件程序注入并使用它

3) 发送您的电子邮件!

【讨论】:

  • 我不只是发送邮件,我还在从另一台服务器到我的服务器进行复制(),这需要很长时间。我必须在 30 秒内完成。我需要在后台执行一个文件。
猜你喜欢
  • 2018-02-16
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2011-03-11
相关资源
最近更新 更多