【发布时间】:2019-04-01 13:31:51
【问题描述】:
我有一个网站,用户可以在其中以 CSV 格式导出报告。当他们单击“导出”按钮时,我在我的数据库表中添加了一个新行,表明有一个新的报告生成请求。
我想为 2 个进程设置数据库访问权限,因为 1 个还不够。我当前的supervisord配置如下:
[program:csv_export]
command=php /var/www/mywebsite.com/artisan queue:listen --tries=1 --timeout=3000 --queue=csv_export
numprocs=2
process_name=csv_export_%(process_num)02d
directory=/var/www/mywebsite.com/
stdout_logfile=/var/log/mywebsite/csv_export.log
autostart=true
autorestart=true
stopsignal=KILL
loglevel=debug
redirect_stderr=true
我的队列fire() 代码如下所示:
public function fire($job, $data){
$reports = \CSVReport::where('status', '=', CSVReport::CSVNEW)->take(1)->get();
foreach ($reports as $key => $value){
// prepare data and file
$value->status = 'done';
$value->save();
}
$job->delete();
}
我使用的是 Laravel 4.2,还不能升级。我想避免两个进程访问数据库中的同一表行的情况。如何在我的队列类中避免这种情况?
【问题讨论】:
-
队列自动逐一处理作业:laravel.com/docs/4.2/queues
-
我猜你可能会尝试重写队列管理器以根据进程名称在队列表中仅获取奇数行或偶数行
-
@tohhy of caurse no,但每个进程都不会看到属于其他进程的作业(奇数/偶数)
-
@tohhy 忘记了 2 supervisord conf。关于偶数/奇数方法。您不能将 CSVReport ID 作为属性传递给 Job
protected $csvID;并在构造函数中传递 ID 值,然后使用$reports = \CSVReport::find($this->csvID);选择该 CSVReport 吗? -
您实现它的方式就像客户要求 CSVReport ID 100 导致的 Job 100 可能会处理 CSV Report ID 95 而不是 100。传递 CSVReport ID 将确保 Job 100 只会处理CSV 报告 100。
标签: php laravel supervisord laravel-4.2 laravel-queue