PHP面试题目

1、阿里PHP面试

https://blog.csdn.net/qishouzhang/article/details/47007177

1、get与post的区别

​ 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

​ GET在浏览器回退时是无害的,而POST会再次提交请求

​ GET产生的URL地址可以被Bookmark,而POST不可以。

​ GET请求只能进行url编码,而POST支持多种编码方式。

​ GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

​ GET请求在URL中传送的参数是有长度限制的(不同浏览器不同,chrome为8182),而POST没有。

​ 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

​ GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

​ GET产生一个TCP数据包;POST产生两个TCP数据包。

2、cookie和session的区别

​ cookie数据保存在客户端,session数据保存在服务器端。session以来cookie,若要减轻服务器压力,则多用cookie。session安全一点。

3、MySQL中myisam和innodb的区别

​ MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

​ 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。

4、如何定位sql慢查询以及优化处理流程

查询是否开启了慢查询日志

​ mysql> show variables like ‘%slow%’;
​ 如果slow_query_log 为 off,则
​ mysql> set global slow_query_log=1;

在mysql的my.ini中,查找datadir
在data目录下,会生成一个log日志,里面即可定位慢查询的sql语句!

优化

​ 1. 打开慢日志查询,确定是否有SQL语句占用了过多资源,如果是,在不改变业务原意的前提下,对insert、group by、order by、join等语句进行优化。

  1. 考虑调整MySQL的系统参数: innodb_buffer_pool_size、innodb_log_file_size、table_cache等。

  2. 确定是否是因为高并发引起行锁的超时问题

5、获取服务器ip和客户端ip的方法

​ 客户端

$_SERVER[“REMOTE_ADDR”] ,客户用代理器的话不能访问正确的地址,若代理想获得真实的 $_SERVER[“HTTP_X_FORWARDED_FOR”]

​ 服务端

​ a. $_SERVER[“SERVER_NAME”],需要使用函数gethostbyname()获得。这个变量无论在服务器端还是客户端均能正确显示。

​ b. $_SERVER[“SERVER_ADDR”],在服务器端测试:127.0.0.1(这个与httpd.conf中BindAddress的设置值相关)。在客户端测试结果正确。

7、二分法、快速排序、递归思想、时间复杂度、PHP实现栈和队列封装成类

8、linux基本命令,独立搭建lamp

9、strstr和stristr、explode和implode、include和require的区别

​ strstr是大小写敏感的。 stristr是大小写不敏感的。

​ implode 把数组输出为字符串 ,explode 把字符串分割为数组

​ require()语句的性能与include()相类似,都是包括并运行指定文件。不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估;而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句)。这就意味着如果可能执行多次的代码,则使用require()效率比较高。另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句。

10、进程和线程的区别

​ 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

11、操作系统中堆和栈的区别

​ 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放

2、堆区(heap)— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些

12、单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php

/**
Created by PhpStorm.
User: protecting
Date: 19-4-15
Time: 下午8:41
*/

/**
单例类
Singleton.class
*/
class Singleton
{
/**
静态成品变量 保存全局实例
*/
private static $_instance = NULL;

/**
私有化默认构造方法,保证外界无法直接实例化
*/
private function __construct()
{

}

/**
静态工厂方法,返还此类的唯一实例
*/
public static function getInstance() {
if (is_null(self::$instance)) {
self::$instance = new Singleton();
}

return self::$_instance;
}

/**
防止用户克隆实例
*/
public function __clone(){
die('Clone is not allowed.' . E_USER_ERROR);
}

/**
测试用方法
*/
public function test()
{
echo 'Singleton Test OK!';
}

}

/**
客户端
*/
class Client {

/**
Main program.
*/
public static function main() {
$instance = Singleton::getInstance();
$instance->test();
}
}

Client::main();

13、三次握手和四次挥手

三次握手

​ 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

​ 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
​ 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

四次挥手

​ 第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

​ 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

​ 第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

​ 第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

14、可执行程序加载到内存的过程

​ 1、 exec执行一个程序

​ 2、 elf为现在非常流行的可执行文件的格式,它为程序运行划分了两个段,一个段是可以执行的代码段,它是只读,可执行;另一个段是数据段,它是可读写,不能执行。

​ 3、 loader会启动,通过mmap系统调用,将代码端和数据段映射到内存中,其实也就是为其分配了虚拟内存,注意这时候,还不占用物理内存;只有程序执行到了相应的地方,内核才会为其分配物理内存。

​ 4、 loader会去查找该程序依赖的链接库,首先看该链接库是否被映射进内存中,如果没有使用mmap,将代码段与数据段映射到内存中,否则只是将其加入进程的地址空间。这样比如glibc等库的内存地址空间是完全一样。

因此一个2M的程序,执行时,并不意味着为其分配了2M的物理内存,这与其运行了的代码量,与其所依赖的动态链接库有关。

15、点击url都发生了什么

​ DNS解析

​ TCP连接

​ 发送HTTP请求

​ 服务器处理请求并返回HTTP报文

​ 浏览器解析渲染页面

​ 连接结束

16、说说tcp报文结构

​ 拥塞控制

​ 拥塞窗口,慢启动,加性增,乘性减

36-1

17、什么是 CGI?什么是 FastCGI?php-fpm,FastCGI,Nginx 之间是什么关系?

CGI,通用网关接口,用于WEB服务器和应用程序间的交互,定义输入输出规范,用户的请求通过WEB服务器转发给FastCGI进程,FastCGI进程再调用应用程序进行处理,如php解析器,应用程序的处理结果如html返回给FastCGI,FastCGI返回给Nginx 进行输出。假设这里WEB服务器是Nginx,应用程序是 PHP,而 php-fpm 是管理 FastCGI 的,这也就是 php-fpm,FastCGI,和 Nginx 之间的关系。

FastCGI 用来提高 cgi 程序性能,启动一个master,再启动多个 worker,不需要每次解析 php.ini. 而 php-fpm 实现了 FastCGI 协议,是 FastCGI 的进程管理器,支持平滑重启,可以启动的时候预先生成多个进程。

  • thinkCMF上传图片

    thinkCMF上传图片 1、要使用这个功能,首先要引入框架自带的admin.js或者frontend.js文件 再上传的地方添加 1234567891011121314151617181920212223242526...

    thinkCMF上传图片
  • 小程序开发

    小程序开发 获取access_token要将申请的测试号的appid和secret填在相应的位置,而不是填公众号的appid和secret。

    小程序开发
  • global与GLOBAL区别

    global与GLOBAL区别 1.有些场合需要全局变量的出现,如下例子:<?php$name=”why”;//定义变量name,并初始化function echoName(){//试图引用函数外面的变量echo “m...

    global与GLOBAL区别
  • PHP取整

    PHP取整 1.直接取整,舍弃小数,保留整数:intval($a);2.四舍五入取整:round($a);3.向上取整,有小数就加1:ceil($a);4.向下取整:floor($a)。

    PHP取整
  • 为什么PHP变量以$开头

    PHP变量 ​ Because PHP was based on Perl which used $, though the symbols Perl used were meaningful andplenty us...

    为什么PHP变量以$开头
  • PHP超全局变量

    PHP超全局变量 PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。 PHP 超级全局变量列表: $GLOBALS $G...

    PHP超全局变量
  • tp5学习笔记9

    tp5学习笔记9 1、验证器1) 控制器中使用验证器 // 实例化验证器类 $validate=new Validate( [ &q...

    tp5学习笔记9
  • tp5学习笔记8

    tp5学习笔记8 1、视图a) 加载页面 1、继承系统控制器类 return $this->fetch(参数1,参数2,参数3,参数4); 参数1(字符串): 模板...

    tp5学习笔记8
  • tp5学习笔记7

    tp5学习笔记7 1、模型(model)数据模型 2、新建数据模型​ 1) 手动新建 在model目录下 新建 User.php // 声明命名空间 namespace a...

    tp5学习笔记7
  • tp5学习笔记6

    tp5学习笔记6 1、TP5.0 支持数据库类型1Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。 2、如何连接数据库1、配置文件定义 a、配置文件目录 /var/www/t...

    tp5学习笔记6