php面试总结

php面试总结

PHP7的新特性主要有:标量类型声明、返回值类型声明、null合并运算符、太空船操作符、通过define()定义常量数组、匿名类等。

Mysql:
索引:索引(Index)是帮助MySQL高效获取数据的数据结构
存储分类:
B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。
HASH 索引:只有Memory引擎支持,使用场景简单。
R-Tree 索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型。
Full-text (全文索引):全文索引也是MyISAM的一种特殊索引类型,主要用于全文索引,InnoDB从MYSQL5.6版本提供对全文索引的支持。
索引 MyISAM引擎 InnoDB引擎 Memory引擎
B-Tree 索引 支持 支持 支持
HASH 索引 不支持 不支持 支持
R-Tree 索引 支持 不支持 不支持
Full-text 索引 不支持 暂不支持 不支持
B-TREE索引类型
普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
(1)创建索引: CREATE INDEX 索引名 ON 表名(列名1,列名2,…);
(2)修改表: ALTER TABLE 表名ADD INDEX 索引名 (列名1,列名2,…);
(3)创建表时指定索引:CREATE TABLE 表名 ( […], INDEX 索引名 (列名1,列名 2,…) ); 
UNIQUE索引
表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique:
(1)创建索引:CREATE UNIQUE INDEX 索引名 ON 表名(列的列表);
(2)修改表:ALTER TABLE 表名ADD UNIQUE 索引名 (列的列表);
(3)创建表时指定索引:CREATE TABLE 表名( […], UNIQUE 索引名 (列的列表) ); 
主键:PRIMARY KEY索引
主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。
(1)主键一般在创建表的时候指定:“CREATE TABLE 表名( […], PRIMARY KEY (列的列表) ); ”。
(2)但是,我们也可以通过修改表的方式加入主键:“ALTER TABLE 表名ADD PRIMARY KEY (列的列表); ”。
每个表只能有一个主键。 (主键相当于聚合索引,是查找最快的索引)
注:不能用CREATE INDEX语句创建PRIMARY KEY索引

Mysql优化:
1、explain
2、索引
3、尽量用not null
4、开启数据库缓存,尽量用变量代替数据库函数
5、当知道返回的数据只有一条或者只需要一条,使用limit
6、联合查询的时候,两个字段的类型一致
7、避免select *
8、尽量给字段类型固定长度
Mysql事务:

Innodb和myisam区别:
1、 存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
2、 存储空间
MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
3、 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
4、 事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
5、 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
6、 表锁差异
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
7、 全文索引
MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
8、 表主键
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值的数据列。
9、 表的具体行数
大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count() from table;就会遍历整个表,消耗相当
10、 CURD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。
11、 外键
MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
存储引擎选择的基本原则
采用MyISAM引擎
R/W > 100:1 且update相对较少
并发不高
表数据量小
硬件资源有限
采用InnoDB引擎
R/W比较小,频繁更新大字段
表数据量超过1000万,并发高
安全性和可用性要求高
采用Memory引擎
有足够的内存
对数据一致性要求不高,如在线人数和session等应用
需要定期归档数据
HTTP协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW: World Wide Web)服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据,HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统,他的主要特点是:简单快速、灵活、无连接、无状态、支持B/S及C/S模式等。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
TCP/IP协议
从字面意义上讲,有人可能会认为TCP/IP是指TCP和IP两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用IP进行通信时所必须用到的协议群的统称。具体来说,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP协议。他们与TCP或IP的关系紧密,是互联网必不可少的组成部分。TCP/IP一词泛指这些协议,因此,有时也称TCP/IP为网际协议群。
四种算法:
1、冒泡排序法:比较相邻的两个数,如果第一个比第二个大就交换
function bubbleSort (KaTeX parse error: Expected '}', got 'EOF' at end of input: …要冒泡的轮数 for(i = 1, l e n = c o u n t ( len = count( len=count(arr);$i < l e n ; len; len;i++){
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for( j = 0 ; j = 0; j=0;j < l e n − len- leni;KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(arr[$j] > a r r [ arr[ arr[j+1]){
$temp = a r r [ arr[ arr[j];
a r r [ arr[ arr[j+1] = a r r [ arr[ arr[j];
a r r [ arr[ arr[j] = $temp;
}
}
}
return $arr;}

快速排序法:从数列中挑出一个元素,称为 “基准”(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
Public function sort(array KaTeX parse error: Expected '}', got 'EOF' at end of input: arr){ if(count(arr)<=1)
Return $arr;
$left_arr=[];
$right_arr=[];
p = p= p=arr[0];
foreach( i = 1 ; i=1; i=1;i<count( a r r ) ; arr); arr);i++){
if( a r r [ arr[ arr[i]<$p){
l e f t a r r [ ] = left_arr[]= leftarr[]=arr[$i];
}else{
r i g h t a r r [ ] = right_arr[]= rightarr[]=arr[$i];
}
}
l e f t a r r = s o r t ( left_arr=sort( leftarr=sort(left_arr);
r i g h t a r r = s o r t ( right_arr=sort( rightarr=sort(right_arr);
return array_merge( l e f t a r r , [ left_arr,[ leftarr,[p],$right_arr);
}

Php7的特性:
标量类型声明、返回值类型声明、null合并运算符、太空船操作符、通过define()定义常量数组、匿名类等

Nginx和Php-fpm的工作原理
Nginx (engine x)是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务器。而Php-fpm是FastCGI的实现,并提供了进程管理的功能。因为Nginx不只有处理http请求的功能,还能做反向代理;所以Nginx通过反向代理功能将动态请求转向后端Php-fpm。
Cgi:CGI(Common Gateway Interface),公共网关接口,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准。CGI就是规定客户端向web server请求数据的时候,要传哪些数据、以什么样的格式传递的一种协议。
FastCGI

(1)FastCGI是一种进程管理工具,它可以在内存中管理CGI进程。
(2)FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着。
(3)FastCGI程序也可以和Web服务器分别部署在不同的主机上,它还可以接受来自其他Web服务器的请求。
(4)FastCGI也是语言无关的。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能。
(5)FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。
(6)当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务。
Php-fpm:
PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能,被PHP官方收了。
php-fpm就是php中的FastCGI进程管理器。进程包括master进程和worker进程。master进程只有一个,负责管理子进程(注意,这里有人认为master进程负责将客户端的请求交给worker进程处理的观点是不正确的,请看 (十)PHP-FPM的三种模式和worker进程、master进程详解 这篇博文中的实例,将master进程kill掉,客户端请求依旧能得到响应结果)。worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,处理PHP代码。
如果在Linux上搭建Nginx和PHP环境,则需要安装PHP-FPM模块,让php以FastCGI的方式与nginx进行交互。
Redis:
与 MC 不同的是,Redis 采用单线程模式处理请求。这样做的原因有 2 个:一个是因为采用了非阻塞的异步事件处理机制;另一个是缓存数据都是内存操作 IO 时间不会太长,单线程可以避免线程上下文切换产生的代价。
Redis 支持持久化,所以 Redis 不仅仅可以用作缓存,也可以用作 NoSQL 数据库。
相比 MC,Redis 还有一个非常大的优势,就是除了 K-V 之外,还支持多种数据格式,例如 list、set、sorted set、hash 等。
Redis 提供主从同步机制,以及 Cluster 集群部署能力,能够提供高可用服务。
类型:
1、string
String 类型是 Redis 中最常使用的类型,内部的实现是通过 SDS(Simple Dynamic String )来存储的。SDS 类似于 Java 中的 ArrayList,可以通过预分配冗余空间的方式来减少内存的频繁分配。这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。
String的实际应用场景比较广泛的有:
缓存功能:String字符串是最常用的数据类型,不仅仅是Redis,各个语言都是最基本类型,因此,利用Redis作为缓存,配合其它数据库作为存储层,利用Redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。
计数器:许多系统都会使用Redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。
共享用户Session:用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存Cookie,但是可以利用Redis将用户的Session集中管理,在这种模式只需要保证Redis的高可用,每次用户Session的更新和获取都可以快速完成。大大提高效率。
2、Hash
这个是类似 Map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在 Redis 里,然后每次读写缓存的时候,可以就操作 Hash 里的某个字段。
但是这个的场景其实还是多少单一了一些,因为现在很多对象都是比较复杂的,比如你的商品对象可能里面就包含了很多属性,其中也有对象。我自己使用的场景用得不是那么多。
3、List:
List 是有序列表,这个还是可以玩儿出很多花样的。
比如可以通过 List 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。
比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 List 实现分页查询,这个是很棒的一个功能,基于 Redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。
比如可以搞个简单的消息队列,从 List 头怼进去,从 List 屁股那里弄出来。
List本身就是我们在开发过程中比较常用的数据结构了,热点数据更不用说了。
消息队列:Redis的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据。
文章列表或者数据分页展示的应用。
比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用Redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。

4、Set:
Set 是无序集合,会自动去重的那种。
直接基于 Set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 JVM 内存里的 HashSet 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于Redis进行全局的 Set 去重。
可以基于 Set 玩儿交集、并集、差集的操作,比如交集吧,我们可以把两个人的好友列表整一个交集
Sorted Set:
Sorted set 是排序的 Set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
有序集合的使用场景与集合类似,但是set集合不是自动有序的,而Sorted set可以利用分数进行成员间的排序,而且是插入时就排序好。所以当你需要一个有序且不重复的集合列表时,就可以选择Sorted set数据结构作为选择方案。
排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
微博热搜榜,就是有个后面的热度值,前面就是名称
高级用法:
Bitmap :
位图是支持按 bit 位来存储信息,可以用来实现 布隆过滤器(BloomFilter);
HyperLogLog:
供不精确的去重计数功能,比较适合用来做大规模数据的去重统计,例如统计 UV;
Geospatial:
可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等。有没有想过用Redis来实现附近的人?或者计算最优地图路径?
这三个其实也可以算作一种数据结构,不知道还有多少朋友记得,我在梦开始的地方,Redis基础中提到过,你如果只知道五种基础类型那只能拿60分,如果你能讲出高级用法,那就觉得你有点东西。
pub/sub:
功能是订阅发布功能,可以用作简单的消息队列。 
Pipeline:
可以批量执行一组指令,一次性返回全部结果,可以减少频繁的请求应答。
Lua:
Redis 支持提交 Lua 脚本来执行一系列的功能。
我在前电商老东家的时候,秒杀场景经常使用这个东西,讲道理有点香,利用他的原子性。
话说你们想看秒杀的设计么?我记得我面试好像每次都问啊,想看的直接点赞后评论秒杀吧。
事务:
最后一个功能是事务,但 Redis 提供的不是严格的事务,Redis 只保证串行执行命令,并且能保证全部执行,但是执行命令失败时并不会回滚,而是会继续执行下去。
持久化:Rdb:根据特定的条件保存数据,最后一次快照失败,会丢失数据,AOF:记录操作命令
缓存雪崩:在同一时间,大量的数据失效,所有的请求落到了db上。
解决方法:给每个值设置随机的失效时间
缓存击穿:就是某个热点数据失效时,大量针对这个数据的请求会穿透到数据源。
解决方法:可以使用互斥锁更新,保证同一个进程中针对同一个数据不会并发请求到 DB,减小 DB 压力。
使用随机退避方式,失效时随机 sleep 一个很短的时间,再次查询,如果失败再执行更新。
针对多个热点 key 同时失效的问题,可以在缓存时使用固定时间加上一个小的随机数,避免大量热点 key 同一时刻失效。
缓存穿透:外部恶意攻击,比如用id=-1的条件请求接口,缓存中不存在这个数据,请求便会落到db上。
解决方法:1、对传递的参数进行严格校验
2、nginx设置对同一个ip在一定时间内限制访问次数
3、使用bloomfilter过滤器
Session:共享,存活时间
在php.ini中可以设置
Session.save_handler=file/redis //存储引擎
Session.save_path=文件地址/redis地址
简单用法:
Session_start()
$_SESSION[‘name’]=3;
yield 是什么,说个使用场景:生成器,任务调度
开启 PHP 异常提示:
代码中:
ini_set(“display_errors”, “On”);
error_reporting(E_ALL | E_STRICT);
php.ini:
display_errors = Off 修改为 display_errors = On

修改错误级别

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
修改为
error_reporting = E_ALL
error_reporting(-1)显示所有错误,error_reporting(0)屏蔽所有错误。i

错误级别:
   Deprecated最低级别错误,程序继续执行
 Notice 通知级别的错误 如直接使用未声明变量,程序继续执行
 Warning 警告级别的错误,可能得不到想要的结果
 Fatal error  致命级别错误致命级别错误,程序不往下执行
parse error 语法解析错误,最高级别错误,连其他错误信息也不呈现
E_USER_相关错误 用户设置的相关错误
HTTPS和HTTP的主要区别:
        1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
        2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
        3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
        4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
linux常用指令:
查看php扩展 php --ri 扩展名字
查看端口占用:
lsof -i tcp:port  
Mv :移动文件夹
Cp :复制文件夹
More:翻页往后翻
Less;往前翻
Head:显示前几行
Tail:显示后几行
which 查看可执行文件的位置。
whereis 查看文件的位置。
locate 配合数据库查看文件位置。
find 实际搜寻硬盘查询文件名称。
Chmod chmod 777 文件
chown 将指定文件的拥有者改为指定的用户或组
Rz:上传文件
Sz:下载文件

php引用变量:
概念:在php中引用变量意味着用不同得名字询问同一个变量
$a=1;
KaTeX parse error: Expected 'EOF', got '&' at position 3: b=&̲a;
Unset( b ) / / 只 是 取 消 得 b 的 引 用 , 并 不 会 删 除 b) //只是取消得b的引用,并不会删除 b)//ba
例子:

<?php $data=["a","b","c"]; foreach($data as $key=>$val){ $val=&$data[$key]; print_r($data); } ?>

##每次循环后,输出的data
[a,b,c]
[b,b,c]
[b,c,c]
常量及数据类型考点
php字符串的定义方式及命名区别
定义方式:1、单引号,2、双引号,3、heredoc和newdoc
区别:1、单引号不能解析变量,2、单引号不能解析转义字符,只能解析单引号和反斜线本身
单引号效率高于双引号
heredoc(EOF)类似双引号
a = < < < E O F " a b c " a= <<<EOF "abc" a=<<<EOF"abc"name
“123”
EOF;
// 结束需要独立一行且前后不能空格
newdoc类似单引号
全局变量: G L O B A L S 、 GLOBALS、 GLOBALS_SERVER、 R E Q U E S T 、 _REQUEST、 REQUEST_POST、 G E T 、 _GET、 GET_FILES、 E N V 、 _ENV、 ENV_COOKIE、$_SESSION

require() require_once() include_once() include()

require()和include()区别:当要加载的文件不存在时候, include会给一个warning警告, 然后继续运行. 而require则会给一个fatal error, 直接结束脚本。include可以放在if中
include_once()和 include()区别 include_once() 函数会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了,如果有的话就不会再次重复导入该档案,第二次导入的时候便会发生错误讯息

_SERVER[‘SERVER_ADDR’] 服务器ip地址
_SERVER[‘SERVER_NAME’] 服务器名称
_SERVER[‘REQUEST_TIME’] 请求时间
_SERVER[‘QUERY_STRING’] 查询(query)的字符串。
_SERVER[‘HTTP_REFERER’] 当前页面的前一页面的url。
_SERVER[‘REMOTE_ADDR’] 客户端IP地址。
_SERVER[‘REQUEST_URI’] 访问此页面所需的 URI。
_SERVER[‘PATH_INFO’] 路劲部分,控制器+方法。
_SERVER[‘TTP_USER_AGENT’] 当前请求的 User_Agent: 头部的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)
常量:定义后,不能删除
const:更快语言结构
define:定义函数,不能定义类常量
预定义常量:
1、LINE 显示当前代码在多少行
2、 FILE 获取当前文件绝对路径
3、 DIR 获取当前文件所在的目录
4、 FUNCTION 获取当前方法的名称
5、 METHOD 获取当前类名加方法的名称
6、 NAMESPACE 获取当前命名空间的名称,也就是namespace的名称
7、 CLASS 获取当前类的名称
8、 TRAIT 获取当前的名称
运算符
foo()和@foo() 区别 @。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
可以把它放在变量,函数和include()调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如if 和 foreach 等。

i + + 与 + + i++与++ i++++i
例:

<?php $i=0; $t=++$i; echo $t; echo $i; ?>

结果:11

<?php $i=0; $t=$i++; echo $t; echo $i; ?>

结果:01

函数:
时间:
date()、strtotime()
mktime(hour,minute,second,month,day,year);//特定时间戳
time()
microtime() 函数返回当前 Unix 时间戳的微秒数。
date_default_timezone_set():函数设置脚本中所有日期/时间函数使用的默认时区。
打印:
1、echo:用于输出一个或者多个字符串, 不换行,echo属于语法结构,而非函数如果输出对象非字符串,会尝试将对象转成字符串, 转化失败则抛出异常
2、 print: 属于语法结构,而非函数 (同echo),一次只能接受一个字符串(区分与echo)
3、 print_r():对于对象, 打印所有属性(public, protected, private) 一次仅允许打印一个变量(区别于echo)用于 打印关于变量的易于理解的信息。(不包括变量类型信息)
4、var_dump:一个或多个表达式的结构信息 (print_r只打印一个表达式)输s出包括 类型 与值(print_r() 不显示类型)
5、printf():用于格式化输出的场景
6、sprintf():用于格式化字符串场景, 较printf()区别在于,前者直接输出到标准输出, 后者字符串以变量形式返回
<?php
$n = 11;
$s = “22”;
$f = “22”;

  printf("%d%s%f", $n, $s, $f); // 112222.000000

  $s2 = sprintf("%d%s%f", $n, $s, $f);
  echo $s2; // 112222.000000

序列化,反序列化:
serialize(): 函数用于序列化对象或数组,并返回一个字符串。
unserialize(): 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。
字符串:
implode(’’, a r r ) : 将 数 组 转 化 为 字 符 串 e x p l o d e ( ′ ′ , arr):将数组转化为字符串 explode('', arr):explode(,arr):将字符串分割为数组
join():implode的别名
strrev():反转字符串。
trim():移除字符串两侧的空白字符和其他字符
ltrim():移除字符串左侧的空白字符和其他字符
rtrim():移除字符串右侧的空白字符和其他字符
strstr():函数搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分。(大小写敏感)
strchr():查找字符串在另一字符串中的第一次出现。(strstr() 的别名。)
strtolower():把字符串转换为小写字母。
strtoupper():把字符串转换为大写字母。
strlen():返回字符串的长度。
str_replace():替换字符串中的一些字符(对大小写敏感)。str_replace(“world”,“Shanghai”,“Hello world!”);把字符串 “Hello world!” 中的字符 “world” 替换为 “Shanghai”:
strcmp(str1,str2):比较两个字符串(对大小写敏感)。str1=str2 result=0,str1<str2 result<0,str1>str2 result>0
substr(string,start,length):返回字符串的一部分。
数组:
array_keys()
array_values()
array_diff():比较数组,返回差集(只比较键值)。
array_diff_assoc():比较数组,返回差集(比较键名和键值)。
array_diff_key():比较数组,返回差集(只比较键名)。
array_fill():用给定的键值填充数组。
array_unshift();往数组开头插入数据
array_shift():删除首个元素,并返回
array_pop():删除最后一个元素
array_push():将一个或多个元素插入数组的末尾(入栈)。
arsort():对关联数组按照键值进行降序排序。
asort():对关联数组按照键值进行升序排序。
krsort():对数组按照键名逆向排序。
ksort():对数组按照键名排序。
rsort():对数组排序。
usort():使用用户自定义的比较函数对数组进行排序。

php遍历文件夹

<?php $file="../../php"; function list_file($date){ //1、首先先读取文件夹 $temp=scandir($date); //遍历文件夹 foreach($temp as $v){ $a=$date.'/'.$v; if(is_dir($a)){//如果是文件夹则执行 if($v=='.' || $v=='..'){//判断是否为系统隐藏的文件.和.. 如果是则跳过否则就继续往下走,防止无限循环再这里。 continue; } echo " $a","
"; //把文件夹红名输出 list_file($a);//因为是文件夹所以再次调用自己这个函数,把这个文件夹下的文件遍历出来 }else{ echo $a,"
"; } } } list_file($file); 上传文件: <?php// 允许上传的图片后缀 $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["file"]["name"]); echo $_FILES["file"]["size"]; $extension = end($temp); // 获取文件后缀名if ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/jpg")|| ($_FILES["file"]["type"] == "image/pjpeg")|| ($_FILES["file"]["type"] == "image/x-png")|| ($_FILES["file"]["type"] == "image/png"))&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb&& in_array($extension, $allowedExts)){     if ($_FILES["file"]["error"] > 0)     {         echo "错误:: " . $_FILES["file"]["error"] . "
";     }     else     {         echo "上传文件名: " . $_FILES["file"]["name"] . "
";         echo "文件类型: " . $_FILES["file"]["type"] . "
";         echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
";         echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "
";                  // 判断当前目录下的 upload 目录是否存在该文件         // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777         if (file_exists("upload/" . $_FILES["file"]["name"]))         {             echo $_FILES["file"]["name"] . " 文件已经存在。 ";         }         else         {             // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下             move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);             echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];         }     }}else{     echo "非法的文件格式";}?>

Tcp,ucp的区别及应用场景
区别
o
1.面向连接VS无连接
TCP建立一个连接需要3次握手IP数据包,断开连接需要4次握手。另外断开连接时发起方可能进入TIME_WAIT状态长达数分钟(视系统设置,windows一般为120秒),在此状态下连接(端口)无法被释放。
UDP不需要建立连接,可以直接发起。
2.可靠VS不可靠
TCP利用握手、ACK和重传机制,udp没有。
1,校验和(校验数据是否损坏);
2,定时器(分组丢失则重传);
3,序列号(用于检测丢失的分组和重复的分组);
4,确认应答ACK(接收方告知发送方正确接收分组以及期望的下一个分组);
5,否定确认(接收方通知发送方未被正确接收的分组);
6,窗口和流水线(用于增加信道的吞吐量)。(窗口大小:无需等待确认应答而可以继续发送数据的最大值)
3.有序性
TCP利用seq序列号对包进行排序,udp没有。
4.面向字节流vs面向报文
o面向报文
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。(一个upd的最大报文长度2^16-1-20-8,20是ip报文头,8是udp报文头)
o面向字节流
面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
5.tcp有流量控制,udp没有
6.tcp的头部比20bytes,udp8byres
TCP应用场景:
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录
UDP应用场景:
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。

魔术方法:
__construct():实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
__destruct()

当删除一个对象或对象操作终止时被调用。
__call()

对象调用某个方法, 若方法存在,则直接调用;若不存在,则会去调用__call函数。
__get()

读取一个对象的属性时,若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。
__set()
设置一个对象的属性时, 若属性存在,则直接赋值;
若不存在,则会调用__set函数。
__toString():打印一个对象的时被调用。如echo obj;或print obj;
__clone():克隆对象时被调用。如:t=newTest(); t1=clone $t;

__sleep():serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
__wakeup():unserialize时被调用,做些对象的初始化工作。
__isset():检测一个对象的属性是否存在时被调用。如:isset(KaTeX parse error: Expected group after '_' at position 11: c->name)。 _̲_unset():unset一…c->name)。
__set_state():调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。__autoload():实例化一个类时,当此类不存在时被调用
$this,static,self
t h i s 表 示 当 前 实 例 , S t a t i c : 声 明 调 用 静 态 变 量 S e l f : 当 前 类 . 在 静 态 方 法 内 部 , 不 能 使 用 this表示当前实例, Static:声明调用静态变量 Self:当前类 .在静态方法内部,不能使用 thisStatic:Self:.,使this(即在静态方法内部只能调用静态成员);
  2.调用静态成员的方法只能是self::方法名或者parent::方法名或者类名::方法名
  3.在类的外部,调用静态方法时,可以不用实例化,直接类名::方法名
4.静态方法执行之后变量的值不会丢失,只会初始化一次,这个值对所有实例都是有效的

哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。
区别:
1、哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。
2、哈希算法是不可逆的,而加密算法是可逆的。
cookie安全:
1、cookie信息加密法
2、2、用加密令牌对cookie进行保护
  DNS服务的作用
      将域名解析为IP 地址
           客户端向DNS服务器(DNS服务器有自己的IP地址)发送域名查询请求
   DNS服务器告知客户机Web服务器的IP 地址
   客户机与Web 服务器通信
const和define()区别:
const是在编译阶段定义常量,define是在预处理阶段定义常量
const只接受标量数据,(如integer, string, boolean和float等);define可以接受任意表达式
const可以在类内部定义,而define不行。
const定义的常量在当前的命名空间中,而define要定义执行的命名空间,必须写出具体命名空间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值