参考
安装包安装卸载方式
- 1.sudo dpkg –get-selections | grep ‘linux’
- 2.sudo apt purge + image/headers名称
手动安装卸载方式
- 1.删除/lib/modules/目录中以内核版本号为名称的目录
- 2.删除/usr/src/linux/目录中并不需要的内核源码
- 3.删除/boot目录中启动内核的和内核的映像文件
- 4.sudo update-grub,更新内核启动列表
知识图谱
参考
Mapping
是定义文档及其包含的字段的存储和索引方式的过程,相当于关系型数据库中定义数据库和表结构的语句
核心数据类型 Core datatypes
复杂数据类型 Complex datatypes
Geo 数据类型 (地理位置)
专有数据类型 Specialised datatypes
Range 范围
https://www.elastic.co/guide/en/elasticsearch/reference/current/range.html
数组
在Es中数组不需要专门定义,任何字段都可以包含另个或多个值即数组,数组中的所有制都必须具有相同的数据类型。
多字段 Multi-fileds
为不同的目的以不同的方式为同一字段建立索引
设置多个字段可以使用不同方式索引,使用不同的analyzer
PUT my_index
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"comment": {
"type": "text",
"fields": {
"english_comment": {
"type": "text",
"analyzer":"english",
"search_analyzer":"english"
}
}
}
}
}
}
Dynamic Mapping 自动创建Mapping
创建index时,不需要定义Mapping,Es根据数据类型自动判断创建类型,优点是方便,缺点是有时后自动创建类型不是你想要的数据类型。
Mapping 字段类型修改机制
1.新增字段
Dynamic 设置为true时,一旦新增字段的文档写入,Mapping也同时被更新
Dynamic 设置为false,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中。
Dynamic设置成Strict,文档写入失败
2.已有字段,一旦已经有数据写入,就不再支持修改字段定义
Lucene实现的倒排索引,一旦生成后,就不允许修改
3.如果希望改变字段类型,必须Reindex Api,重建索引,因为如果修改了字段的数据类型,会导致已经索引的数据数据无法被搜索,新增自担不会有这种影响。
PUT movies
{
"mappings":{
"_doc":{
"dynamic":"false"
}
}
}
自定义Mapping
1.参考API手册,纯手写
2.为了减少输入的工作量,减少出错概率,可以依靠以下步骤
四种不同界别的Index Options 配置,可以控制倒排索引记录的内容
Text类型默认记录postions,其它默认为docs
记录内容越多,占用存储空间越大
设置null_value 属性可以搜索null值
PUT users
{
"mappings":{
"properties":{
"firstName":{
"type":"text",
"index":false //不索引该字段
},
"bio":{
"type":"text",
"index_options":"offsets"
},
"mobile":{
"type":"text",
"null_value":"NULL"
}
}
}
}
精确值和全文本 Exact values vs Full Text
精确值不需要做分词处理
文档CRUD
Index | PUT my_index/_doc {“user”:”mike”,”comment”:”you know for search”} |
Create | PUT my_index/_create/1 {“user”:”mike”,”comment”:”you know for search”} POST my_index/_doc(不指定ID,自动生成) |
Read | GET my_index/_doc/1 |
Update | POST my_index/_update/1 {“doc”:{“user”:”mike”,”comment”:”you know, Elasticsearch”}} |
Delete | DELETE my_index/_doc/1 |
在单次API调用中执行多个索引编制或删除操作。这样可以减少开销,并可以大大提高索引速度。
支持四种类型操作 Index,Create,Update,Delete
在单次请求中对一个或多个索引进行查询
在单词API请求中执行多个search
ES与关系型数据库相似性对比
RDBMS(以Mysql为例) | Elasitcsearch |
存储引擎 | 不同的数据分布 Setting |
数据库 Schema(Database) | 文档字段类型 Mapping 相当于关系型数据库的表结构 |
数据表 Table | 索引 Index 类型 Type |
数据行 Row | 文档 Document |
数据列(字段) Column | 字段 Fields |
DQL(数据查询) | DSL |
DML(数据操作) | DSL |
ps:7.0以后一个Index只能创建一个Type,并统一命名为 _doc
,相当于一个数据库只能创建一个表
文档
文档元数据
索引
文档的容器,一类文档的结合
索引的Mapping和Settings
索引的不同语义
相关文章
开发(测试)环境要和生产环境保持高度一致
开发(测试)环境要和生产环境保持高度一致
开发(测试)环境要和生产环境保持高度一致
如果升级版本需要对程序做兼容行处理以及完整的测试
分块上传
https://github.com/peinhu/aetherupload-laravel 分块上传插件
原理使用浏览器对文件的分块slice()方法,后端php使用file_put_contents() 的FILE_APPEND
的追加写入数据功能,或者fopen() 函数的 a+
模式
直接上传
适合局域网项目
php-fpm配置文件修改
request_terminate_timeout = 120 设置单个请求的超时中止时间。该选项可能会对 php.ini 设置中的 'max_execution_time' 因为某些特殊原因没有中止运行的脚本有用。
php.ini配置修改
upload_max_filesize = 2048M 最大文件大小
post_max_size = 2048M post传输最大文件大小
max_execution_time = 600 php脚本最大运行时间
max_input_time = 600 脚本解析输入数据(类似 POST 和 GET)允许的最大时间,单位是秒。 它从接收所有数据到开始执行脚本进行测量的。
nginx配置修改
client_max_body_size 4096m; 客户端请求的最大主体内容
fastcgi_connect_timeout 600 指定nginx与后端fastcgi server连接超时时间
fastcgi_send_timeout 600 指定nginx向后端传送请求超时时间(指已完成两次握手后向fastcgi传送请求超时时间)
fastcgi_read_timeout 600 指定nginx接受后端fastcgi响应请求超时时间 (指已完成两次握手后nginx接受fastcgi响应请求超时时间)
一个人的想法有局限性,在你想不到更好的解决思路,或者拿不定注意的时候,可以询问一下他人的解决思路.说不定可以找到更好的方法.
在解决业务问题的时候尤其适用.
参考
写这篇文章的起因,逛论坛读到一位博主的成长感悟,说他面试,被一个问题卡住了。PHP接受GET,POST请求分别$_GET,$_POST或$_REQUEST ,那么PHP如何接受PUT,PATCH,DELETE,OPTIONS请求。
引申问题PHP如何处理(接收)HTTP请求?
前置知识只是HTTP请求方法有哪些?https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods
HTTP1.0: GET POST HEAD | |
HTTP1.1: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE | |
HTTP2.0: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE |
PHP原生方法如何获取请求参数
$_GET,$_POST,$_REQUEST,file_get_content('php://input')
GET请求
GET query param $_GET $_REQUEST 可以获取
GET x-www-form-urlencoded php://input 可以获取
GET Form-data php://input 可以获取
GET application/json php://input 可以获取
POST请求
POST query param $_GET 和 $_REQUEST 可以获取
POST x-www-form-urlencoded $_POST $_REQUEST php://input 可以获取
POST Form-data $_POST $_REQUEST 可以获取
POST application/json php://input 可以获取
PUT 请求
PUT query-param $_GET 和 $_REQUEST 可以获取
PUT x-www-form-urlencoded php://input 可以获取
PUT form-data php://input 可以获取
PUT application/json php://input 可以获取
PATCH 请求
PATCH query-param $_GET 和 $_REQUEST 可以获取
PATCH x-www-form-urlencoded php://input 可以获取
PATCH form-data php://input 可以获取
PATCH application/json php://input 可以获取
DELETE 请求
DELETE query-param $_GET 和 $_REQUEST 可以获取
DELETE x-www-form-urlencoded php://input 可以获取
DELETE form-data php://input 可以获取
DELETE application/json php://input 可以获取
Laravel框架如何处理HTTP请求
支持的请求方法和数据交互类型
请求类型 | 支持的请求方法 | 说明 |
query param | GET,POST,PUT,DELETE,PATCH,OPTIONS | 查询字符串, 即url ? 后边的参数&和=拼接 |
url带数值 | GET,POST,PUT,DELETE,PATCH,OPTIONS通过/分割的 示例/xxx.com/user/1 1就是参数值 | 通过/分割的 示例/xxx.com/user/1 1就是参数值 |
form-data | POST | multipart/form-data 支持二进制数据上传文件必须使用此类型 |
x-www-form-urlencoded (form) | POST,PUT,DELETE,PATCH,OPTIONS | application/x-www-form-urlencoded 数据被编码成以 ‘&’ 分隔的键-值对 |
appliction/json | GET,POST,PUT,DELETE,PATCH,OPTIONS | json类型 |
获取方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 存储一个新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request,$id)
{
//接受所有类型参数,无法获取上传文件
$name = $request->input('name');
//仅能接受查询字符串参数,?号后的参数
$name = $request->query('name');
//接受所有类型参数,包含上传文件,动态属性获取,触发__get()魔术方法
$name = $request->name;
//获取上传文件
$file = $request->file('file');
//同input是底层Symfony提供的方法,无法获取上传文件
$name = $request->get('name');
//获取路由参数,直接访问注入的$id变量
dump($id);
//获取原始输入数据symfony提供的方法,等于原生php的file_get_content('php://input')
$request->getContent()
}
}
原理和知识总结
laravel使用了symfony的HTTP请求类获取去请求,底层还是通过PHP超全局变量来获取请求参数
Symfony\Component\HttpFoundation\Request
/**
* Creates a new request with values from PHP's super globals.
*
* @return static
*/
public static function createFromGlobals()
{
//使用php超全局变量获取请求数据
$request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);
if ($_POST) {
$request->request = new InputBag($_POST);
} elseif (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
&& \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
) {
parse_str($request->getContent(), $data);
$request->request = new InputBag($data);
}
return $request;
}