面试题1

1.get,post 的区别

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

**传递的大小有区别 **具体大小和浏览器有关系,ie浏览器是2k其他浏览器的最大值可能不同,但是也比较小。而post方法传递参数的大小是可以设定的,原来是认为无限大。在Php当中在php.ini文件是可以设置参数的大小的。

**安全性 **get方法安全性比较低因为暴露在外面而post方法安全性比较高

**提交的原理 **get方法提交的数据都是独立的。而Post方法将所有的提交的数据变成一个整体(将提交的数据变成xml格式)

**灵活性**get方法很灵活, post方法不灵活,必须要有表单的参与才能用post提交很不方便

原文:http://www.php.cn/php-weizijiaocheng-379043.html

PS在查资料的时候发现一个有趣的回答:传送门:https://www.cnblogs.com/xkzy/p/5987742.html

 

2.requireinclude 区别

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) );

原文:https://www.cnblogs.com/laowenBlog/p/6527632.html

4.tcp,udp,http 区别

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

5.获取上级目录的方法

echo __FILE__ ; // 获取当前所在文件的绝对路径及地址,结果:D:aaamy.php

echo dirname(__FILE__); // 取得当前文件所在的绝对目录,结果:D:aaa echo dirname(dirname(__FILE__)); //取得当前文件的上一层目录名,结果:D: 原文:https://blog.csdn.net/viqecel/article/details/80765275

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中。
原文:https://blog.csdn.net/darkangel1228/article/details/80004222https://www.cnblogs.com/KTblog/p/5122825.html

7.数据库索引

**什么是索引**索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。(摘自百度百科)
**索引类型**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); 更多请参照:http://www.w3school.com.cn/php/php_ref_filesystem.asp原文:http://www.w3school.com.cn/php/php_ref_filesystem.asp

 

 

 

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);}

原文:https://www.cnblogs.com/rainblack/p/5808694.html

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)静态属性不可以由对象通过->操作符来访问,用::方式调用原文:http://www.php.cn/php-weizijiaocheng-372186.html

13. innoDBMyISAM 的区别

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,这样可以提高多用户并发操作的性能。原文:https://www.cnblogs.com/kevingrace/p/5685355.html

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等不同的缓存函数,统一成一致。首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。原文:https://www.cnblogs.com/leedaily/p/8250158.html

 

 

 

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.echoprint_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)使用事务和外健

  1. 对于大流量的网站,你会采用什么方法来解决访问量?

(1)首先确认服务器硬件是否满足支持当前的流量;

(2)优化数据库的访问;

(3)禁止外部盗链;

(4)控制大文件下载;

(5)使用不同的主机分流;

(6)使用流量分析统计;

原文地址:https://www.cnblogs.com/myJuly/p/12500478.html