0

我正在开发使用Laravel4AngularJS编写的完整 AJAX 邮件应用程序 ( SPA ) ,用户可以在其中创建消息并将其发送到他们定义的联系人组。

问题是负责发送邮件的任务可能需要很长时间,所以我必须在后台运行它。

我想提供的主要功能是“开始”和“停止”整个邮件任务的能力,而此刻我被困住了......

我考虑了两种方法:

1. 只要通过“ajaxes”在浏览器中打开应用程序就发送邮件

发送过程可能如下所示:

  1. 用户点击“开始”按钮
  2. 应用程序运行 ajax 请求以发送一条消息
  3. 当上一个请求成功时,下一个请求被启动(在检查用户是否之前没有停止它之后)等等
  4. 当用户单击“停止”按钮时,应用程序发送另一个请求以将邮件标记为停止

这种方法可以让我更好地控制“开始”和“停止”整个发送过程以及一些统计信息,例如为用户更新整个发送的进度条。

但是主要的限制是发送很长一段时间......假设超过一个小时或类似......?用户不应该被迫仍然打开浏览器,否则邮件将停止...... :(或者页面刷新怎么样...... :/(我知道我可以在javascript中使用onunload事件,但这并不优雅解决方案)

2. 通过 ajax 运行 artisan 命令 > /dev/null 2>/dev/null & (不等待命令输出)

这次它可能看起来像这样:

  1. 用户点击“开始”按钮
  2. 应用程序通过以下方式发出 ajax 请求:

    exec('php '.base_path().'/artisan mailing:send 1 > /dev/null 2>/dev/null &');

  3. 应用程序返回 200 响应码,通知 shell 任务运行成功

在这种方法中,我不知道如何停止以前启动的任务外壳...有没有什么方法可以像从以前的操作中获取可运行进程的“pid”一样?而且我不想“杀死”这可能会破坏发送数据......

3.众所周知的cron作业

有了这个,当运行 cronjobs 的间隔很短时,我害怕重叠的任务......而当 iterval 很长时,未使用的资源......

4

1 回答 1

0

对我来说,最好的方法是使用后台、长时间运行的任务(如守护进程),如果您可以访问服务器中的 shell。您可以使用某种命令队列与任务进行通信,例如通过数据库上的内存表。

如果您已经用 PHP 编写了所有内容(或想使用单一语言),则可以使用 php-cli。

于 2014-03-07T19:44:54.277 回答