ElasticSearch 壞境搭建
拉取鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2
運行容器
docker run -d --name es -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:6.3.2
docker ps 查看ES服務是否啓動
測試ES curl 192.168.254.128:9200
使用php調用ES接口
Class Test{
public function HttpResquset($method = 'GET', $data='', $action='', $header = array(), $token = '', $timeout = 60) {
$headers[] = "Content-type: application/json";
$url = "http://192.168.254.128:9200/";
$url = $url . $action;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
switch ($method) {
case 'GET':
break;
case 'POST':
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
break;
case 'PUT':
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
break;
case 'DELETE':
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
break;
}
$result = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$return = json_decode($result, TRUE);
return $return;
}
public function testes()
{
$data = ” {"class":"軟件工程1999","name":"zhangsan1999","age":1999}";
$action = "school/js/1"
$data = $this->HttpResquset($method = "GET", $data, $action);
var_dump($data);
}
}
同步mysql數據和ES數據
設計思路
使用laravel隊列處理ES數據
數據存入mysql數據庫之後,加入隊列數據存入ES中
代碼實現如下
vim /app/Http/Controller.php
<?php
namespace App\Http\Controllers;
//新加
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Models\Test;//測試model類
use App;
use App\Jobs\ProcessPodcast;
use App\Jobs\Post;
class Controller extends BaseController
{
/**
* 測試隊列
*/
public function post($insertData)
{
$post = new Post;
foreach ($insertData as $key=>$item) {
$post->name = $item['name'];
$post->age = $item['age'];
$post->class = $item['class'];
$post->url = 'schools/js/' . $item['id'];
$post->id = $item['id'];
$this->dispatch(new ProcessPodcast($post)); // 隊列
}
}
//數據寫入mysql 通過隊列加入es中
public function testPutES(Test $Test)
{
//寫入數據庫
$insertData = [];
for ($i = 1; $i < 100; $i++ ) {
$data['class'] = '軟件工程' . $i;
$data['name'] = 'zhangsan' . $i;
$data['age'] = $i;
if(isset($data['id'])){
unset($data['id']);
}
$insertId = $Test->insertData($data);
if(!empty($insertId)){
$data['id'] = $insertId;
}
$insertData[] = $data;
}
//寫入隊列
$this->post($insertData);
}
}
vim /app/Models/Test.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use DB;
use Predis;
/**
*處理數據 數據寫入數據庫
* $result 插入數據id
*/
public function insertData($data)
{
$insertId = DB::table('users')->insertGetId($data);
if(!empty($insertId)){
return $insertId;
}
}
}
處理任務類vim /app/Jobs/Post.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Routing\Controller as BaseController;
class Post extends BaseController
{
/**
* 處理隊列任務
*/
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $name;
public $age;
public $class;
public $url;
public $id;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
}
/**處理隊列數據
* @return string
*/
public function getData()
{
// $result = $this->name . $this->age;
$dataTmp['class'] = $this->class;
$dataTmp['name'] = $this->name;
$dataTmp['age'] = $this->age;
$dataTmp['id'] = $this->id;
$data = json_encode($dataTmp, JSON_UNESCAPED_UNICODE);
$action = $this->url;
var_dump($data, $action);
$res = $this->HttpResquset($method = "PUT",$data, $action);
return $res;
}
}
vim /app/Jobs/ProcessPodcast.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
//use App\Jobs\Post;
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $post;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Post $post)
{
$this->post = $post;
}
/**
* Execute the job. //處理任務
*
* @return void
*/
public function handle()
{
var_dump($this->post->getData());
}
}
運行隊列,php artisan queue:work
驗證數據是否同步