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();
                }
            }
            //
    
        }
    }

        然后尝试跑一下代码,和预期一样,成功! 特此记录一下。