php

PHP面试题

2019-12-11  本文已影响0人  皮蛋馅儿

1、varchar和char的区别

2、对于大流量的网站,采用什么样的方法来解决访问量问题

3、SESSION 与 COOKIE的区别
SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。禁用cookie后,session还可以使用,在存储session的文件中,生成sessionID,通过get传参的方式将sessionID传到要实现session共享的页面,读取sessionID,从而从session中获取数据。

4、get 和 post 的区别
get是显式的,数据从url中可以看到,传输的数据量小,安全性低; post是隐式的,传送的数据量较大,安全性较高

5、include 和 require 的区别
require是无条件包含,也就是无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行

include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在,那么会提示一个错误,但是程序会继续执行下去

6、redis 和 memcache 的区别
都是非关系型数据库,性能都非常高

从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。

从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。

7、单引号 和 双引号 的区别
单引号内部的变量不会执行, 双引号会执行
单引号解析速度比双引号快。
单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。

8、PHP的基本变量类型
四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)
两种复合类型:array (数组)、object (对象)
两种特殊类型:resource(资源)、NULL(NULL)

9、优化mysql数据库的方法

10、PHP7的新特性

11、修改session的生存时间
在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间

代码实现

$lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();

12、常见的 PHP 安全性攻击
SQL注入:利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止:使用mysql_real_escape_string()过滤数据;手动检查每一数据是否为正确的数据类型;使用预处理语句并绑定变量

XSS攻击:跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()、htmlspecialchars()函数过滤再输出到浏览器。

CSRF:跨站点请求伪造,是指一个页面发出的请求,看起来就像是网站的信任用户,但是是伪造的
防止:token,生成一个一次性令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。还有验证码等

代码注入:代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名。
防止:过滤用户输入;在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件

13、保证促销商品不会超卖
使用了redis的队列来实现。将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖。这个操作起来很方便,而且效率极高。

14、商城秒杀的实现
秒杀的核心问题是在大并发的情况下不会超出库存的购买,具体实现见Redis队列实现商城秒杀

15、负载均衡

参考文章:高并发解决方案-负载均衡

16、悲观锁和乐观锁
悲观锁:通常所说的“一锁二查三更新”即指的是使用悲观锁。需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。不同的数据库对select for update的实现和支持都是有所区别的,select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

乐观锁:在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号或者时间戳

1. SELECT data AS old_data, version AS old_version FROM …;
2. 根据获取的数据进行业务操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
    // 乐观锁获取成功,操作完成
} else {
    // 乐观锁获取失败,回滚并重试
}

17、数据库事务
事务是指作为单个逻辑工作单元执行的一系列操作,可以被看作一个单元的一系列SQL语句的集合。要么完全地执行,要么完全地不执行。
如果不进行并发控制,可能会产生脏读、非重复读、幻像读、丢失修改的异常情况。
事务的特性(ACID):
A、atomacity 原子性(所有过程要么都执行,要么都不执行。如果异常了那么回滚)
C、consistency 一致性(例如转账前转账后的总额度不变)
I、isolation 隔离性(只要事务还没有提交,数据都不会有变化)
D、durability 持久性(事务提交,一定发生变化)

18、PHP多进程核心函数
pcntl_fork(创建子进程)、pcntl_wait(阻塞当前进程)

pcntl_fork:
一次调用两次返回,在父进程中返回子进程pid,在子进程中返回0,出错返回-1。

pcntl_wait ( int &$status [, int $options ] ):
阻塞当前进程,直到任意一个子进程退出或收到一个结束当前进程的信号,注意是结束当前进程的信号,子进程结束发送的SIGCHLD不算。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用
阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。

pcntl_waitpid ( int $pid , int &$status [, int $options ] )
功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait 一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息。

框架对比

19、http状态码

加我微信公众号【皮蛋馅儿】,一起学习哦~

上一篇 下一篇

猜你喜欢

热点阅读