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上的链接
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/
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声明。
有效荷载将会被Base64Url编码组成Json Web Token的第二部分
签名
你必须有编码的header、编码后的有效荷载,secret和algorithm 才能够创建签名。
例如,你想使用HMAC SHA256算法,签名将会以如下的方法进行创建
签名用于验证在此过程中消息没有被更改,因为token被一个私有的键签名,还可以验证JWT的发件人是否是它说的那个人。
Putting all together
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。证书会在你的服务器上随机生成秘钥(共有秘钥和私有秘钥),秘钥会被存储在服务器中,公用秘钥配合客户端进行验证,私有秘钥用于解密处理(是一种非对称秘钥)。
如上图所示,HTTP + TLS = HTTPS。TLS的位置在tcp层和ip层之上,HTTP层之下。
https握手
当你的服务器和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 匿名函数 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”