1、varchar和char的区别
-
定长和变长
char 长度固定,如果插入的长度小于定义长度时,则用空格填充;
varchar长度可变,小于定义长度时,还是按实际长度存储。因为char长度固定,所以存取速度要比varchar快得多,但是char因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。
-
存储的容量不同
varchar(M)和char(M),M都表示字符数,varchar的最大长度为65535个字符,不同的编码所对应的最大可存储的字符数不同,char最多可以存放255个字符
2、对于大流量的网站,采用什么样的方法来解决访问量问题
- 确认服务器硬件是否足够支持当前的流量
- 优化数据库访问
- 防盗链处理(去除恶意请求)
- 控制大文件的下载
- 使用流量分析统计软件
- 尽量使用静态页,缓存
- 图片服务器分离
- 减少HTTP请求[将css,js等合并]
- 添加异步请求(先不将所有数据都展示给用户,用户触发某个事件,才会异步请求数据)
- 启用浏览器缓存和文件压缩
- 数据库缓存
- nginx反向代理实现负载均衡
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数据库的方法
- 数据表中的数据类型的优化 如选择合适的字段,选择效率快速的字段
- 索引优化
- SQL语句的优化,结果一样的情况下,采用效率高,速度快节省资源的sql语句执行
- 采用合适的存储引擎,采用三范式,适当的采用逆范式
- 数据表结构的设计优化
10、PHP7的新特性
- PHP 标量类型与返回值类型声明
- PHP NULL 合并运算符
-
PHP 太空船运算符(组合比较符) <=> 如果
b时,它分别返回-1、0或1。
- PHP 常量数组
- PHP 匿名类
- PHP Closure::call()
- PHP 7 use 语句 use some\namespace{ClassA, ClassB, ClassC as C};
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、负载均衡
- HTTP重定向实现负载均衡
- DNS负载均衡
- 反向代理负载均衡
参考文章:高并发解决方案-负载均衡
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中存了子进程的状态信息。
框架对比
-
ThinkPHP 5 是一个为API开发而设计的高性能框架,采用全新的架构思想,引入了很多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化。
规范:遵循PSR-2、PSR-4规范,Composer及单元测试支持;
严谨:异常严谨的错误检测和安全机制,详细的日志信息;
灵活:减少核心依赖,扩展更灵活、方便,支持命令行指令扩展;
API友好:出色的性能和REST支持、远程调试,更好的支持API开发;
高效:惰性加载,及路由、配置和自动加载的缓存机制;
ORM:重构的数据库、模型及关联,MongoDb支持; -
Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用。 因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用, 如门户网站、社区、内容管理系统(CMS)、 电子商务项目和 RESTful Web 服务等。
-
laravel框架的设计思想比较先进,非常适合应用各种开发模式,作为一个框架,它为你准备好了一切。
laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖注入等。
强大的rest router:用简单的回调函数就可以调用,快速绑定controller和router
artisan:命令行工具,很多手动的工作都自动化
可继承的模板,简化view的开发和管理
blade模板:渲染速度更快
ORM操作数据库
migration管理数据库和版本控制
composer也是亮点
测试功能也很强大 -
CodeIgniter 是一个小巧但功能强大的 PHP 框架,特点:简单、小巧、出色的性能、安全、几乎0配置
19、http状态码
-
1×× Informational
-
100 Continue
-
101 Switching Protocols
-
102 Processing
-
2×× Success
-
200 OK
-
201 Created
-
202 Accepted
-
203 Non-authoritative Information
-
204 No Content
-
205 Reset Content
-
206 Partial Content
-
207 Multi-Status
-
208 Already Reported
-
226 IM Used
-
3×× Redirection
-
300 Multiple Choices
-
301 Moved Permanently 被请求的资源已经被永久性地转移了位置
-
302 Found 请求的资源现在需要临时通过其他的 URI 来获取
-
303 See Other
-
304 Not Modified
-
305 Use Proxy 使用代理
-
307 Temporary Redirect 临时跳转。被请求的资源在临时从不同的URL响应请求
-
308 Permanent Redirect
-
4×× Client Error
-
400 Bad Request
-
401 Unauthorized
-
402 Payment Required
-
403 Forbidden
-
404 Not Found
-
405 Method Not Allowed
-
406 Not Acceptable
-
407 Proxy Authentication Required
-
408 Request Timeout
-
409 Conflict
-
410 Gone
-
411 Length Required
-
412 Precondition Failed
-
413 Payload Too Large
-
414 Request-URI Too Long
-
415 Unsupported Media Type
-
416 Requested Range Not Satisfiable
-
417 Expectation Failed
-
418 I'm a teapot
-
421 Misdirected Request
-
422 Unprocessable Entity
-
423 Locked
-
424 Failed Dependency
-
426 Upgrade Required
-
428 Precondition Required
-
429 Too Many Requests
-
431 Request Header Fields Too Large
-
444 Connection Closed Without Response
-
451 Unavailable For Legal Reasons
-
499 Client Closed Request
-
5×× Server Error
-
500 Internal Server Error
-
501 Not Implemented
-
502 Bad Gateway
-
503 Service Unavailable
-
504 Gateway Timeout
-
505 HTTP Version Not Supported
-
506 Variant Also Negotiates
-
507 Insufficient Storage
-
508 Loop Detected
-
510 Not Extended
-
511 Network Authentication Required
-
599 Network Connect Timeout Error
加我微信公众号【皮蛋馅儿】,一起学习哦~
网友评论