PHP面试题的小结
csrf是什么:
CSRF跨站点请求伪造,
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的
,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行
session与cookie区别:
1.COOKIE 存在于客户端。SESSION 存在于服务端。
2.COOKIE 默认存储大小为 4kb. 一般设置COOKIE 不会超过 20个,具体看需求。
3.SESSION 默认以文件方式存储。生存时间默认为 24分钟,初始存储大小为1M,可修改理论上无限制。可通过修改 php.ini 进行配置。
4.SESSION 默认是基于COOKIE SESSION开启时会生成session_id 存在COOKIE中。
5.SESSION COOKIE 都是会话控制。因为咱们得http 是无状态无连接得。所以需要通过会话控制来识别用户。
php 超全局变量:
$GLOBALS $_SERVER $_REQUEST $_POST $_GET
$_FILES $_ENV $_COOKIE $_SESSION
PHP与MYSQL事务处理:
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模
事务的4大特性(ACID):
原子性(Atomicity):
事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。
一致性(Consistemcy):
事务前后,数据库的状态都满足所有的完整性约束。
隔离性(Isolation):
并发执行的事务是隔离的,一个不影响一个。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为
只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
通过设置数据库的隔离级别,可以达到不同的隔离效果。
持久性(Durability):
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
xss怎么防止:
XSS又称CSS,全称CrossSiteScript,跨站脚本攻击
防止: script注入,转义过滤script标签。
union和unionall的区别:
union去重,unionall不去重
RBAC 基于角色的权限控制:
5张表 用户表、角色表、功能表,还有他们之间互相关联的表:用户与角色表、角色与功能表
redis持久化:
内存快照(RDB) RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照
日志(AOF) AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
分表:
减小数据库的负担,缩短查询时间。
垂直分表:垂直分割就是按字段分.
水平分表:根据一列或多列数据的值把数据行放到两个独立的表中。
水平分表怎么保证插入的id的唯一?
可以新建一个id服务,把用户的id保存在数据库或者redis中。
jquery选择器:
1.元素 2.属性 3.id 4.类 5.全局。
行内元素和块内元素
行内:<a>,<b>,<br>,<i>,<img>
块内:<p>,<p>,<h1>
转换:display:inline,block,inline-block.
区别:
块、
①总是在新行上开始,占据一整行;
②高度,行高以及外边距和内边距都可控制;
③宽带始终是与浏览器宽度一样,与内容无关;
④它可以容纳内联元素和其他块元素。
行、
①和其他元素都在一行上;
②高,行高及外边距和内边距部分可改变;
③宽度只与内容有关;
④行内元素只能容纳文本或者其他行内元素。
分组查询:orderby
表中统计男女个数20-30:
select count(sex) from 表where age between 20 and 30 group bysex
ORM:
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术
Linux查看端口:刷选文件:查看进程:
netstat-antu //查看当前所有tcp端口·
netstat-ntulp |grep80 //查看所有80端口使用情况·
netstat-an | grep3306 //查看所有3306端口使用情况·
Linux查看执行多少命令:history
文件操作函数:
open 打开文件
fstat 获取文件
file 把整个文件读入一个数组中
fclose 关闭文件
fwrite 写入文件(可安全用于二进制文件)
file_get_contents()将整个文件读入一个字符串
打开文件的几种方式:
Fopen(), file_get_contents()
读写,追加
php删除文件夹命令
Unlink();
中文字符串截取:mb_substr
mb_substr($str,$start, $length, $encoding )
$str,需要截断的字符串
$start,截断开始处,起始处为0
$length,要截取的字数
$encoding,网页编码,如utf-8,GB2312,GBK
D和M的区别:
M实例化基类,D可以实例化自定义类
table隔行变色:
通过JQ识别table tr td的双数单数,对应单数双数给予赋予不同CSS样式,通过不同背景,即可实现隔行换色变色效果。
当鼠标经过时候JQ调用另外设置的trtd背景,实现鼠标经过背景颜色也跟着变化
ajax同步异步:
同步等待服务端的返回结果然后进行其他操作
异步发送请求后不等待服务端的返回结果直接进行其他操作
默认为:异步
Linux查看所有文件:ls
设置一个p在另一个p上:
z-index数值越大越往上
ob函数:
ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到涉猎器,而是保存在输出缓冲区里面。
ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。
ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。相当于履行 ob_get_contents() and ob_end_clean()
ob_flush(); //发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,不关闭缓冲区。
ob_end_flush(); //发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,关闭缓冲区。
ob_get_flush(); //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。
flush(); //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,整个输出至涉猎器;刷新内部缓冲区的内容,并输出。
ob_get_contents(); //返回缓冲区的内容,不输出。
ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
ob_get_level(); //Return the nestinglevel of theoutput buffering mechanism.
ob_get_status(); //Get status of outputbuffers.
3.购物车怎么做的?流程。。
一、将商品添加到购物车
1.先在页面上添加一个链接
1.先得到商品id
2.从数据库中通过id将商品查询出来。
3.将商品添加到购物车
a.从session中获取购物车,没有的话,重新new 出一个
b.判断商品在购物车中是否存在,如果不存在,数量为1,如果存在,数量在原基础上加1
c.将购物车重新装入到session中。
问题:我们的购物使用的是一个HashMap集合,key是唯一的,保证key唯一的方式是通过hashCode与equals方法
所以我们在使用时,需要将Product类的hashCode与equals方法重写,我们在重写时,只比较id值就可以。
二、显示购物车商品
我们的购物车是存在于session中的。我们只需要在cart.jsp页面将session中的cartt这个Map集合得到,并显示出来就可以。
1.对购物车中商品操作
2.在点击+或-号时可以修改购物车中商品的数量
3.当点击+或-按钮时,我们会调用一个javascript中的函数。changeCount();通过这个函数我们向服务器发送请求,在服务器端从session中获取购物车中数据,并根据提交的数据将购物车中指定的商品数量修改在返回到购物车页面展示。
最近一个月的销售额怎么取?三个月?一年呢?
查数据库某个字段
怎么在30万条数据3秒内取出来?建立什么索引?
普通索引
索引类型:
普通索引、唯一索引、主键索引、组合索引
redis和memecache的不同在于:
1、存储方式:
memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型:
redis在数据支持上要比memecache多的多。
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
SKU怎么做:
属性规格。
其实sku就是商品单数 库存量单位 包括商品表 商品属性表 货品表
tp的配置文件:common/config.php
php的数据类型:
四种标量类型:
boolean (布尔型)
integer (整型)
float (浮点型, 也称作 double)
string (字符串)
两种复合类型:
array(数组)
object(对象)
最后是两种特殊类型:
resource (资源)
NULL (NULL)
单例模式:
单例模式的主要特点是“三私一公”:
需要一个保存类的唯一实例的私有静态成员变量
构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义
克隆函数必须声明为私有的,防止对象被克隆
必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。
查询出20-30之间的男女个数:
//select count(sex) from 表where age between 20 and 30group by sex
Select count(*) from 表名where age between 20 and 30 group by age. Group by
PHP中有三种访问修饰符,分别是:
public(公共的、默认)
protected(受保护的)
private(私有的)
访问权限修饰符的范围:
当类的成员被声明为public的访问修饰符时,该成员能被外部代码访问和操作。
private(私有的)
被定义为private的成员,对于类内部所有成员都可见,没有访问限制。对类外部不允许访问。
protected(受保护的)
protected稍微有点复杂,被声明为protected的成员,只允许该类的子类进行访问。
mysql int存储:
bigint 存储大小为 8 个字节。
int存储大小为 4 个字节。
smallint存储大小为 2 个字节。
tinyint 从 0 到 255 的整型数据。存储大小为1 字节。
cookie的作用域:
domain本身。domain底下的所有域名。
就是给cookie设置一个权限。当domain设置为空时,domain默认为当前域名,并且该域名下的子域名都可以接收到cookie。
但是domain参数设置其 子域名时,所有域名就接收不到了,包括那个子域名。
linux查看日志文件内容命令
tail、cat、tac、head、echo
tail-f test.log
top查看内存
df-lh查看磁盘
ps-a 查看所有进程
常量:
变量使用$:
在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
接口(interface)中也可以定义常量。
抽象类不能被实例化。抽象类中可以有静态方法。抽象类中可以没有抽象方法。
普通方法,存放类内,只有一份
静态方法,也是存放于类内,只有一份
区别在于:
普通方法需要对象去调用,需要绑定$this 即,普通方法,必须要有对象,然后让对象来调用
而静态方法,不属于哪一个对象,因此不需要绑定$this 即,不需要对象也可以调用
静态成员:不需要实例化就能访问,类的静态成员变量只属于这个类
类成员:一种是在类中定义,一种是在构造函数中定义。
方法和函数的区别:
函数是单独存在的,方法是依赖于类存在的,只能通过对象调用。
类文件是否可以定义函数: 不可以
值传递和值引用:
(1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略
(2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
(3)优缺点:
A:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
B.按引用传递则不需要复制值,对于性能提高很有好处。
防止订单重复提交:
1.使用JS让按钮在点击一次后禁用(disable)。采用这种方法可以防止多次点击的发生
2.设置session值.提交一次后,删除,如果没有session值,不让提交.
3cookie一样
字符串函数:
strlen();strpos();echo();implode();trim();等、、、
字符串反转函数:
strrev, mb_string;
http1.0和http1.1的区别:
HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,
服务器不跟踪每个客户也不记录过去的请求。
HTTP1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
HTTP1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,
以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间
HTTP1.0不支持Host请求头字段。
H TTP1.1中增加Host请求头字段。
全局变量跟局部变量的区别:
1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等
2.内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
3.生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
4.使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量
需要注意一点的是,局部变量不能赋值为同名全局变量的值。
前端的优化:
第一:面向内容的优化
1.减少 HTTP 请求
2.减少 DNS 查找
3.避免重定向
4.使用 Ajax 缓存
5.延迟载入组件
6.预先载入组件
7.减少 DOM 元素数量
8.切分组件到多个域
9.最小化 iframe 的数量
10. 不要出现http 404 错误
第二:面向 Server
1.缩小 Cookie
2.针对 Web 组件使用域名无关性的
什么是缓存雪崩?
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)
tp路由模式:
1.普通模式 2. 重写模式 3.兼容模式
niginx端口号怎么配置:
在那个nginx.conf中配置两个serve,分别为不同的端口号。
jq获取table标签的第二行:
$(tr:eq(1))
可变变量是什么:
可变变量允许我们动态地改变一个变量的名称。是用一个变量的值作为另一个变量的名称。
查看端口有没有被占用: 修改权限 修改所有者 修改用户组
netstat –apn chmod chown chgrp
查看进程
Top pa aux|grep
所有人添加执行权限:
chmod-x
Mysql主从复制:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
主从复制需要的命令:
showmaster status;
startsalve;
stopsalve;
flushprivileges;
GRANTREPLICATIONSLAVE,RELOAD,SUPER ON *.*
TOmysql_backup@'%'
IDENTIFIEDBY '123456';
CHANGEMASTER TOmaster_host = '127.0.0.1',
master_user='mysql_backup',
master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos = 3696;
解决主键冲突问题
创建一个总表,id从总表里面分发。
主主复制:
1.分别在两台机器授权账户:grant replication slave, file, select on *.* to'repl'@'10.17.%'identified by ‘xxxx’
2.配置文件/etc/my.cnf,在使用主库配置文件的基础上,加入以下配置项
nginx反向代理:
(1)rr轮询(默认)
按照请求顺序分配到每个RS,和lvs中的rr算法一样,如果RS宕机,会自动剔除,默认情况下只检测80端口,如果RS报402、403、503、504错误,会直接返回给客户端。
(2)weight(权重)
在rr的基础上再加上权重(默认是rr+weight),权重轮询和访问成正比,值越大分配的越多,可以根据服务器的配置设置权重,可以解决服务器性能不均进行请求分配的问题
(3)ip_hash
解决动态网页session共享问题
每个访问请求按照IP地址的hash值进行分配,ip的hash值只要相同就会被分配到同一台服务器上(lvs负载均衡的-p参数,keepalived配置里的persistence_timeout50),该调度算法可以解决动态网页session共享问题,但有时会导致请求分配不均,
提示:由于国内用的都是nat模式,所以hash不适合使用
ip_hash不能和其他的算法一块使用,即不能使weight或backup
(4)fair(第三方)
按照后端服务器的响应时间来配置,响应时间短的优先分配,比上面的都更智能,此种算法可以按照页面大小和加载时间长短智能的进行负载均衡,nginx本身不支持fair,需要下载nginx的upstrea_fair模块
(5)url_hash(第三方)
主要应用于缓存服务器上
按照访问的url来分配请求,让相同的url定向到同一个服务器,后端服务器为缓存服务器的时候效果更显著,在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
缺点:如果有一台机器宕机了,那就苦了,consistent_hash可以解决这个问题
可以提高后端缓存服务器的效率,nginx本身不支持url_hash的,需要下载hash软件
(6)least_conn
最少连接数,哪个连接少就分配到哪台设备
(7)consistent_hash
一致性算法
3、负载均衡:
负载均衡部署方式:
路由模式(推荐)
桥接模式
服务直接返回模式
轮循均衡:
每一次来自网络的请求轮流分配给内部中的服务器,从1至N然后重新开始。此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。
权重轮循均衡:
根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如:服务器A的权值被设计成1,B的权值是3,C的权 值是6,则服务器A、B、C将分别接受到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。
随机均衡:
把来自网络的请求随机分配给内部中的多个服务器。
权重随机均衡:
此种均衡算法类似于权重轮循算法,不过在处理请求分担时是个随机选择的过程
4、负载均衡和反向代理的区别
反向代理是实现负载均衡的一种方法。
先谈反向代理。用户在请求时,先把请求发送给代理的服务器,然后由代理服务器根据算法去请求真实的服务器,最后返回给用户。这种做法,其 一是提高了安全性;
其二是通过多台的real server分担了用户的请求,实现了负载均衡。
再谈负载均衡。负载均衡的出现,是通过横向的扩展,尽可能地降低单台服务器的压力。常见WEB层面的负载均衡的方案有硬件F5、Nginx代理、LVS、各个云商的负载均衡服务(如AWS的ELB服务)等。负载均衡后面连的一般是实际提供服务的服务器,如通过ELB服务,可以做到流量的均匀分担,从而减少单机服务器的压力。
由于增加了负载均衡这层,所以单纯地使用某个方案还是要考虑单点的问题。负责由于负载均衡这个服务器未能承受住压力,宕机了,服务也是不可用的。所以Nginx、LVS尽量配置多台代理,可以故障转移和故障报警,从而及时去处理代理层服务器的问题。ELB是亚马逊提供的服务,它本身的实现底层就有数百甚至上千的机器,所以把它想象成一个代理集群就好。
怎么实现session共享:
首先我们应该明确,为什么要实现共享,假设你的站点是存放在一个机器上,那么是不存在这个问题的,由于会话数据就在这台机器,可是假设你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在client是没有问题的,可是假设用户的两次请求到了两台不同的机器,而它的session数据可能存在当中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题
1.基于NFS的Session共享
2.基于数据库的Session共享
3.基于Cookie的Session共享
4.基于缓存(Memcache)的Session共享
5.session复制
变量的作用域:
全局变量,局部变量。
创建压缩文件:
zip、gzip、bzip2、tar Zcvf;
varchar20能存多少汉字?
首先要确定mysql版本
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个
其实最好的办法是在自己数据库中建个表试试可以放多少汉字,现在mysql都5.0已上了,varchar(20)是可以存20个汉字的
做登录的时候用户名和密码怎么储存的:
一般我们用cookie将用户信息会储存在客户端,比如实现一个七天免登陆等。
我们在登录的时候先设置cookie的参数,将用户名和密码都储存起来,下次当跳转到下一个页面的时候,
我们可以先判断有没有cookie的值,如果有就直接跳转到下一个页面,如果没有那么就要提示请登录。
实现cookie的储存后,用户就能不用输入密码就可以登录成功了!
查看防火墙的命令(Centos7.0之前):
查看防火墙状态: service iptables status
开启防火墙:service iptables start
关闭防火墙:service iptables stop
聚簇索引和非聚簇索引:
1、聚簇索引
a)一个索引项直接对应实际数据记录的存储页,可谓“直达”
b)主键缺省使用它
c)索引项的排序和数据行的存储排序完全一致,利用这一点,想修改数据的存储顺序,可以通过改变主键的方法(撤销原有主键,另找也能满足主键要求的一个字段或一组字段,重建主键)
d)一个表只能有一个聚簇索引(理由:数据一旦存储,顺序只能有一种)
2、非聚簇索引
a)不能“直达”,可能链式地访问多级页表后,才能定位到数据页
b)一个表可以有多个非聚簇索引
单点登录:
一. 登陆原理说明
单点登录的技术实现机制:当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
可以看出,要实现SSO,需要以下主要的功能:
a)所有应用系统共享一个身份认证系统;
b)所有应用系统能够识别和提取ticket信息;
c)应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能
基于以上基本原则,本人用php语言设计了一套单点登录系统的程序,目前已投入正式生成服务器运行。本系统程序,将ticket信息以全系统唯一的 session id作为媒介,从而获取当前在线用户的全站信息(登陆状态信息及其他需要处理的用户全站信息)。
登陆流程:
1. 第一次登陆某个站:
a)用户输入用户名+密码,向用户验证中心发送登录请求
b)当前登录站点,通过webservice请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则生成ticket,用于标识当前会话的用户,并将当前登陆子站的站点标识符记录到用户中心,最后
c)将获取的用户数据和ticket返回给子站。如果验证不通过,则返回相应的错误状态码。
d)根据上一步的webservice请求返回的结果,当前子站对用户进行登陆处理:如状态码表示成功的话,则当前站点通过本站cookie保存ticket,并本站记录用户的登录状态。状态码表示失败的话,则给用户相应的登录失败提示。
2. 登陆状态下,用户转到另一子:
a)通过本站cookie或session验证用户的登录状态:如验证通过,进入正常本站处理程序;否则户中心验证用户的登录状态(发送ticket到用户验证中心),如验证通过,则对返回的用户信息进行本地的登录处理,否则表明用户未登录。
登出流程:
a)当前登出站清除用户本站的登录状态和 本地保存的用户全站唯一的随机id
b)通过webservice接口,清除全站记录的全站唯一的随机id。webservice接口会返回,登出其他已登录子站的javascript代码,本站输出此代码。
c)js代码访问相应站W3C标准的登出脚本
类常量如何定义:
Const
什么是抽象方法:
没有方法体的方法就是抽象方法,用关键字abstract来修饰.
ajax的数据类型,参数:
1.json 2.jsonp 3.xml 4.html
三级联动:
子类调用父类ID 递归
解决主键冲突 配置文件命令
#auto_increment_offset =1
#auto_increment_increment=2
5.为什么使用会话控制
http协议是一个无状态的协议通过session ID来标识用户
6.协议有哪些
httpHTTPS ip
7 HTTP协议是什么
超文本传输协议
8. XML和HTML是什么;
XML是可扩展标记语言
HTML是超文本标记语言
9、jsonp是什么
进行跨域请求的一种方式利用了<script>元素的开放策略通过get请求来进行跨域请求
10.yii框架小部件
小部件基本上在views中使用,在视图中可调用 yii\base\Widget::widget() 方法使用小部件。
11.tp框架配置文件
common/config.php
12.tp框架的单字母方法
C获取配置值
D实例化Model类
L语言定义函数
I获取输入参数
M用于实例化一个没有模型文件的Model
...
13.回调函数
array_map、array_walk、 array_reduce
子类调用父类静态方法
parent::$a
php报错级别:
fatalerror致命错误: 0000 0000 0000 001 开启 1
warning警告错误 : 0000 0000 0000 010 开启 2
NOTICE警告 : 0000 0000 0001 000 开启 8
while do while 区别:
while是先判断再执行
dowhile 是先执行再判断;
常用的魔术方法:
__desctruct();__get();__set();__isset()
构造方法
实例化程序时自动调用 __construct():
析构方法,程序结束时自动调用 __destrcut():
魔术常量:
function class file line method namespace
子查询:
(把内层查询结果当作外层查询的比较条件)
#不用order by 来查询最新的商品
selectgoods_id,goods_name from goods where goods_id = (select max(goods_id)fromgoods);
MySAM InnoDB 区别:
innodb写操作快、支持事务、数据行锁、支持外键,但是不支持全文索引, InnoDB的主键范围更大,最大是MyISAM的2倍。
MyISAM不支持事务和外键,读操作快、支持数据锁表、 GIS数据 、全文索引(因为它不支持中文分词,所以MyISAM的全文索引其实没啥用)。
session和cookie的区别:
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session
接口和抽象类有什么区别:
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
for循环和foreach循环哪个快?
foreach循环数组时,指针会自动指向下一个元素,不需要计算数组长度,没有条件判断和自增变量,所以性能肯定要比for高。
删除表中20-30岁间,男性的所有的数据:
Deleteform 表名 where sex =0 and age between 20 and 30;
静态化和伪静态的区别和好处?
静态化的网页一般以.html或者htm结尾,地址对应的是一个文件,这个文件实实在在的存在于网站服务器的某个目录中。
好处: 1.当访问者访问网页的时候,不读取数据库,直接访问网站空间对应的文件。(直接读取文件)
2.纯静态的网页对搜索引擎友好,是最容易被搜索引擎所收录的。(易收录)
3.由于访问网页的时候,不需要服务器做过多的处理,对服务器的压力最小,所以,更容易应对高访问量。(节省服务器压力)
4.一些面对数据库的攻击比如SQL注入攻击,在面对静态网页的时候常常难以从地址入手。(安全性高)
伪静态实质上还是动态的,在数据的处理过程上和动态的一样。
好处:在网址的形式上看,伪静态的地址和静态的可以一摸一样,普通的访问者不容易分出是真静态还是伪静态(易收录)
支付宝同步回调和异步回调:
当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。很多新手会拿这个结果当作支付成功了,那就会被坑死,结果就是支付成功率特别高,伴随着一堆无法解释的坏账率,测试人员尤其要注意测试数据的篡改:金额,同步返回结果,订单号等。
同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用。一般同步接口仅检查参数是否正确,签名是否无误等。异步接口才告诉你扣款结果。一般异步接口有5秒以内的延迟。调用不成功会重试。有时候是这边成功了,但支付渠道侧没收到返回,于是会继续调。当天的支付到第二天还在 被异步调用也都是正常的。这也是开发人员需要特别注意的地方,不要当做重复支付。测试人员也要对重复回调进行测试,应只有一次有效。这还不是最坑的,一般支付渠道侧,只有支付成功了才通知你。要是支付失败了,压根儿都不告诉你。 另一方面,如何老收不到异步结果呢?那就得查查了。同步结果不可靠,异步调用不可靠,那怎么确定支付结果?最终的杀招就是查单了,反查,一般支付渠道侧都会提供反查接口,定时获取DB中待支付的订单调用支付渠道侧的反查接口,最终把支付渠道侧扣款成功的订单完成掉。
以上就是PHP面试题的小结的详细内容,更多请关注其它相关文章!
上一篇: php 获取数据库最大的id几种方法
下一篇: php 实例方法总结