我正在开发一个从CSV文件导入邮件列表的系统。为了实现这一点,我使用Eloquent ORM将我的模型Target
中的所有电子邮件从CSV导入数据库:
public function importCSV($file)
{
$destination = 'uploads/';
$file->move($destination, $file->getClientOriginalName());
$csv = new parseCSV();
$csv->auto($destination . $file->getClientOriginalName());
// There must be a Email field in CSV file
if(!in_array('Email', $csv->titles))
throw new Exception("Email field not found", 1);
foreach($csv->data as $data)
{
$this->cont++;
$mailing = new Mailing();
$mailing->target()->associate($this);
$mailing->email = $data['Email'];
$mailing->save();
}
}
导入整个CSV文件通常需要很长时间,我想在后台运行此过程。我知道有一些工具可以像shell_exec()
,the operator & in the end
,crontab
等那样...
但我甚至不知道如何在命令行Scope中使用Eloquent ORM。使用php script_that_imports.php
将不起作用,因为有很多依赖项只能在Laravel框架中运行
关于如何运行后台代码但仍然使用框架功能的任何想法?
答案 0 :(得分:1)
您可以使用事件或队列。如果进程耗费时间/资源,我想最好使用队列http://four.laravel.com/docs/queues。
Queue::push('ImportCsv', array('file' => $path_to_file));
并在适当的处理程序类
中处理它class ImportCsv {
public function fire($job, $data)
{
//do your stuff here
$job->delete(); //remove job from queue after completion
}
}
要使上述工作正常,请记住运行队列侦听器
php artisan queue:listen
编辑:对不起,我没有注意到您正在询问CLI范围 - 您能否提供更多详细信息,因为您不清楚您要实现的目标是什么?上述解决方案适用于基于Web的php执行。您可以在后台执行队列处理,而不是限制自己在一个请求期间运行处理 - 这将“阻止”您在处理时的进一步操作。但我不确定这是不是你想要的?