Set_time_limite()

描述:控制php脚本的运行时间,默认为30s。
当值为0的时候,表示程序持续运行直到结束。如果报错,需要关闭php的安全模式(在php.int文件中设置safe_mode = off)

Eg: set_time_limite(800)
脚本的实际执行时间为30 - 5 + 800
查看php-fpm进程数:ps aux | grep -c php-fpm
查看运行内存/usr/bin/php -i|grep mem
重启php-fpm
/etc/init.d/php-fpm restart

Ob_implicit_flush

ob_implicit_flush ([ int $flag = 1 ] ) : void
描述:如果打开,无需再调用flush()函数

Socket_create

socket_create ( int $domain , int $type , int $protocol ) : resource

$domain 指定socket使用的协议族

Domain Description
**AF_INET** IPv4 Internet based protocols. TCP and UDP are common protocols of this protocol family.
**AF_INET6** IPv6 Internet based protocols. TCP and UDP are common protocols of this protocol family.
**AF_UNIX** Local communication protocol family. High efficiency and low overhead make it a great form of IPC (Interprocess Communication).


$type 选择socket通信的方式

Type Description
**SOCK_STREAM** Provides sequenced, reliable, full-duplex, connection-based byte streams. An out-of-band data transmission mechanism may be supported. The TCP protocol is based on this socket type.
**SOCK_DGRAM** Supports datagrams (connectionless, unreliable messages of a fixed maximum length). The UDP protocol is based on this socket type.
**SOCK_SEQPACKET** Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a consumer is required to read an entire packet with each read call.
**SOCK_RAW** Provides raw network protocol access. This special type of socket can be used to manually construct any type of protocol. A common use for this socket type is to perform ICMP requests (like ping).
**SOCK_RDM** Provides a reliable datagram layer that does not guarantee ordering. This is most likely not implemented on your operating system.


$protocal
icmp Internet Controll Protocol 主要用于网关和主机在数据表交流中报告错误。
tcp
udp

Return
如果成功返回socket资源,如果失败,返回false

socket_set_option()

socket_set_option ( resource $socket , int $level , int $optname , mixed $optval ) : bool
描述:
$socket 接收一个socket_create()或是socket_accept()返回的资源
$level
$optname
SO_REUSEADDR,一般来说,端口被释放后,需要等待两分钟后才能被正确使用,该值让端口释放后可被立即调用
$optval
选项的值

socket_bind()

socket_bind ( resource $socket , string $address [, int $port = 0 ] ) : bool
描述:绑定给定的$address,此操作需要在socket_connect()或socket_listen()之前
Return true or false
Socket_listen()
描述:监听一个连接的socket

Socket_listen()

描述:监听socket上的链接
php基础 - 图1
socket_listen ( resource $socket [, int $backlog = 0 ] ) : bool
$socket …
$backlog
链接队列的长度,如果长度超过限制的最大值,直接返回false。
该值的设置受低层的限制,如Linux,

socket_recv

描述:从一个链接的socket中获取数据
socket_recv ( resource $socket , string &$buf , int $len , int $flags ) : int
$socket
Socket资源
$buf
接收数据的缓冲
$len
接收的bytes长度
$flags
加入到比特或是(/)操作符

Flag Description
**MSG_OOB** Process out-of-band data.
**MSG_PEEK** Receive data from the beginning of the receive queue without removing it from the queue.
**MSG_WAITALL** Block until at least **len** are received. However, if a signal is caught or the remote host disconnects, the function may return less data.
**MSG_DONTWAIT** With this flag set, the function returns even if it would normally have blocked.

splObjectStorage类

关于websocket

可以让客户端和服务端进行全双工通信。
建立在TCP协议之上,服务端实现比较容易
与HTTP协议有着良好的兼容性。默认端口是80和443,并且握手阶段采用HTTP协议,因此握手不容易被屏蔽,能通过各种HTTP代理服务器。
协议的标识符是ws(如果加密,则为wss)
https://pusher.com/docs/channels/getting_started/javascript
https://docs.beyondco.de/laravel-websockets/

php基础 - 图2
Ratchet

JWT

全称:Json Web Token
JWT包含三分,用.分隔。
ü 头部信息
ü 有效荷载
ü 签名

Header信息

头部信息通常包含两部分:token的类型,哪个是JWT和使用的签名算法,例如HMAC SHA256或是 RSA。如下:
{
“alg”: “HS256”,
“typ”: “JWT”
}
这个json是Base64Url编码的,组成了JWT的第一部分。

荷载

令牌的第二部分是有效荷载,包含声明。声明关于实体和额外的数据
这里有三种类型的声明:registered,public和claims。
Registered claims:是一种预定义的声明,推荐使用。例如:iss(issuer),exp(expiration time),sub(subject),aud(audience)和其他。
注意:声明仅有三个字符(英文)。
Public claims:这些可以由使用JWT的人随意定义。但为避免冲突,应在IANA JSON Web令牌注册表中定义它们,或者将其定义为包含防冲突命名空间的URI。
Private claims:这些是为了同意在使用他们的各方之间共享信息而自定义的声明,既不是publicity声明也不是registerd声明。
php基础 - 图3
有效荷载将会被Base64Url编码组成Json Web Token的第二部分

签名

你必须有编码的header、编码后的有效荷载,secret和algorithm 才能够创建签名。
例如,你想使用HMAC SHA256算法,签名将会以如下的方法进行创建


签名用于验证在此过程中消息没有被更改,因为token被一个私有的键签名,还可以验证JWT的发件人是否是它说的那个人。

Putting all together

php基础 - 图4

HttpOnly

http only是设置在set-cookie HTTP相应头部的额外标志。使用HTTP only可以减少客户端获取cookie的风险。浏览器兼容性IE >= 6。
Php设置HttpOnly标志(php >= 5.2.0)。
可以在php.ini配置文件中进行设置
session.cookie_httponly = True
也可以在执行php脚本的时候进行设置。
bool setcookie ( string $name [, string $value [, int $expire= 0 [, string $path
[, string $domain [, bool $secure= false [, bool $httponly= false ]]]]]] )
web应用程序防火墙

Base64

Base64用于将二进制到文本编码的方案,以ascii字符串的形式表示二进制数据。Base数据只包含64种不同的ASCII码。
Base64编码就是将三个字节转成四个字节
Base64的表
[A~Za~z0~9+/=],长度 = 64

对”Man”进行Base64编码

文本(ASCII) M a n
十进制(ASCII) 77 97 110
二进制 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
Base64编码 十进制
(ASCII)
19 22 5 46
字符 T W F u


Man一共三个字节,也就是24bit,Base64编码就是按6个比特一组,将24个比特分成了4组,然后将每组的二进制转化成10进制,再对照ASCII码表,将十进制映射为ASCII码字符。
=是为了确保最后一组中的base64编码包含4个字符

文本(ASCII) M
十进制
(ASCII)
77
Bits 0 1 0 0 1 1 0 1 0 0 0 0
Base64编码 十进制
(ASCII)
19 16 Padding Padding
字符 T Q = =



总结:
在网站中,base64主要用于将图片和其他二进制资源嵌入到文本资源(如HTML和css)中。

HTTPS

在深入了解HTTPS之前,首先了解下HTTP。
HTTP是用于客户端和服务端之间异步通信的请求响应式协议。传输的是HTML纯文本。

HTTPS需要在服务器中安装TLS(Transport Layer Security)证书。你可以将证书用于不同的协议中,如HTTP,SMTP和FTP。证书会在你的服务器上随机生成秘钥(共有秘钥和私有秘钥),秘钥会被存储在服务器中,公用秘钥配合客户端进行验证,私有秘钥用于解密处理(是一种非对称秘钥)。
php基础 - 图5
如上图所示,HTTP + TLS = HTTPS。TLS的位置在tcp层和ip层之上,HTTP层之下。
https握手

php基础 - 图6
当你的服务器和HTTPS服务器建立联系的时候,服务器会返回一个证书(包含公有秘钥)。浏览器会检查证书是否合法,规则如下:
ü 证书所有者的信息需要和请求的服务器的名字匹配。
ü 证书需要被权威的证书颁发机构签名
如果上述的条件不匹配,将会通知用户相关的错误。

初始的请求发送到服务器,服务器响应它就是客户端渴望访问的服务器。

客户端会生成随机的密码串,并用公开秘钥进行加密。然后将这个密码串发送给服务器。服务器使用私有秘钥解密密码串
初始的握手在100多毫秒内完成,之后,通讯的内容就会被加密处理。
总结
使用https是很有必要的,如果不使用https,浏览器会提示连接可能不安全。


https://love2dev.com/blog/how-https-works/

webp

canvas标签 IE >= 9
判断浏览器是否支持webp
function canUseWebP() {
var elem = document.createElement(‘canvas’);

if (!!(elem.getContext && elem.getContext(‘2d’))) {
// was able or not to get WebP representation
return elem.toDataURL(‘image/webp’).indexOf(‘data:image/webp’) == 0;
}

// very old browser like IE 8, canvas not supported
return false;}

curl

php支持libcurl,允许使用不同类型的协议访问不同类型的服务,libcurl目前支持http,https,ftp,gopher,telnet,dict,file和ldap协议。

curl_init

curl_init([string $url = NULL]) : resource
初始化curl

curl_setopt

curl_setopt(resource $ch, int $option, mixed $value) : bool

为curl设置传输选项
参数说明
$ch // curl_init()返回的句柄
$option // 要设置的选项
$value // $option选项的值

一些常用的选项($option)
CURLOPT_POST // $value为TURE的时候,将请求设为post
CUROPT_RETURNTRANSFER // 值为true时,curl_exec的返回值作为字符串返回,而不 是直接输出
CURLOPT_HTTP_VERSION // 指定http协议的版本,CURL_HTTP_VERSION_NONE(默 认值,让curl决定使用哪个版本), CURL_HTTP_VERSION_1_0 强制使用http/1.0, CURL_HTTP_VERSION_1_1 强制使用HTTP/1.1

CURLOPT_CONNECTTIMEOU T// 链接超时的时间,0为无限等待
CURLOPT_TIMEOUTE // curl功能执行的最大时间
CURLOPT_SSL_VERIFYHOST // 1检查SSL对等证书中是否存在公用名(common name), 2检查是否存在公用名,并验证它是否与提供的主机名匹 配(默认值,在生产模式中应该设为该值),0不检查 公用名
CURLOPT_SSL_VERIFYPEER // false停止检查对等证书,true检查对等证书(peer’s certificate)
CURLOPT_CURLOPT_FOLLOWLOCATION // 设置为TRUE,可以进行页面跳转

CURLOPT_POSTFIELDS // post附带的数据,$value是一个键值对的数组
CURLOPT_HTTPHEADER // HTTP的header字段,$value是一个数组,[‘Content-type: text/plain’, ‘Content-length: 100’]

CURLOPT_FILE // 传输文件被写入的文件(一个文件句柄),默认是标准 输出(浏览器窗口)

CURLOPT_COOKIE // cookie的内容,多个cookie使用;加空格隔开,例 如”fruit=apple; colour=red”
CURLOPT_URL // 请求的地址

curl_exec

执行给定的curl会话
curl_exec( resource $ch ) : mixed

params
$ch // curl_init()返回的句柄

return
成功返回true,失败返回false。如果指定了CUROPT_RETURNTRANSFER的值为TRUE,成功时,返回远程html的内容,失败时也会返回false。

crul_getinfo

curl_getinfo ( resource $ch [, int $opt ] ) : mixed

获取最后一次传输的信息

curl_close

curl_close( resource $ch ) : void

关闭curl会话,释放所有的资源,$ch也会被删除

使用curl页面跳转
php基础 - 图7
如果在这个页面百度东西,效果是这样的
php基础 - 图8

php 匿名函数 use

继承变量的值是在定义的时候,不是在调用的时候。

php下载文件


<?php
if(isset($_REQUEST[“file”])){
// Get parameters
$file = urldecode($_REQUEST[“file”]); // Decode URL-encoded string
$filepath = “images/“ . $file;

// Process download
if(file_exists($filepath)) {
header(‘Content-Description: File Transfer’);
header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename=”‘.basename($filepath).’”‘);
header(‘Expires: 0’);
header(‘Cache-Control: must-revalidate’);
header(‘Pragma: public’);
header(‘Content-Length: ‘ . filesize($filepath));
flush(); // Flush system output buffer
readfile($filepath);
exit;
}
}
?>

将科学计数法的数字转成整形

<?php
$awb = 2.01421700079E+14;
$str = sprintf(“%d”, $awb);
var_dump($str);
Output:

string(15) “201421700079000”