-
cookie和session的区别和联系
区别:cookie存在于浏览器中,可存放内容较少,易被篡改,用户可以禁用cookie;session存在于服务器中,可以文件,数据库,缓存的形式存在。联系:sessionId存放于cookie中,所以禁用cookie,session也不能使用了,但可以通过重写url的方式传递cookie
-
clone的特性和表现
protect $name = 'abc';
/**
* clone的特性
*/
public function clone(){
$a = new self();
$b = $a;//指向同一地址
$c = &$a;//指向同一地址
$d = clone $a;//创建新地址
$b->name = '123 ';
echo $a->name . $b->name . $c->name . $d->name;
//输出123 123 123 abc
//结论,赋值对象和引用一样,都指向同一地址,clone只能用于对象
}
-
PHP的自动加载__autoload和spl_autoload_register
自动加载不是指实例化时,就把所有第三方扩展类都全部加载;而是按需加载,即当实例化一个类时,该类未引入,则执行__autoload()方法,所以我们要做的则是在autoload()方法写内引入类代码即可。
function __autoload($className){
echo '自动加载了';
require 'WxCrawler.php';
}
$obj = new WxCrawler();
$obj->test();//输出123
最终结果:
但__autoload有一个致命性问题,只能调用一次,因此PHP多了个新解决方案:spl_autoload_register
spl_autoload_register的特性是,会覆盖掉__autoload方法,并且可以多次注册
function __autoload($className){
echo '自动加载了';
require $className.'.php';
}
function autoload($className){
echo ' 自动加载';
$fileName = $className.'.php';
if(file_exists($fileName)) {
require $fileName;
echo $className;
}
$fileName = $className.'.class.php';
if(file_exists($fileName)){
require $fileName;
echo $className;
}
}
spl_autoload_register('autoload');
$obj = new WxCrawler();
$obj = new Snoopy();
最终结果为:自动加载WxCrawler 自动加载Snoopy
-
self和static的区别
self会指向创建方法的类,而static则会指向实例化的类
class A{
function test1(){
echo self::class;
}
function test2(){
echo static::class;
}
}
class B extends A{
}
$obj = new B();
$obj->test1();//输出A
$obj->test2();//输出B
-
消息队列的使用场景
1、异步处理 ;2、应用解耦;3、流量削峰;4、日志处理;5、消息通讯
应用解耦中,假如分别有订单系统和库存系统,一般的流程是,用户下单后,订单系统调用库存系统接口,但如果库存系统故障,那么订单系统也会一起失败,两个应用之间是耦合的。但如果变成用户下单后,订单系统把消息写入消息队列,库存系统订阅消息,进行处理,订单系统就不需要关心后续的步骤,达到两个系统解耦。
流量削峰,用于抢购时候出现的并发,防止服务器宕机,可让服务器接收到请求后存到消息队列中,并且队列作长度的限制,超过队列长度则直接提示失败(可控制排队人数),之后按队列处理业务,具体流程如下
-
正则知识
\w 小写w表示筛选的内容就是字母、数字、下划线范围中的任意一个;\W 与小写w相反。
\d表示数字(0-9)范围中的任意一个;\s ,表示一个空格
数量表达:
*:表示0个或多个 +:表示至少1个 ?:表示0个或1个
{2}表示2个 {1,}表示1个以上和'+'一样 {1,2}表示1个到2个
^表示开始的位置,$表示结束的位置,PHP中,要以 / 开头和结尾,不然会报错
邮箱正则 $guize = '/^\w+@\w+\.\w+$/';
-
一条查询sql的执行过程
1.查询缓存,命中缓存则返回结果,未命中则下一步。
2.分析器,分析语句的语法,表明,字段是否正确。
3.优化器,会生成多个查询方案,会选择系统代价最小方案的进行查询。
4.执行器,按照查询方案进行数据的查询。
-
mysql联表,要用小表驱动大表
原因:join的查询过程,是先把驱动表(小表)数据全部加载到内存,再用被驱动表(大表)逐行对比,最终形成结果集。
所以,如果用大表连小表,则会把海量数据加载到内存,不仅性能差,内存占用也多。
IN和EXISTS的用法也一样,也是要用小表驱动大表
select * from order
where user_id in (select id from user where status=1)
select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)
in是会优先执行子查询的,即右边的语句
而exists则会优先执行exists前的查询,即左边的语句
所以,当order表有10W数据,user表有100数据的时候,使用in的效率会更高