- _nosay
laravel中队列的使用(三)
2017-08-16 12:59:49
接上文
我们先生成一个用来储存url的model,和数据库迁移文件,在控制台执行
php artisan make:model Url -m
其中Model内容为
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Url extends Model { // protected $fillable = [ 'uid','url','status' ]; }
迁移文件内容为
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUrlsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('urls', function (Blueprint $table) { $table->increments('id'); $table->unsignedInteger('uid')->comment('用户uid'); $table->string('url')->comment('相应链接'); $table->integer('status')->default(0)->comment('采集状态'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('urls'); } }
在项目app下,新建一个Repositories文件夹,生成TitleRepository.php和UrlRepository.php文件处理相应的数据,内容分别为
<?php /** * Created by PhpStorm. * User: nosay * Date: 17-8-16 * Time: 下午1:08 */ namespace App\Repositories; use App\Title; class TitleRepository { public function createTitle(array $attributes) { return Title::create($attributes); } }
<?php /** * Created by PhpStorm. * User: nosay * Date: 17-8-15 * Time: 下午5:08 */ namespace App\Repositories; use App\Url; use Illuminate\Support\Facades\DB; class UrlRepository { public function createUrls(array $attributes) { return DB::table('urls')->insert($attributes); } public function getUrlById($id) { return Url::find($id); } public function getActiveUrlsByUid($uid) { return Url::where('uid',$uid)->where('status','0')->get(); } }
然后我们需要改写控制器文件,event,listen文件,如下
<?php namespace App\Http\Controllers; use App\Events\getTitlesByUrlEvent; use App\Repositories\UrlRepository; use Illuminate\Http\Request; class StartController extends Controller { protected $url; /** * StartController constructor. * @param $url */ public function __construct(UrlRepository $url) { $this->url = $url; } // public function index() { $weburls = [ 'http://www.baidu.com/', 'http://www.taobao.com/', 'http://www.qq.com/', 'http://www.youku.com/', 'http://www.muzilong.cn/', ]; $j = 0; for($i=0;$i<1;$i++) { foreach($weburls as $key => $value) { $url[$j]['uid'] = 1; $url[$j]['url'] = $value; $url[$j]['status'] = 0; $url[$j]['created_at'] = date('Y-m-d H:i:s'); $url[$j]['updated_at'] = date('Y-m-d H:i:s'); $j++; } } $urlRepository = new UrlRepository(); $urlRepository->createUrls($url); event(new getTitlesByUrlEvent('1')); } }
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Queue\SerializesModels; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class getTitlesByUrlEvent { use Dispatchable, InteractsWithSockets, SerializesModels; public $uid; /** * Create a new event instance. * * @return void */ public function __construct($uid) { // $this->uid = $uid; } /** * Get the channels the event should broadcast on. * * @return Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } }
<?php namespace App\Listeners; use App\Events\getTitlesByUrlEvent; use App\Repositories\TitleRepository; use App\Repositories\UrlRepository; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Support\Facades\Log; class getTitlesByUrlListener implements ShouldQueue { protected $title; /** * Create the event listener. * * @return void */ public function __construct(TitleRepository $title) { // $this->title = $title; } /** * Handle the event. * * @param getTitlesByUrlEvent $event * @return void */ public function handle(getTitlesByUrlEvent $event) { $urlRepository = new UrlRepository(); $urls = $urlRepository->getActiveUrlsByUid($event->uid); foreach($urls as $key => $value) { $result = json_decode(shell_exec("python ".__DIR__."/../Extensions/python/getTitleByUrl.py '".$value->url."'"),1); if($result['status']) //采集成功 { $data = []; $data['title'] = $result['msg']; $data['url'] = $value->url; $data['status'] = $result['status']; $data['message'] = "采集成功"; }else{ //采集失败 $data = []; $data['title'] = $result['msg']; $data['url'] = $value->url; $data['status'] = $result['status']; $data['message'] = $result['msg']; } $res = $this->title->createTitle($data); if($res) { $url = $urlRepository->getUrlById($value->id); $url->status = 1; $url->save(); } } // } }
然后尝试跑一下代码,和预期一样,成功! 特此记录一下。