1,PHP SPL(PHP标准库)
SPL是用于解决典型问题(standard problems)的一组接口与类的集合。
目前在使用中,SPL更多地被看作是一种使object(对象)模仿array(数组)行为的interfaces和classes。
spl数据结构:双向链表,堆栈,队列。
spl常用的迭代器:
SPL函数的使用:使用spl_autoload_register装载类, __autoload装载类,自定义__autoload函数装载类
2,file_get_contents():将整个文件读入一个字符串.
3,array_diff():比较两个数组的键值,并返回差集
4,apache 和 nginx 区别:
nginx 相对 apache 的优点:轻量级,同样起web 服务,比apache 占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊。
apache 相对nginx 的优点:
rewrite ,比nginx 的rewrite 强大模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多超稳定。
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程。
5,PHP 有多线程么?--没有。但是可以通过其他方式实现,函数popen()打开进程, pclose($file)关闭。
6,怎样理解 PHP 对于静态页面文件,是放在 ngnix 端,还是 Server 端?
ngnix 处理静态页面性能比 apache 要快三倍以上,所以直接放在 ngnix
PHP 魔术方法有哪些,作用是什么
__construct()
构造函数是目前为止最经常使用的函数。在创建对象时,可以在构造函数中做 一些初始化工作。可以为构造函数定义任意多个参数,只要在实例化时传入对应个数的参数 即可。构造函数中出现的任何异常都会阻止对象的创建。
__desctruct()
析构函数通常在对象被销毁时调用,析构函数不接收任何参数。经常在析构函数 中执行一些清理工作,比如关闭数据库连接等。
__get()
在我们尝试访问一个不存在的属性时会被调用。它接收一个参数,该参数表 示访问属性的名字,并且将该属性的值返回。
__set()
魔术方法在我们尝试修改一个不可访问的属性时会被调用,它接收两个参数,一个表 示属性的名字,一个表示属性的值。
__isset()
魔术方法在对一个不可访问的属性调用 isset()方法时会被调用,它接收一个参数, 表示属性的名字。它应该返回一个布尔值,用来表示该属性是否存在。
__unset()
魔术方法在调用 unset()函数销毁一个不能访问的属性时会被调用,它接收一个参数, 表述属性的名字。
__toString()
在我们将对象当作字符串一样使用时会被调用,它不接收任何参数。该方法允许 我们定义对象的表现形式。
__clone()
魔术方法__clone()可以解决上面的问题。当对一个对象使用 clone 关键字时,该魔 术方法会被调用。
__sleep()
魔术方法__sleep()在对一个对象序列化时(调用 serialize())会被调用。它不 接收任何参数,而且应该返回一个包含所有应该被序列化的属性的数组。在该魔 术方法中,也可以执行一些其他操作。 有一点要注意的是,不要再该函数中进行任何的析构操作,因为这可能会影响正 在运行的对象。
__wakeup()
魔术方法__wakeup()在对存储的对象反序列化时会被调用。它不接收任何参数,也没有任何 返回值。可以用它来处理在序列化时丢失的数据库连接或资源。
__call()
魔术方法__call()在调用不存在或不可访问的方法时会被调用。它接收两个参数,一个是调用 的方法的名字,一个是包含函数参数的数组。我们可以使用这种方法调用子对象中得同名函 数。
callStatic()
静态访问的时候会访问它
魔术方法__call()在调用不存在或不可访问的方法时会被调用。它接收两个参数,一个是调用 的方法的名字,一个是包含函数参数的数组。我们可以使用这种方法调用子对象中得同名函 数。
用过哪些数组函数?
array_values($arr); 获得数组的值
array_keys($arr); 获得数组的键名
array_flip($arr);//数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
array_search('PHP',$arr); //检索给定的值,加 true 则是严格类型检查
array_reverse($arr); //将数组中的元素翻转(前后顺序)
in_array("apple",$arr); //在数组中检索apple
array_key_exists("apple", $arr); // 检索给定的键名是否存在数组中
array_count_values($arr); // 统计数组中所有值出现的次数
array_unique($arr); 移除数组中重复的值
说一下快速排序的最好和最坏时间复杂度 (nlogn n 的平方) 。
快速排序是对冒泡排序的优化说以最好时间复杂度为 nlogn,最坏为 n 的平方 。
简述快速排序的原理 面试前最好先熟悉一下常用算法和数据结构,另外不可忽略了时间复 杂度。
二分查找的原理和时间复杂度? (logn) 时间复杂度第一次回答错了。
数据库中的索引有哪些,数据库引擎区别(MyIsam 和 InnoDB)
InnoDB 不支持 FULL TEXT(全文索引) 类型的索引。
InnoDB 中不保存表的具体行数,也就是说,执行 select count() from table 时,InnoDB 要扫一遍整个
表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count()语句包含
where 条件时,两种表的操作是一样的。对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引。InnoDB表自增id 清空表后id数会继续接着往下自增,mysql重启之后会归1,而MyISAM却不会。
DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除。
LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM
表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。
队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间
时序攻击
在 php 中比较字符串相等时如果使用双等 == 可能会有时序攻击的危险.
比如比较
"abscdd" == $request->code
那么两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就可以按位破解。
而使用 hash_equals 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。
hash_equals('abscdd',$request->code)