1. PHP支持多继承吗?
PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承
2. error_reporting()的作用?
设置 PHP 的报错级别并返回当前级别。
3. 常见的PHP安全性攻击?
1)SQL注入:使用mysql_real_escape_string()过滤数据类型;手动检查每一数据是否为正确的数据类型;使用预处理语句并且绑定参数,预处理语句将自动过滤;
2)XSS攻击(跨站点注入):对要显示的用户数据做转义处理,strip_tags(),htmlspecialchars()
3)CSRF(跨站点请求伪造):生成令牌,检测令牌有效性
4)session文件漏洞(利用SessionID获取用户信息)
5)注册机灌水:使用验证码防止
4. PHP数据排序?
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
ksort() - 根据关联数组的键,对数组进行升序排列
krsort() - 根据关联数组的键,对数组进行降序排列
5. PHP7的新特性?
1)PHP 标量类型与返回值类型声明;
2)NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式
3)太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1
4)PHP 常量数组:通过 define() 来定义
5)匿名类:支持通过 new class 来实例化一个匿名类
6)Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数
7)增加了可以为 unserialize() 提供过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据
8)CSPRNG(伪随机数产生器):random_bytes() - 随机生成字符串;random_int() - 随机生成整数;
9)使用一个 use 从同一个 namespace 中导入类、函数和常量
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
6. 如何处理负载,高并发?
1)动静分离:前后端分离、图片服务器分离,使用CDN存储和加速
2)系统拆分:将一个系统拆分成多个系统,可允许每个系统独立数据库
3)缓存:使用第三方缓存,增加缓存命中率,例如redis、memcached
4)MQ:消息队列,异步执行次要业务
5)Mysql优化:SQL语句优化,建立索引,主从复制、读写分离、分库分表
6)模糊搜索利用ES
7)使用负载均衡,反向代理
7. PHP的基本变量类型?
1)标量类型:字符串、整型、浮点型、布尔型
2)组合类型:数组、对象
3)特殊类型:资源、NULL
8. 语句include和require的区别是什么?语句include_once和include的区别是什么?
1)区别:include在引入不存文件时产生一个警告且脚本还会继续执行, require则会导致一个致命性错误且脚本停止执行。
2)include_once它会首先验证是否已包含该文件。如果已经包含,则不再执行include_once
9. 请说明PHP中传值与传引用的区别,什么时候传值什么时候传引用?
1)区别:按值传递:函数范围内对值的任何改变在函数外部都会被忽略,而按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改;
2)应用:占用内存大的变量使用传引用,对性能有所提升。
10. PHP字符串中单引号与双引号的区别?
1)转义的字符不同:/都可以转义,双引号可义更多
2)对变量的解析不同
3)解析速度不同
11. PHP的垃圾收集机制是怎样的?
php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。
12. 写几个魔术方法并说明作用?
1)__get( $property ) 当调用一个未定义的属性时,此方法会被触发
2)__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发
3)__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
4)_unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
5)__call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法
6)__clone() 对象的复制(引用赋值)
7)__toString 用于定义输出对象引用时调用
8)__construct 构造方法,当一个对象创建时调用此方法
9)__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。
13. ++i和i++哪一个效率更高?
++i更高, ++i返回对象的引用; i++总是要创建一个临时对象,在退出函数时还要销毁它
14. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
1)http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
2)SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。
15. HTTP 状态中302、403、 500代码含义?
一二三四五原则:(即一:消息系列;二:成功系列; 三:重定向系列;四:请求错误系列;五:服务器端错误系列。)
302:临时转移成功,请求的内容已转移到新位置
403:禁止访问
500:服务器内部错误
16. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?
int:整数;char:定长字符;Varchar:变长字符;Datetime:日期时间型;Text:文本型
区别:char是固定长度的字符类型,分配多少空间,就占用多长空间。Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低
17. MyISAM和 InnoDB 的基本区别?索引结构如何实现?
1)MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读取速度较快,适合用于频繁查询的应用;
2)InnoDB类型支持事务,行锁,有崩溃恢复能力,读取速度比MyISAM慢,适合于插入和更新操作比较多的应用,空间占用大,不支持全文索引等。
创建索引:alert table tablename add index 索引名 (`字段名`)
18. isset() 和 empty() 区别
isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假;empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真
19. 现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?
MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示
优点是:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
20. AJAX的优势是什么?
ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。
21. echo、print_r、print、var_dump区别
echo:语句结构;
print:是函数,有返回值
print_r:能打印数组,对象
var_dump:能打印对象数组,并且带数据类型
22. 写出smarty模板的特点
速度快,编译型,缓存技术,插件机制,强大的表现逻辑
23. 对json数据格式的理解?
JSON(javascript object Notation)是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递。
24. 什么是事务?及其特性?
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
隔离级别:未提交读、已提交读、可重复读、串行
事务特性:原子性、一致性、隔离性、持久性
25. 什么是锁?
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
基本锁类型:锁包括行级锁和表级锁
28、索引的作用?和它的优点缺点是什么?
1)索引是为了加速对表中数据行的检索而创建的一种分散的存储结构,相当于图书的目录;
2)类型:主键索引、唯一索引、普通索引、组合索引
3)优点:大大加快数据的检索、创建唯一性索引,保证数据表中每一行数据的唯一性;加速表和表之间的连接、减少查询中排序和分组的时间
4)缺点:索引需要占用物理空间、对表中数据增删改时,需要动态维护索引
5)少建索引:表记录太少;经常增删改、数据重复且分布平均;经常跟主字段一起查询
29. Mysql的主从复制原理:
master提交完事务后,写入binlog;slave连接master,请求获取binlog;master创建dump线程,推送binlog到slave;slave启动I/O线程获取binlog写入到中继日志;再启动SQL线程读取中继日志并执行同步;slave写入到自己的binlog
30. 主键、外键和索引的区别?
定义:主键 - 唯一标识一条记录,不能有重复的,不允许为空;外键 - 表的外键是另一表的主键, 外键可以有重复的, 可以是空值;索引 - 该字段没有重复值,但可以有一个空值
作用:主键 - 用来保证数据完整性;外键 - 用来和其他表建立联系用的;索引 - 是提高查询排序的速度
个数:主键 - 主键只能有一个;外键 - 一个表可以有多个外键;索引 - 一个表可以有多个唯一索引
31. 简述 private、 protected、 public修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
32. $this和self、parent这三个关键词分别代表什么?
$this 当前对象
self 当前类
parent 当前类的父类
33. 作用域操作符::如何使用?都在哪些场合下使用?
调用类常量 或者 调用静态方法
34. 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题。
A、确认服务器是否能支撑当前访问量;
B、优化数据库访问;
C、禁止外部访问链接(盗链), 比如图片防盗链;
D、控制文件下载,尤其是大文件;
E、使用不同主机分流(负载均衡);
F、使用浏览统计软件,了解访问量,有针对性的进行优化
35. 使用final修饰的类和方法代表什么意思?
final是在PHP5版本引入的,它修饰的类不允许被继承,它修饰的方法不允许被重写。
36. redis 集群主从同步的简单原理
1. Redis 的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就一定会有内存快照发生。
2. 当 Slave 启动并连接到 Master 之后,它将主动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个
3. Ping 命令来判断 Slave 的存活状态 当存活时 Master 会将数据文件发送给 Slave 并将所有写命令发送到 Slave )。
4. Slave 首先会将数据文件保存到本地 之后再将 数据 加载到内存中。
5. 当第一次链接 或者是 故障后 重新连接 都会先判断 Slave 的存活状态 在做全部数据的同步 , 之后只会同步 Master 的写操作 (将命令发送给 Slave)
37. SQL语言包括哪几部分?每部分都有哪些操作关键字?
SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵:Select ,insert,update,delete
数据控制:grant,revoke
数据查询:select
38. 什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
39. 什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。
40. 实现冒泡排序:
function mOrder($arr) { $count = count($arr); if ($count <= 1) { return $arr; } for ($h = 0; $h < $count - 1; $h++) { for ($i = 0; $i < $count - $h - 1; $i++) { if ($arr[$i] > $arr[$i + 1]) { list($arr[$i], $arr[$i + 1]) = array($arr[$i + 1], $arr[$i]); } } } return $arr; }
41. 获取文件的后缀:
function func1($file) { $arr = pathinfo($file); return $arr['extension']; } function func2($file) { return pathinfo($file, PATHINFO_EXTENSION); } function func3($file) { $arr = explode('.', $file); return end($arr); } function func4($file) { $arr = preg_split('/\./', $file); return end($arr); } function func5($file) { return substr($file, strrpos($file, '.') + 1); } function func6($file) { return substr(strrchr($file, '.'), 1); } function func7($file) { return str_replace('.', '', $strrchr($file, '.')); }
42. 遍历一个文件夹下的所有文件和子文件
function listDir($dir) { if (is_dir($dir)) { $files = array(); if ($handle = opendir($dir)) { while(($file = readdir($handle)) !== false) { if ($file != '.' || $file != '..') { $f = $dir . '/' . $file; if (is_dir($f)) { $files[$file] = listDir($f); } else { $files[] = $f; } } } } fclose($dir); return $files; } else { return $dir; } }
43. TP框架有哪些特性?
1)规范:遵循PSR-2、PSR-4规范,Composer及单元测试支持;
2)严谨:异常严谨的错误检测和安全机制,详细的日志信息;
3)灵活:减少核心依赖,扩展更灵活、方便,支持命令行指令扩展;
4)API友好:出色的性能和REST支持、远程调试,更好的支持API开发;
5)高效:惰性加载,及路由、配置和自动加载的缓存机制;
6)ORM:重构的数据库、模型及关联,MongoDb支持;
7)多语言支持:系统支持语言包功能;
44. Laravel框架有哪些特性?
1)artisan:命令行工具,很多手动的工作都自动化;
2)强大的rest router:用简单的回调函数就可以调佣,快速绑定controller和router;
3)可继承的模板,简化view的开发和管理;
4)composer安装工具包;
5)ORM操作数据库;
6)migration:管理数据库和版本控制;
7)单元测试功能也很强大;
8)blade模块:渲染速度更快;
9)Laravel框架引入了门面,依赖注入,LOC模式,Facade模式,以及各种各样的设计模式
45. PHP进程模型,进程通讯方式,进程线程区别?
PHP进程模型是一个正在执行的程序,可以分配给处理器并由处理器执行的一个实体;
PHP进程通讯方式有管道及有名管道,信号,共享内存等;
PHP进程线程的区别有进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元等
46. 举例说一下PHP7底层优化了哪些?
1)ZVAL结构体优化,占用由24字节降低为16字节;
2)内部类型zend_string,结构体成员变量采用char数组,不是用char*
3)PHP数组实现由hashtable变为zend array
4)函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令
47. 写出三个调用系统命令的函数?
system() / exec() / passthru()
48. 堆与栈的区别?
1)栈由系统自动分配,而堆是人为申请开辟;
2)栈获得的空间较小,而堆获得的空间较大;
3)栈由系统自动分配,速度较快,而堆一般速度比较慢;
4)栈是连续的空间,而堆是不连续的空间;
49. 请简述PHP常驻内存的方式cli与php-fpm运行模式的区别和优势?
常驻内存的好处就是对象不需要重复实例化,性能上会有一个显著的提升
50. 如果实现异步调用?
1)最简单的办法,就是在返回给客户端的HTML代码中,嵌入AJAX调用
2)popen():打开一个指向进程的管道
3)使用fsockopen()
51. OOP有哪些特点?
OOP有三大特征:封装,继承,多态
52. 请写一段PHP代码,确保多个进程同时写入同一件文件成功?
function writeFile($filepath, $data) { $fp = fopen($filepath, 'a'); do { usleep(100); } while (!flock($fp, LOCK_EX)); $res = fwrite($fp, $data . "\n"); flock($fp, LOCK_UN); fclose($fp); return $res; }
53. 打开PHP.ini中的safe_mode,会影响哪些函数?至少说出6个?
system() / exec() / passthru() / ckdir() / chown() / copy() / rmdir()
54. 接口安全方面是怎么处理的?
1)数据加密,防止报文明文传输;(https、前端做编码)
2)数据加密验签
3)token授权认证机制
4)时间戳timestamp+随机石,超时机制以及防止重放攻击
5)限流机制:令牌桶和漏桶算法
6)黑名单机制 / 白名单机制
7)数据脱敏掩码
8)数据参数一些合法检验;
55. 权限管理(RBAC)的实现?
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。
数据表:用户表,角色表,功能表,用户角色关联表,角色功能关联表
56. 502、504错误产生原因以及解决方式?
502一般跟网关服务有关(php-fpm),某些原因没有执行完毕就终止进程;(php-fpm,数据库)
504一般跟web服务有关(nginx关于网关的配置)
57. yield是什么,说个使用场景yield,yield核心原理是什么?
yield是生成器函数,它不会终止函数进行,而是暂时停止并返回当前值,之后继续执行函数
yield核心原理是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号,其语句只能出现在iterator块中,该块可用作方法、运算符或访问器的体。
58. MySQL、MySQLi、PDO区别?
都是php操作Mysql数据库的扩展;
连接进程上,MySQL非持继连接函数,而MySQLi是永远连接函数;
Mysqli有面向对象接口,prepared语句支持
PHP数据对象(PDO)是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口,可以无缝无缝切换数据库服务器
59. php在存储session以什么形式存在?
文件 、 内存 、数据库
60. 你是如何测试网站的性能的?
查看:1. 网络宽带 2. 服务器性能 3. 网站设计 4. DNS解析时间
指标:吞吐量、并发、响应时间、资源消耗
61. SQL的SELECT执行过程?
1. 关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...
2. SELECT语句的执行顺序
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
62. Mysql的大概架构
自上到下:连接层 ----> Server层 ----> 引擎层(InnoDB,MyISAM,Memory) ----> 文件系统层
MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。
63. 索引下推
索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理:例如组合索引,在存储引擎判断列是否满足条件。
查询计划的Extra 为 Using index condition
作用:索引下推(index condition pushdown,ICP),有效的减少了回表次数,提高了查询效率