百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> PHP面试踩过的坑
分享文章到:

PHP面试踩过的坑

发布时间:09/01 来源:未知 浏览: 关键词:

相关引荐:《2019年PHP面试题大汇总(珍藏)》

由于比来需要面试,所以特地整理了一下面试所经历的一些面试题。分享一下,但愿对本人有用,也对其别人有用。尚未有答案的,后面会连续更新,假如有补充答案的,也十分感谢。

1.get,post的不同

**显示有不同 **
get办法是将字符串拼接在地址栏后面可以看见 
而post办法看不见

**传递的大小有不同 **
详细大小和阅读器有关系,ie阅读器是2k其他阅读器的最大值大概不一样,但是也比力小。 
而post办法传递参数的大小是可以设定的,本来是认为无穷大。在Php傍边在php.ini文件是可以设定参数的大小的。

**平安性 **
get办法平安性比力低由于显露在外面而post办法平安性比力高

**提交的道理 **
get办法提交的数据都是独立的。 
而Post办法将所有的提交的数据变成一个团体(将提交的数据变成xml格局)

**灵敏性**
get办法很灵敏, 
post办法不灵敏,必需要有表单的参与才能用post提交很不利便

2.require,include不同

 require是无前提包括也就是假如一个流程里参加require,不管前提成立与否都会先施行require
 include有返回值,而require没有(大概由于如此require的速度比include快)
 包括文件不存在或者语法错误的时候require是致命的错误终止施行,include不是

3.猎取URL后缀名

pathinfo()解析文件途径,返回其组成部分;
返回关联数组
dirname    文件途径
basename   文件名+扩展名
extension   最后一个扩展名
filename   文件名
eg: print_r( pathinfo('/ab/cd/e.php') );
Array(
  [dirname] => /ab/cd
  [basename] => e.php
  [extension] => php
  [filename] => e
)
扩展:
打印解析途径    var_dump( pathinfo($path) );
打印途径的父级途径    var_dump( pathinfo($path, PATHINFO_DIRNAME) );
打印途径的尾名    var_dump( pathinfo($path, PATHINFO_BASENAME) );
打印途径的最后的扩展名   var_dump( pathinfo($path, PATHINFO_EXTENSION) );
打印途径的文件的名字   var_dump( pathinfo($path, PATHINFO_FILENAME) );

4.tcp,udp,http不同

参照 链接:https://blog.csdn.net/qq_31332467/article/details/79217262

5.猎取上级名目的办法

echo __FILE__ ; // 猎取当前所在文件的绝对途径及地址,结果:D:\aaa\my.php 
echo dirname(__FILE__); // 取得当前文件所在的绝对名目,结果:D:\aaa\ 
echo dirname(dirname(__FILE__)); //取得当前文件的上一层名目名,结果:D:\

6.数据库主从复制,读写别离

* 什么是主从复制
主从复制,是用来创立一个和主数据库完全一样的数据库环境,称为从数据库;

* 主从复制的道理:
1.数据库有个bin-log二进制文件,记载了所有的sql语句。
2.只需要把主数据库的bin-log文件中的sql语句复制。
3.让其从数据的relay-log重做日志文件中在施行一次这些sql语句即可。

* 主从复制的作用
1.做数据的热备份,作为后备数据库,主数据库效劳器故障后,可切换到从数据库连续工作,幸免数据丧失。
2.架构的扩展。业务量越来越大,I/O拜访频率过高,单机没法知足,此时做多库的储备,落低磁盘I/O拜访频率,提高单机的I/O机能
3.主从复制是读写别离的根基,使数据库能制成更大 的并发。例如子报表中,由于摆设报表的sql语句十分慢,致使锁表,影响前台的效劳。假如前台效劳使用master,报表使用slave,那么报表sql将不会造成前台所,包管了前台的拜访速度。

* 主从复制的几种方式:
1.同步复制:所谓的同步复制,意思是master的转变,必需等候slave-1,slave-2,...,slave-n完成后才能返回。
2.异步复制:犹如AJAX恳求一样。master只需要完成本人的数据库操纵即可。至于slaves可否收到二进制日志,可否完成操纵,不消关怀。MYSQL的默许设定。
3.半同步复制:master只包管slaves中的一个操纵成功,就返回,其他slave不管。
这个功效,是由google为MYSQL引入的。

* 关于读写别离
在完成主从复制时,由于slave是需要同步master的。所以关于insert/delete/update这些更新数据库的操纵,应当在master中完成。而select的查询操纵,则落下到slave中。

7.数据库索引

**什么是索引**
索引是对数据库表中一列或多列的值停止排序的一种构造,使用索引可快速拜访数据库表中的特定信息。(摘自baidu百科)

**索引类型**
1.FULLTEXT 全文索引
    全文索引,仅MyISAM引擎支撑。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不外当前只要 CHAR、VARCHAR ,TEXT 列上可以创立全文索引。
2.HASH 哈希索引
    HASH索引的独一性及相似键值对的情势十分适合作为索引,HASH索引可以一次定位,不需要像树形索引那样逐层参照,因此具有极高的效力。但是这种高效是有前提的。即只在“=”和“in”前提下高效,关于范畴查询,排序及组合索引依然效力不高。
3.BTREE 树形索引
    BTREE所以是一种将索引按必然算法,存入一个树形的数据构造中(二叉树),每次查询都是从树的入口root开端,一次遍历node,猎取leaf。这是MySQL中默许也是最常用的索引类型。
4.RTREE
    RTREE在MySQL中很少使用,仅支撑geometry数据类型,支撑该储备引擎只要MyISAM、BDb、InnoDb、NDb、Archive几种。相关于BTREE,RTREE的优势在于范畴查寻。

**索引品种**
一般索引:仅加快查询
独一索引:加快查询+列值独一(可以有null)
主键索引:加快查询+列值独一(不成以有null)+表中只要一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效力大于索引合并
全文索引:对文本内容停止分词,停止搜索
外键索引:与主键索引构成联络,包管数据的完全性。

**索引使用的留意事项**
1.相符索引遵照前缀原则
2.like查询%不克不及再前,不然索引失效。如有需要,使用全文索引
3.column is null可以使用索引
4.假如MySQL估量使用索引比全表扫描慢,则舍弃使用索引
5.假如or前的前提中列有索引,后面的没有,索引不会生效。
6.列类型是字符串,查询时,必然要给值加引号,不然索引失效。
7.肯定order by 和 group by 中只要一个表的列,这样才能使用索引

8.高并发的解决方案

web效劳器优化 :负载平衡 
流量优化:防盗链处置 将歹意恳求屏蔽,
前端优化:减少http恳求、增加异步恳求、启用阅读器缓存和文件紧缩、cdn加快、创立独立的图片效劳器、
效劳端优化:  页面静态化、并发处置、队列处置、
数据库优化: 数据库缓存、分库分表、分区操纵 、读写别离、负载平衡

9.MVC的懂得

1、Model(业务模型):利用程序中用于处置利用程序数据逻辑的部分,平常模型对象负责在数据库中存取数据。          
2、view(视图):利用程序中处置数据显示的部分。平常视图是根据模型数据创立的。
3、controller(操纵器):利用程序中处置会员交互的部分。平常操纵器负责从视图读取数据,操纵会员输入,并向模型发送数据。

10.常用的文件操纵函数

**1. 获得文件名:**
basename — 返回途径中的文件名部分

$path = "/home/cate/index/index2.php";\
$file = basename($path);\
echo $file; //结果index2.php

**2. 获得名目名**
dirname — 返回途径中的名目部分

$path = "/home/cate/index/index2.php";\
$file = dirname($path);\
echo $file;//结果/home/cate/index

**3.得到途径关联数组**
pathinfo() 函数以数组的情势返回关于文件途径的信息。
返回的数组元素如下:
-   [dirname]: 名目途径
-   [basename]: 文件名
-   [extension]: 文件后缀名
-   [filename]: 不包括后缀的文件名
pathinfo(path,options)
| path | 必需。规定要检查的途径。 |
| options | 可选。规定要返回的数组元素。默许是 all。

大概的值:

-   PATHINFO_DIRNAME - 只返回 dirname
-   PATHINFO_BASENAME - 只返回 basename
-   PATHINFO_EXTENSION - 只返回 extension
-   PATHINFO_FILENAME - 只返回 filename

 |
 **4.filesize取得文件大小**
filesize ( string $filename )
返回文件大小的字节数,假如出错返回  **FALSE** 并生成一条  **E_WARNING** 级的错误。

 **推断名目可否存在**
 $lujing = "./nihao/wohao";
 if(!is_dir($liujing)){ 
     mkdir(iconv("UTF-8", "GBK", $lujing),0777,true);
 }

 **推断文件可否存在**
 file_exists(path);

11.常见的排序算法

1. 冒泡排序
思绪剖析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数顺次停止比力和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比力后发明它们的排序与排序要求相反时,就将它们互换。

代码实现:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层轮回操纵 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层轮回用来操纵每轮 冒出一个数 需要比力的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

2. 选中排序 
思绪剖析:在要排序的一组数中,选出最小的一个数与第一个位置的数交流。然后在剩下的数傍边再寻最小的与第二个位置的数交流,如此轮回到倒数第二个数和最后一个数比力为止。

代码实现:
function selectSort($arr) {
//双重轮回完成,外层操纵轮数,内层操纵比力次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;

        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比力,发明更小的,记载下最小值的位置;并且鄙人次比力时采纳已知的最小值停止比力。
                $p = $j;
            }
        }
        //已经肯定了当前的最小值的位置,留存到$p中。假如发明最小值的位置与当前假设的位置$i不一样,则位置互换即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回终究结果
    return $arr;
}

3.插入排序
思绪剖析:在要排序的一组数中,假设前面的数已经是排好次序的,此刻要把第n个数插到前面的有序数中,使得这n个数也是排好次序的。如此重复轮回,直到全部排好次序。

代码实现:
function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //内层轮回操纵,比力并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发明插入的元素要小,交流位置,将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //假如碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比力了。
                break;
            }
        }
    }
    return $arr;
}

4.快速排序  
思绪剖析:选中一个基准元素,平常选中第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的准确位置,然后再用一样的办法递归地排序划分的两部分。

代码实现:
function quickSort($arr) {
    //先推断可否需要连续停止
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选中第一个元素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外的所有元素,依照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准的
    $right_array = array();  //大于基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右侧
            $right_array[] = $arr[$i];
        }
    }
    //再离别对左边和右侧的数组停止雷同的排序处置方式递归调取这个函数
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}

12.接口与抽象类的不同

1. 接口
(1)对接口的使用是通过关键字implements
(2)接口不克不及定义成员变量(包罗类静态变量),能定义常量
(3)子类必需实现接口定义的所有办法
(4)接口只能定义不克不及实现该办法
(5)接口没有结构函数
(6)接口中的办法和实现它的类默许都是public类型的
2. 抽象类
(1)对抽象类的使用是通过关键字extends
(2)不克不及被实例化,可以定义子类必需实现的办法
(3)子类必需定寄父类中的所有抽象办法,这些办法的拜访操纵必需和父类中一样(或者更为宽松)
(4)如一个类中有一个抽象办法,则该类必需定义为抽象类
(5)抽象类可以有结构函数
(6)抽象类中的办法可以使用private,protected,public来润饰。
(7)一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
3. Final类/办法
(1)final类不克不及被继承
(2)final办法不克不及被重写
4. Static类/办法
(1)可以不实例化类而直接拜访
(2)静态属性不成以由对象通过->操纵符来拜访,用::方式调取

13.innoDB,MyISAM的不同

MyISAM:
不支撑事务;
数据储备在磁盘,可被紧缩,储备空间较小;
只支撑表级锁;
支撑(FULLTEXT类型的)全文索引。
留存有表的总行数,假如select count(*) from table,会直接取出该值;
假如施行大量的SELECT,MyISAM是更好的选中;
不支撑外键;

InnoDB:
支撑事务;
储备在同享空间,需要更多的内存和储备;
具有事务、回滚和崩溃修复能力;
只支撑行级锁;
不支撑(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支撑全文索引,并且结果更好;
支撑外键;
假如你的数据施行大量的INSERT或UPDATE,出于机能方面的思考,应当使用InnoDB表。

**MyISAM和InnoDB两者的利用场景:**\
1) MyISAM治理非事务表。它供给高速储备和检索,乃至全文搜索能力。假如利用中需要施行大量的SELECT查询,那么MyISAM是更好的选中。\
2) InnoDB用于事务处置利用程序,具有众多特性,包罗ACID事务支撑。假如利用中需要施行大量的INSERT或UPDATE操纵,则应当使用InnoDB,这样可以提高多会员并发操纵的机能。

14.常见的设计模式

#战略模式
战略模式是对象的行动模式,意图是对一组算法的封装。动态的选中需要的算法并使用。
战略模式指的是程序中触及决策操纵的一种模式。战略模式功效非常强大,由于这个设计模式本身的中心思想就是面向对象编程的多形性思想。
战略模式的三个角色:
1.抽象战略角色
2.详细战略角色
3.环境角色(对抽象战略角色的援用)
实现步骤:
1.定义抽象角色类(定义好各个实现的共同抽象办法)
2.定义详细战略类(详细实现父类的共同办法)
3.定义环境角色类(私有化说明抽象角色变量,重载结构办法,施行抽象办法)
就在编程领域之外,有很多例子是关于战略模式的。例如:
假如我需要在早晨从家里动身去上班,我可以有几个战略思考:我可以乘坐地铁,乘坐公交车,走路或其它的途径。每个战略可以得到雷同的结果,但是使用了不一样的资源。

# 工厂模式
工厂模式是我们最常用的实例化对象模式,是用工厂办法代替new操纵的一种模式。
使用工厂模式的好处是,假如你想要更换所实例化的类名等,则只需更换该工厂办法内容即可,不需逐一寻觅代码中详细实例化的地方(new处)修改了。为系统构造供给灵敏的动态扩展机制,减少了耦合。

# 单例模式
单例模式确保某个类只要一个实例,并且自行实例化并向整个系统供给这个实例。
单例模式是一种常见的设计模式,在运算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操纵、显卡的驱动程序常被设计成单例。
单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。
单例模式有以下3个特点:
1.只能有一个实例。
2.必需自行创立这个实例。
3.必需给其他对象供给这一实例。
那么为什么要使用PHP单例模式?
PHP一个主要利用场合就是利用程序与数据库打交道的场景,在一个利用中会存在大量的数据库操纵,针对数据库句柄连接数据库的行动,使用单例模式可以幸免大量的new操纵。由于每一次new操纵都会耗损系统和内存的资源。

# 注册模式
注册模式,解决全局同享和交流对象。已经创立好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上猎取即可。将对象注册到全局的树上。任何地方直接去拜访。

# 适配器模式
将各种天壤之别的函数接口封装成统一的API。 \
PHP中的数据库操纵有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不一样的数据库操纵,统一成一样的API。相似的场景还有cache适配器,可以将memcache,redis,file,apc等不一样的缓存函数,统一成一致。 \
第一定义一个接口(有几个办法,乃至响应的参数)。然后,有几种不一样的状况,就写几个类实现该接口。将完成类似功效的函数,统一成一致的办法。

15.写出乘法表的算法

1.九九乘法表 for 实现:
for($i=1;$i<10;$i++){    
    for($j=1;$j<=$i;$j++){        
    echo $i.'*'.$j.'='.$i*$j.'   ';   
    }    
    echo '<br />';
}
2.九九乘法表 while 实现:
$m = 1;
while($m<10){    
    $n = 1;   
    while($n<=$m){       
    echo $m.'*'.$n.'='.$m*$n.'   ';        
    $n++;       
}       
echo '<br>';        
$m++;}

16.echo,print_r ,print,var_dump不同

 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即使没有用)
 print() 只能打印出简便类型变量的值(如int,string)
 print_r() 可以打印出复杂类型变量的值(如数组,对象)
 echo 输出一个或者多个字符串
 echo:语句构造;
 print:是函数,有返回值
 print_r:能打印数组,对象
 var_dump:能打印对象数组,并且带数据类型

17.session和cookie的不同

 session:贮存会员拜访的全局独一变量,储备在效劳器上的php指定的名目中的(session_dir)的位置停止的存置
 cookie:用来储备持续訪問一个頁面时所使用,是储备在客户端,关于Cookie来说是储备在会员WIN的Temp名目中的。
两者都可通过时间来设定时间长短

18.用PHP写出显示客户端IP与效劳器IP的代码

客户端:$_SERVER["REMOTE_ADDR"]
效劳器:$_SERVER["SERVER_ADDR"]

19.sql语句应当思考哪些平安性

(1)防止sql注入,对非凡字符停止转义,过滤或者使用预编译sql语句绑定
(2)使用最小权限原则,特殊是不要使用root账户,为不一样的动作或者操纵创立不一样的账户
(3)当sql出错时,不要把数据库出错的信息显露到客户端

20.优化mysqi数据库的办法

(1)拔取恰当的字段,打字段设定为NOT NULL,在查询的时候数据库不消比力NULL;
(2)使用链接(join)代替子查询;
(3)使用结合(UNION)查询代替手动创立暂时表;
(4)尽量减少使用(LIKE)关键字和通配符
(5)使用事务和外健

21.关于大流量的网站,你会采纳什么办法来解决拜访量?

(1)第一确定效劳器硬件可否知足支撑当前的流量;
(2)优化数据库的拜访;
(3)制止外部盗链;
(4)操纵大文件下载;
(5)使用不一样的主机分流;
(6)使用流量剖析统计;

22.isset(),empty()的不同

isset():
若变量不存在则返回 FALSE 
若变量存在且其值为NULL,也返回 FALSE 
若变量存在且值不为NULL,则返回 TURE 
同时检查多个变量时,每个单项都相符上一条要求时才返回 TRUE,不然结果为 FALSE 

empty():
若变量不存在则返回 TRUE
若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 乃至没有任何属性的对象,则返回 TURE\
若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 乃至没有任何属性的对象,则返回 FALSE

23.六大设计原则(接14点设计模式)

1.简单职责原则:一个类只负责一个职责。
2.开闭原则:一个软件实体比方类-模块-函数,应当对扩展开放,对修改关闭。
3.里氏更换原则:所有援用基类的地方必需透亮地使用其子类的对象,子类必需完全实现父类的办法,可以拓展本人的办法和属性,即子类可以扩展父类的功效,但是不克不及改动父类的原有功效。
4.迪米特规则:一个对象应当对其他对象保持最少的理解。
5.接口隔离原则:类间的依靠应当创立在最小的接口上。
6.依靠倒置原则:高层模块不该该依靠底层模块,二者应当依靠其抽象;抽象不该该依靠细节;细节应当依靠抽象;

24.group by 与distinct的不同

25.开发中应当留意哪些平安机制

1.PHP配置
2.Sql注入,
3.Xss攻击(cross site script 跨站足本),
4.盗链,
5.CSRF(跨站恳求捏造cross site request forgery),
6.CC(是利用不竭对网站发送连接恳求致使构成回绝效劳的目的)

26.memcache和Redis的不同

数据构造:memcache仅支撑简便的key-value情势,Redis支撑的数据更多(string字符串,set汇合,list列表,hash散列,zset有序汇合);
多线程:memcache支撑多线程,Redis支撑单线程
耐久化:Redis支撑耐久化,memcache不支撑耐久化
分布式:Redis做主从构造,memcache效劳器需要通过hash一致化来支撑主从构造

1.  Redis中,并不是所有的数据都不断储备在内存中的,这是和Memcache比拟一个最大的不同。
2.  Redis在许多方面具备数据库的特点,或者说就是一个数据库系统,而Memcache只是简便的K/V缓存。
3.  他们的扩展都需要做集群;实现方式:master-slave、Hash。
4.  在100k以上的数据中,Memcache机能要高于Redis。
5.  假如要说内存使用效力,使用简便的key-value储备的话,Memcached的内存利用率更高,而假如Redis采纳hash构造来做key-value储备,由于其组合式的紧缩,其内存利用率会高于Memcache。当然,这和你的利用场景和数据特性有关。
6.  假如你对数据耐久化和数据同步有所要求,那么引荐你选中Redis,由于这两个特性Memcache都不具备。即便你只是但愿在升级或者重新启动系统后缓存数据不会丧失,选中Redis也是明智的。
7.  Redis和Memcache在写入机能上面差异不大,读取机能上面特别是大量读取机能上面Memcache更强

27.常用的数组函数

数组的键名和值:
array_values($arr);  获得数组的值
array_keys($arr);  获得数组的键名
array_flip($arr);  数组中的值与键名互换(假如有反复前面的会被后面的覆盖)
in_array("apple",$arr);  在数组中检索apple
array_search("apple",$arr);  在数组中检索apple ,假如存在返回键名
array_key_exists("apple",$arr);  检索给定的键名可否存在数组中
isset($arr[apple]):   检索给定的键名可否存在数组中

数组的内部指针:
current($arr);  返回数组中的当前单元\
pos($arr);  返回数组中的当前单元\
key($arr);  返回数组中当前单元的键名\
prev($arr);  将数组中的内部指针倒回一位\
next($arr);  将数组中的内部指针向前移动一位\
end($arr);  将数组中的内部指针指向最后一个单元\
reset($arr;  将数组中的内部指针指向第一个单元\
each($arr);  将返回数组当前元素的一个键名/值的结构数组,并使数组指针向前移动一位\
list($key,$value)=each($arr);  获得数组当前元素的键名和值

数组的排序:
1.通过元素值对数组排序:
sort($arr);  由小到大的次序排序(第二个参数为按什么方式排序)忽略键名的数组排序\
rsort($arr);  由大到小的次序排序(第二个参数为按什么方式排序)忽略键名的数组排序\
usort($arr,"function");  使用会员自定义的比力函数对数组中的值停止排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)忽略键名的数组排序\
asort($arr);  由小到大的次序排序(第二个参数为按什么方式排序)保存键名的数组排序\
arsort($arr);  由大到小的次序排序(第二个参数为按什么方式排序)保存键名的数组排序\
uasort($arr,"function");  使用会员自定义的比力函数对数组中的值停止排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)保存键名的数组排序

2.通过键名对数组排序
ksort($arr);  依照键名正序排序\
krsort($arr);  依照键名逆序排序\
uksort($arr,"function");  使用会员自定义的比力函数对数组中的键名停止排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)

数组的合并:
array_merge($arr1,$arr2);  合并两个或多个数组(雷同的字符串键名,后面的覆盖前面的,雷同的数字键名,后面的不会做覆盖操纵,而是附加到后面)
array_merge_recursive($arr1,$arr2);   递归合并操纵,假如数组中有雷同的字符串键名,这些值将被合并到一个数组中去。假如一个值本身是一个数组,将依照响应的键名把它合并为另一个数组。当数组 具有雷同的数组键名时,后一个值将不会覆盖本来的值,而是附加到后面

数组的差集
array_diff($arr1,$arr2);  返回差集结果数组\
array_diff_assoc($arr1,$arr2,$arr3);  返回差集结果数组,键名也做比力

数组的交集
array_intersect($arr1,$arr2);  返回交集结果数组\
array_intersect_assoc($arr1,$arr2);  返回交集结果数组,键名也做比力

其他:
extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值
compact(var1,var2,var3);compact() 函数创立包括变量名和它们的值的数组。
array_slice($arr,0,3);  可以将数组中的一段取出,此函数忽略键名
array_push($arr,"apple","pear");  将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数\
array_pop($arr);  将数组栈的最后一个元素弹出(出栈)

28.阅读器通过URL拜访的道理

1.键盘或触屏输入URL并回车确定
2.URL解析/DNS解析查寻域名IP地址
3.网络连接发起HTTP恳求
4.HTTP报文传输历程
5.效劳器接收数据
6.效劳器响应恳求/MVC
7.效劳器返回数据
8.客户端接收数据
9.阅读器加载/渲染页面
10.打印绘制输出

29.常见的负载平衡方案

1.基于DNS的负载平衡
2.基于四层交流技术的负载平衡
3.基于七层交流技术的负载平衡
4.四层+七层负载结合方案

30.mysql_fetch_row()和mysql_fetch_array()的不同

mysql_fetch_row() 从和结果标识 data 关联的结果集中取得一行数据并作为数组返回。每个结果的列贮存在一个数组的单元中,偏移量从 0 开端。顺次调取 mysql_fetch_row() 将返回结果集中的下一行,假如没有更多行则返回 FALSE。                                                     

mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。

说明:
(1)假如你的表里面有字段a,b,c那么你用mysql_fetch_row()  就返回array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话,只能这样写$array[1],$array[2]才能得到a的值;

(2)如果用mysql_fetch_array()  就返回array(a=>a的值,b=>b的值,c=>c的值)和 array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话$array[1]和$array[a]都能得到a的值

31.怎样保证代码在多个PHP版本中可以正常运转

通过修改nginx配置文件的fastCGI,监听不一样端口,从而选中不一样的版本。

32.剖析MySQL查询慢的缘由

1.查看慢查询日志
2.通过pt-query-digest工具剖析
3.设定set profiling = 1;开启效劳,施行show profile。查看所有语句会监测耗损时间存来临时表
4.寻到耗损时间大的ID,施行show profile for query 暂时表ID
5.使用show status,show processlist 等命令查看
6.使用explain剖析单条SQL语句

33.怎样不借助第三变量交流两个变量的值

字符串交流:
1.substr,strlen两个办法实现:
$a="abc";
$b="bcd";
echo '交流前 $a:'.$a.',$b:'.$b.'<br />';

$a.=$b;//将字符串合并为一条

//利用切割字符串的办法交流
$b=substr($a,0,(strlen($a)-strlen($b)));
$a=substr($a, strlen($b));
echo '交流后$a:'.$a.',$b:'.$b.'<br />';

2.使用str_replace办法实现:
$a="abc";\
$b="bcd";\
echo '交流前 $a:'.$a.',$b:'.$b.'<br />';\
$a.=$b;\
$b=str_replace($b, "", $a);\
$a=str_replace($b, "", $a);\
echo '交流后$a:'.$a.',$b:'.$b.'<br />';\

3.结合使用list办法和array实现:
$a="abc";\
$b="bcd";\
echo '交流前 $a:'.$a.',$b:'.$b.'<br />';\
list($b,$a)=array($a,$b);\
echo '交流后$a:'.$a.',$b:'.$b.'<br />';
PS:list()用途:把数组中的值赋给list中的变量中:
    $my_array = array("Dog","Cat","Horse");
    list($a, $b, $c) = $my_array;
    则 $a = "Dog",$b = "Cat" ,  $c = "Horse";

字符串和数字都适用 使用异或运算:
$a="abc";\
$b="bcd";\
echo '交流前 $a:'.$a.',$b:'.$b.'<br />';\
$a=$a^$b;\
$b=$b^$a;\
$a=$a^$b;\
echo '交流后$a:'.$a.',$b:'.$b.'<br />';    

道理:https://blog.csdn.net/github_37767025/article/details/68943789

只适用于数字:
$a=3;\
$b=5;\
echo '交流前 $a:'.$a.',$b:'.$b.'<br />';\
$a=$a+$b;\
$b=$a-$b;\
$a=$a-$b;\
echo '交流后$a:'.$a.',$b:'.$b.'<br />';

34.char和varchar的不同

1.varchar用于储备可变长度,char用于储备定长
2.关于经常变动的数据char比varchar更好,不容易发生碎片
3.关于非常短的列,char比varcahr在储备空间上更有效力
4.char关于未到达长度的数据会主动补空格

35.MySQL事务的四大特性

一样来说,事务是必需知足4个前提(ACID)::原子性(Atomicity,或称不成分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、耐久性(Durability)。

    原子性:一个事务(transaction)中的所有操纵,要末全部完成,要末全部不完成,不会完毕在中心某个环节。事务在施行历程中发生错误,会被回滚(Rollback)到事务开端前的状态,就像这个事务从来没有施行过一样。

    一致性:在事务开端此前和事务完毕今后,数据库的完全性没有被毁坏。这表示写入的材料必需完全相符所有的预设规则,这包括材料的准确度、串联性乃至后续数据库可以自发性地完成预定的工作。

    隔离性:数据库同意多个并发事务同时对其数据停止读写和修改的能力,隔离性可以防止多个事务并发施行时由于穿插施行而致使数据的不一致。事务隔离分为不一样级别,包罗读未提交(Read uncommitted)、读提交(read committed)、可反复读(repeatable read)和串行化(Serializable)。

    耐久性:事务处置完毕后,对数据的修改就是永远的,即使系统故障也不会丧失。

36.线程和进程

进程:是并发施行的程序在施行历程中分配和治理资源的根本单位,是一个动态概念,竞争运算机系统资源的根本单位。

线程:是进程的一个施行单元,是进程内科调度实体。比进程更小的独立运转的根本单位。线程也被称为轻量级进程。一个程序至少一个进程,一个进程至少一个线程。

**进程线程的不同:**

-   地址空间:统一进程的线程同享本进程的地址空间,而进程之间则是独立的地址空间。
-   资源具有:统一进程内的线程同享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

     一个进程崩溃后,在庇护模式下不会对其他进程发生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程强健。

     进程切换时,耗损的资源大,效力高。所以触及到频繁的切换时,使用线程要好于进程。一样假如要求同时停止并且又要同享某些变量的并发操纵,只能用线程不克不及用进程

-   施行历程:每个独立的进程程有一个程序运转的入口、次序施行序列和程序入口。但是线程不克不及独立施行,必需依存在利用程序中,由利用程序供给多个线程施行操纵。
-   线程是处置器调度的根本单位,但是进程不是。
-   两者均可并发施行。

**优缺陷:**

  线程施行开销小,但是不利于资源的治理和庇护。线程适合在SMP机器(双CPU系统)上运转。

  进程施行开销大,但是能够很好的停止资源治理和庇护。进程可以跨机器前移。

  **何时使用多进程,何时使用多线程?**

对资源的治理和庇护要求高,不限制开销和效力时,使用多进程。

要求效力高,频繁切换时,资源的庇护治理要求不是很高时,使用多线程。

38.HTTP状态码

1**
信息,效劳器收到恳求,需要恳求者连续施行操纵
2**
成功,操纵被成功接收并处置
3**
重定向,需要进一步的操纵以完成恳求
4**
客户端错误,恳求包括语法错误或没法完成恳求
5**
效劳器错误,效劳器在处置恳求的历程中发生了错误

39.Linux效劳器CPU负载过高的排查办法

参照 链接:https://blog.csdn.net/u014692324/article/details/80816521

40.常见的查寻算法

参照 链接:https://segmentfault.com/a/1190000016582674

41.PHP中布尔值为false的状况

JS:
1、undefined(不决义,寻不到值时显现)
2、null(代表空值)
3、false(布尔值的false,字符串"false"布尔值为true)
4、0(数字0,字符串"0"布尔值为true)
5、NaN(没法运算结果时显现,表示"非数值";但是tapeof NaN==="number")
6、""(双引号)或''(单引号) (空字符串,中心有空格时也是true)

PHP:
1、undefined(不决义,寻不到值时显现)
2、null(代表空值)
3、false(布尔值的false,字符串"false"布尔值为true)
4、0(数字0,字符串"0"布尔值都为false)
5、""(双引号)或''(单引号) (空字符串,中心有空格时也是true)

引荐教程:phpStudy极速入门视频教程

以上就是PHP面试踩过的坑的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板