- _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();
}
}
//
}
} 然后尝试跑一下代码,和预期一样,成功! 特此记录一下。