2013-09-07 3 views
0

Я разрабатываю систему, которая импортирует списки рассылки из файла CSV. Для достижения этой цели я использую Красноречивый ОРМ импортировать все сообщения электронной почты из 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. Использование php script_that_imports.php не будет работать, потому что есть много зависимостей, которые работают только внутри рамки Laravel.

Любая идеология о том, как я могу запускать код фона, но все еще использовать средства инфраструктуры?

ответ

1

Для этого вы можете использовать события или очереди. Если процесс занимает время/ресурс, я думаю, что лучше использовать очереди http://four.laravel.com/docs/queues.

Queue::push('ImportCsv', array('file' => $path_to_file)); 

и обрабатывать его в appropirate класса обработчика

class ImportCsv { 

    public function fire($job, $data) 
    { 
     //do your stuff here 

     $job->delete(); //remove job from queue after completion 
    } 

} 

Для выше работы, помните о запуске listerener очереди

php artisan queue:listen 

EDIT: извините, я не заметил вы спрашиваете отдельно для области CLI - можете ли вы предоставить более подробную информацию, так как неясно, чего вы пытаетесь достичь? Вышеупомянутое решение будет работать для веб-php-исполнения. Вы можете выполнять обработку очереди в фоновом режиме, не ограничиваясь тем, что выполняете обработку во время одного запроса, что «блокирует» вас от дальнейших действий на время обработки. Но я не уверен, что это то, что вы хотите?

+0

Очень хорошо! Laravel rocks –

+0

Я еще не пробовал, но я уверен, что это решение. Так что я принимаю это в любом случае –

Смежные вопросы