服务器要求:
laravel官网>文档
版本选择:上图可看出,laravel-5.5版本后,对php版本的要求>=7.0。
逐个解释每个PHP扩展:
openssl: Secure Sockets Layer(安全套接层协议)的缩写
php手册 > 函数参考 > 加密扩展 > openssl
简介:模块OpenSSL 函数来产生、验证签名,以及密封(加密)启封(解密)数据。
按:PHP的openssl模块中提供了很多底层函数,当然这里不是我们所关心的。
laravel文档 >
laravel的加密器 使用 OpenSSL 来提供 AES-256 和 AES-128 加密(ASE-高级加密标准简称)。强烈建议使用 Laravel 自带的加密设置,不要尝试推出自己“土生土长”的加密算法。所有 Laravel 加密过的值都使用消息授权码(MAC)进行签名 以便底层值一经加密就不能修改。
按:
我们在项目中,有对一些数据进行加密处理的场景,即返回给前端加密后的值,如id,便使用到laravel的加密器。
laravel文档中对加密器的介绍:
加密辅助函数 encrypt ,相对解密函数是 decrypt。还有一组便是encryptString 和 decryptString。encrypt 和 decrypt 加密的值会经过序列化处理,而encryptString 和 decryptString 处理的值不经过序列化处理。
按:
这就需要在项目初始化的时候,设置加密的key,可以理解为加盐,简单解释加盐,如对abc进行md5加密,md5(abc),加盐后的效果为md5(abcphp_yt),解密后为abcphp_yt,再去掉php_yt,即是原来的abc。而php_yt存在于服务端,每个项目设置的盐不相同,所以难以破解。那么这里key = php_yt。
laravel文档>设置key
方式一:
config/app.php
中设置 key 选项为 32 位随机字符串
方式二:
php artisan key:generate
该 Artisan 命令会使用 PHP 的安全随机字节生成器来构建 key 的值。如果这个值没有被设置,所有 Laravel 加密过的值都是不安全的。
按:
项目初始化时,该命令会自动添加key值到.env文件中,而config/app.php中默认使用.env中的配置。注意当项目正式上线时,key不能随意更改。
pdo:
laravel文档 >
Laravel 查询构建器使用 PDO 参数绑定来避免 SQL 注入攻击,不再需要过滤以绑定方式传递的字符串。
php手册 > 函数参考 > 数据库扩展 > 数据库抽象层 > pdo
mbstring:
laravel要求开启此扩展的原因,是mbstring扩展默认是不开启的。当然我们要使用中文(多字节字符串),涉及多字节字符串的函数(trim、split、splice …)、http请求、数据库。。是必须要开启此扩展的。
php手册 > 函数参考 > 国际化与字符编码支持 > 多字节字符串 >
mbstring 不是一个默认扩展。这意味着它默认没有被激活。你必须在 configure 选项中显式激活该模块。
多字节字符串 > 简介 >
虽然许多语言每个必要字符都能一对一映射到 8 比特(bit)的值,但也有好几种语言需要非常多的字符来书面通讯,以至于它们的编码范围不能仅仅包含在一个字节里(一个字节 Byte 由 8 比特 bit 构成。每一比特仅能包含两种不同的值: 1 或 0。所以,一字节仅能够表示 256 种不同的值,即 2 的八次方)。 开发多字节字符编码方案是为了在基于字节的常规编码系统中表达超过 256 个字符。
在你操作(trim、split、splice 等等)多字节编码的字符串的时候,由于在这种编码方案下,两个或多个连续字节可能只表达了一个字符,所以你需要使用专门的函数。 否则,当你将不能检测多字节字符串的函数应用到这个字符串的时候,它可能无法检测多字节字符的起始位置,并以乱码字符串结尾,基本丢失了它原来的意思。
mbstring 提供了针对多字节字符串的函数,能够帮你处理 PHP 中的多字节编码。 除此以外,mbstring 还能在可能的字符编码之间相互进行编码转换。 为了方便起见,mbstring 设计成了处理基于 Unicode 的编码,类似 UTF-8、UCS-2 及诸多单字节的编码。
tokenizer: 源码解析器/标记器
php手册 > 函数参考 > 其他基本扩展 > tokenizer
此扩展默认激活,因此没有在 php.ini 中定义配置指令。
tokenizer函数提供了一个内嵌在Zend引擎的"PHP tokenizer"的调用接口。使用这些函数,你可以写出你自己的PHP源码分析或者修改工具,而无需处理词法分析级别上的语言规范。
代码解析器的用途:
1>有的框架用tokenizer生成缓存文件或中间class类文件
2>源代码格式化、代码压缩、高亮显示
3>可收集所有定义的class,methods,variables,文档,注释等,关于收集注释,tp5中的注解路由估计就是利用了此扩展来实现的。
4>一些安全检测等,保证代码更安全。不允许使用的php函数,反正各种安全检测。
5>基本上,能使用php代码作为数据的任何地方,我们都可以tokennizer。
tokenizer函数只包含两个函数
array token_get_all( string $source) 将提供的源码按 PHP 标记进行分割
string token_name( int $token)
/source 源码字符,使用 Zend 引擎的语法分析器获取源码中的 PHP 语言的解析器代号,它比使用正则表达式,或其他处理函数,来解析php代码都更可靠。
/$source - 需要解析的php源码
/返回值:返回源码解析后的所有token标志符数组。
/每个单独的token标志符,有2种形式:
1>单个字符,例如:: ; , .
2>一个包含3个元素的数组,[ 0 =>int索引 , 1=>源码字符串 ,2=>行号]
我们可以调用token_name( int $token)来获取字面量。
举例说明:
$tokens = token_get_all(’<?php echo "abcdef"; ?>’);
解析后:
Array
(
[0] => Array
(
[0] => 379 // token_name( 379 ) == T_OPEN_TAG == 从 HTML 转义
[1] => 1
)
[1] => Array
(
[0] => 328 //索引 token_name( 328 ) == T_ECHO == echo
[1] => echo //源码字符
[2] => 1 //行号
)
[2] => Array
(
[0] => 382
[1] => //空格
[2] => 1
)
[3] => Array
(
[0] => 323
[1] => "abcdef" //字符串
[2] => 1
)
[4] => ; //单个字符
[5] => Array
(
[0] => 381 //token_name(381) == T_CLOSE_TAG
[1] => ?> //tag标签
[2] => 1
)
)
T_OPEN_TAG、T_ECHO… 标记了源码每个符号的意义。
T_ARRAY ---- array() ---- array(),数组语法
T_COMMENT ---- // ---- 注释
T_IS_EQUAL ---- == ----比较运算符
T_CLASS ---- class ----- 类和对象
这样我们对php手册中tokenizer的简介“你可以写出你自己的PHP源码分析或者修改工具”有了更深的理解。
XML:
XML 解析器
Ctype:字符检测
php手册 > 函数参考 > 变量与类型相关扩展 > Ctype
从 PHP 4.2.0 版本开始,这些函数是默认启用的。此扩展没有在 php.ini 中定义配置指令。
该扩展所提供的函数用来检测在当前的区域设定下(参见 setlocale()),一个字符或者字符串是否仅包含指定类型的字符。
需要提醒的是,如果可以满足需求,请优先考虑使用 ctype 函数,而不是正则表达式或者对应的 “str_" 和 "is_” 函数。因为 ctype 使用的是原生 C 库,所以会有明显的性能优势。
Ctype系列函数:
/**
* bool fn (string $text)
* 注意:以下函数接收的参数皆是string字符串
* 返回bool
* 如果给出一个 -128 到 255 之间(含)的整数, 将会被解释为该值对应的ASCII字符
* (负值将加上 256 以支持扩展ASCII字符).
* 其它整数将会被解释为该值对应的十进制字符串.
* 例 fn(42) 42被解释为 ASCII * 字符
*/
//检测字符全部是字母和(或者)数字
var_dump(ctype_alnum('abc123#')); //bool(false)
var_dump(ctype_alnum(42)); //bool(false)
//检测每个字符都是一个字母
var_dump(ctype_alpha('lazz123')); //false
//检测每个字符都是控制字符。控制字符就是例如:换行、缩进、空格。
var_dump(ctype_cntrl("\n\r\t abc")); //false
//检测字符串都是一个十进制数字
var_dump(ctype_digit('1255514')); //true
var_dump(ctype_digit(42));// false
//检测每个字符都是输出可见的(没有空白)
var_dump(ctype_graph("abc\n\t\r")); //false
var_dump(ctype_graph("abc def")); //false
var_dump(ctype_graph("abcdf$%^123")); //true
//检测每个字符都是小写字母
var_dump(ctype_lower('aB123'));//false
var_dump(ctype_lower('abc'));//true
//检测每个字符都能被实际输出(包括空白);
//如果 text 里面包含控制字符或者那些根本不会有任何输出的字符串,就返回 FALSE 。
var_dump(ctype_print(' '));//true
var_dump(ctype_print("abc\n\t\r"));//false
//检测可打印的字符都是符号,不包含空白、数字和字母
var_dump(ctype_punct('#$% +^'));//false
var_dump(ctype_punct("#$%+^\n"));//false
var_dump(ctype_punct('#$%+^'));//true
var_dump(ctype_punct(42));//true
//空白字符检测 :
//如果 text 里面的每个字符最终被实际输出的时候都是某种形式的空白,
就返回 TRUE ;否则返回 FALSE 。
//除了空白字符,还包括缩进,垂直制表符,换行符,回车和换页字符。
var_dump(ctype_space(" "));//true
var_dump(ctype_space("\n\t\r "));//true
// 做大写字母检测:如果 text 里面的每个字符都是大写字母,就返回 TRUE。
var_dump(ctype_upper('ABC'));//true
//检测字符串是否只包含十六进制字符 :
//如果 text 里面的每个字符都是十六进制字符。
也就是只能包含十进制的树枝和 [A-Fa-f] 的字母。否则,返回 FALSE 。
var_dump(ctype_xdigit('Af0123')); //true
var_dump(ctype_xdigit('Af0123r')); //false
json:
php手册 > 函数参考 > 变量与类型相关扩展 > JSON
使用这些函数不需要安装,它们是 PHP 核心的一部分。此扩展没有在 php.ini 中定义配置指令。
本扩展实现了 » JavaScript对象符号(JSON) 数据转换格式。 PHP 5 中的解码分析器基于 Douglas Crockford 的 JSON_checker。 PHP 7 中是改进的全新解析器,专门为 PHP 订制,软件许可证为 PHP license。
json_decode()
json_encode()
bc_math:
php手册 > 函数参考 > 数学扩展 > BC_Math
对于任意精度的数学,PHP提供了支持用字符串表示的任意大小和精度的数字的二进制计算,最多为2147483647-1(或0x7FFFFFFF-1)。
按:对于十进制的浮点数,计算机底层无法准确用二进制进行存储,也就是说,计算机用二进制存储浮点数时,可能出现精度丢失的问题。当我们用常规的方式(加减乘除、幂运算、求平方根)对浮点数进行运算时,就可能出现计算结果不准确的问题。这种精度计算的问题是计算机底层的一个bug,是跨语言的。
本类函数仅在 PHP 编译时配置了 --enable-bcmath 时可用。
PHP 的 Windows 版本已内建对此扩展的支持。不需要载入额外的扩展来使用这些函数。
PHP 的 Linux 版本,则需要手动安装bcmath扩展。
在PHP的源码包中,默认就包含bcmath扩展的安装文件,只需手动安装一下即可。
进入php的安装目录
cd src/ext/bcmath
phpize
./configure --with-php-config= php-config文件路径
make && make install
修改php的配置文件php.ini
extension=bcmath.so
查看是否安装了此模块,如果没有可以重启php php php-fpm restart
php -m | grep bcmath
回到手册;
bc数学函数有bcadd等加减乘除、二次方跟、取模、保留结果的小数位数等。
end
下一节 具体的安装