我正在开发使用Laravel4和AngularJS编写的完整 AJAX 邮件应用程序 ( SPA ) ,用户可以在其中创建消息并将其发送到他们定义的联系人组。
问题是负责发送邮件的任务可能需要很长时间,所以我必须在后台运行它。
我想提供的主要功能是“开始”和“停止”整个邮件任务的能力,而此刻我被困住了......
我考虑了两种方法:
1. 只要通过“ajaxes”在浏览器中打开应用程序就发送邮件
发送过程可能如下所示:
- 用户点击“开始”按钮
- 应用程序运行 ajax 请求以发送一条消息
- 当上一个请求成功时,下一个请求被启动(在检查用户是否之前没有停止它之后)等等
- 当用户单击“停止”按钮时,应用程序发送另一个请求以将邮件标记为停止
这种方法可以让我更好地控制“开始”和“停止”整个发送过程以及一些统计信息,例如为用户更新整个发送的进度条。
但是主要的限制是发送很长一段时间......假设超过一个小时或类似......?用户不应该被迫仍然打开浏览器,否则邮件将停止...... :(或者页面刷新怎么样...... :/(我知道我可以在javascript中使用onunload事件,但这并不优雅解决方案)
2. 通过 ajax 运行 artisan 命令 > /dev/null 2>/dev/null & (不等待命令输出)
这次它可能看起来像这样:
- 用户点击“开始”按钮
应用程序通过以下方式发出 ajax 请求:
exec('php '.base_path().'/artisan mailing:send 1 > /dev/null 2>/dev/null &');
应用程序返回 200 响应码,通知 shell 任务运行成功
在这种方法中,我不知道如何停止以前启动的任务外壳...有没有什么方法可以像从以前的操作中获取可运行进程的“pid”一样?而且我不想“杀死”这可能会破坏发送数据......
3.众所周知的cron作业
有了这个,当运行 cronjobs 的间隔很短时,我害怕重叠的任务......而当 iterval 很长时,未使用的资源......