0

我正在开发一个从 CSV 文件导入邮件列表的系统。为了实现这一点,我使用 Eloquent ORM 将所有电子邮件从 CSV 导入数据库,并在我的模型中使用以下代码Target

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 框架中使用

关于如何运行后台代码但仍使用框架设施的任何想法?

4

1 回答 1

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 执行。您可以在后台进行队列处理,而不是限制自己在一个请求期间运行处理 - 这将“阻止”您在处理期间采取进一步行动。但我不确定这是否是你想要的?

于 2013-09-07T07:45:54.247 回答