基础知识学习笔记
web基础知识笔记整理
学习笔记
为了尽量理解,都是多篇文章综合之后整理起来的,链接有的已经遗失,为了复习和扩展,最重要的是尊重别人劳动成果,所以今后要尽量贴出链接,但是不能只贴链接,没有自己的理解,达不到学习的目的
1. 跨域
同源策略:同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介
跨域:当一个请求url的 协议 、域名、端口 三者之间任意一个与当前页面url不同即为跨域
解决办法:
- CORS
CORS是Cross-Origin Resources Sharing的简写,中文翻译为“跨域资源共享”,是W3C的 标准。通过CORS,浏览器允许向其他源服务器发送资源请求
附:阮一峰的网络日志跨域资源共享 CORS 详解
讲的非常清楚,易懂 - 使用代理
通过Nginx做代理服务器,请求都发给代理服务器代理服务器再向后端服务器请求就可以规避跨域的问题server{ # 监听80端口 listen 80; # 域名是localhost server_name localhost; #凡是localhost:8080/api这个样子的,都转发到真正的服务端地址http://localhost:8080 location ^~ /api { proxy_pass http://localhost:8080; } }
2. redis
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型
数据结构
- String: 字符串
- Hash: 散列
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象 - List: 列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) - Set: 集合
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1) - Sorted Set: 有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
有序集合的成员是唯一的,但分数(score)却可以重复
3. 缓存
- 缓存穿透
访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉
解决办法
采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。 - 缓存雪崩
大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩
解决办法
可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效 - 缓存击穿
一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增
解决办法
在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key
简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去读数据库,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行读数据库的操作并回设缓存;否则,就重试整个get缓存的方法
SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果
4. 多维数组转成一维数组
多维数组
array_reduce($arr, 'array_merge', array());
array_merge;//把两个数组合并为一个数组
array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] ) : mixed
array_reduce()
将 callback
函数迭代地应用于 的元素, array
以将数组简化为单个值
参考文章:https://blog.csdn.net/luoangen/article/details/83654731
5. PHP open_basedir 问题
报错内容
Warning: require(): open_basedir restriction in effect.
open_basedir
: 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开
本指令不受安全模式打开或关闭的影响
配置
在php.ini 加入
open_basedir="指定目录"
在代码中
ini_set('open_basedir', '指定目录');//不建议
在apache的httpd.conf中的Directory配置
php_admin_value open_basedir "指定目录"
nginx fastcgi.conf
fastcgi_param PHP_VALUE "open_basedir=指定目录"
.user.ini配置
首先,要使
.user.ini
生效,要设置php.ini 中的user_ini.filename = ".user.ini" user_ini.cache_ttl = 300
关于这两个配置的意义,请看php手册 php.net/manual/zh/configuration.fil...
注释掉 fastcgi.conf 中的 open_basedir 的配置。
在项目根目录 创建 .user.ini文件,写入如下内容
open_basedir=/tmp/:/proc/:/you_web_path
/you_web_path
是你要添加的让php可以访问的路径。多个路径直接分号隔开
重启一下php-fpm 服务即可
参考文章
www.php.cn/php-weizijiaocheng-1126....user.ini
配置篇
www.cnblogs.com/blibli/p/8657736.h...
www.cnblogs.com/xiezhi/p/7063896.h...
6. 当PHP可变变量用到数组时
当使用 $a
里的一个值作为变量名时,应这样写 ${$a[1]}
当要取出 $$o
中的某个值时,这样写 ${$a}[1]
例:
$a = ['o', 'k'];
$o = 'k';
$k = ['y', 'e', 's'];
dump(${$a['0']}); // k
dump(${$o}[0]); // y
参考文章
www.php.net/manual/zh/language.var...
7. MySQL中varchar最大长度
存储限制
varchar最多能存储65535个字节的数据。varchar 的最大长度受限于最大行长度(max row size,65535bytes)。65535并不是一个很精确的上限,可以继续缩小这个上限。65535个字节包括所有字段的长度,变长字段的长度标识(每个变长字段额外使用1或者2个字节记录实际数据长度)、NULL标识位的累计.
编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。行长度限制
导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
8. Laravel 数据库迁移中 integer 类型是无法指定长度
Laravel 数据库迁移中 integer 类型在设置了长度之后报以下错误
SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key
查看了 sql 代码后发现通过 integer 指定长度创建的子段自动添加了
auto increament
以及primary key
属性
然后查看源码:/** * Create a new integer (4-byte) column on the table. * * @param string $column * @param bool $autoIncrement * @param bool $unsigned * @return \Illuminate\Database\Schema\ColumnDefinition */ public function integer($column, $autoIncrement = false, $unsigned = false) { return $this->addColumn('integer', $column, compact('autoIncrement', 'unsigned')); }
/** * Create a new tiny integer (1-byte) column on the table. * * @param string $column * @param bool $autoIncrement * @param bool $unsigned * @return \Illuminate\Database\Schema\ColumnDefinition */ public function tinyInteger($column, $autoIncrement = false, $unsigned = false) { return $this->addColumn('tinyInteger', $column, compact('autoIncrement', 'unsigned')); }
/** * Create a new small integer (2-byte) column on the table. * * @param string $column * @param bool $autoIncrement * @param bool $unsigned * @return \Illuminate\Database\Schema\ColumnDefinition */ public function smallInteger($column, $autoIncrement = false, $unsigned = false) { return $this->addColumn('smallInteger', $column, compact('autoIncrement', 'unsigned')); }
/** * Create a new medium integer (3-byte) column on the table. * * @param string $column * @param bool $autoIncrement * @param bool $unsigned * @return \Illuminate\Database\Schema\ColumnDefinition */ public function mediumInteger($column, $autoIncrement = false, $unsigned = false) { return $this->addColumn('mediumInteger', $column, compact('autoIncrement', 'unsigned')); }
/** * Create a new big integer (8-byte) column on the table. * * @param string $column * @param bool $autoIncrement * @param bool $unsigned * @return \Illuminate\Database\Schema\ColumnDefinition */ public function bigInteger($column, $autoIncrement = false, $unsigned = false) { return $this->addColumn('bigInteger', $column, compact('autoIncrement', 'unsigned')); }
- 发现这个几个都不能设置长度
- 参考文章
www.jb51.net/article/171457.htm
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: