博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019-中小型公司PHP面试题目记录(附带答案)
阅读量:5256 次
发布时间:2019-06-14

本文共 3924 字,大约阅读时间需要 13 分钟。

博主是三线省会城市的苦逼技术开发,主攻PHP方向,平时前后端语言也都有涉及,因为都是自学,上手就是框架,工作五年来基础补的不稳,换工作的时候苦不堪言,感觉一上来就问Ngnix的运行机制,php的被编译过程这类的问题,都很懵逼,在跳槽的过程中,整理一些面试过的问题,尽量回忆,答案时候来自己总结的,有不对的地方请大家指正。

基础篇:

1.请简单描述一下PHP?
PHP是一种服务器端脚本语言,最常用于Web应用程序。PHP附带了各种框架和CMS,可以帮助创建网站。面向对象,PHP类似于Java和C#等语言,这使得它易于学习和实现。一些基于PHP的流行应用程序是WordPress等。

2.PHP页面中包含文件的方式是什么?他们有什么不同?

包含文件函数有include(),require()两个函数
其中require()包含的文件如果不存在,则会返回一个致命的错误,并终止代码运行
而include()包含的文件如果不存在,则会返回一个错误,但是代码可以继续执行

3.PHP中GET,和POST方法的基本区别在哪?

GET方法中,最大只能传送1024个字节,但是POST方法可以传输大量的数据,而且GET方法比POST方法的安全性方面低很多

4.PHP中如何区别会话和Cookie?

会话就是SESSION,一般是存储在服务器上面的,而cookie是以文本的形式存储在用户的计算机上面的;
SESSION能够存储多个变量,并且可以持续保持活动状态。

5.header()函数在PHP中的作用?

该header() 函数的目的 是将原始HTTP标头发送到客户端浏览器。请记住,在发送实际输出之前必须调用此函数。例如,确保在使用此功能之前不打印任何HTML元素。

6.php如何通过头文件设置编码类型?

header( 'Content-Type:text/html;charset=utf-8 ');

7.php正则匹配(email,HTML,JS)?

代码示例:过滤所有JS

 

echo preg_replace(“/<script[^>]*?>.*?<\/script>/si”, “”, $script);

 

进阶篇:

1.简述一下php-fpm。

php-fpm即php-Fastcgi Process Manager.

php-fpm是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

 

2.Nginx与php-fpm如何结合运行?

Nginx与php-fpm的结合流程如下:

1.浏览器端输入网址链接;

2.浏览器发送请求到Nginx服务器端;

3.Nginx通过路由访问设置好的根目录下面的xxx.php文件;

4.同时加载Nginx的fast-cgi模式;

5.fast-cgi监听127.0.0.1:9000地址;

6.整个请求到达127.0.0.1:9000;

7.php-fpm监听9000端口,接收到请求,启用worker进程处理请求(php解释器);

8.phpfpm处理完成,返回给Nginx;

9.Nginx将处理结果返回给浏览器。

 

3.memcached、redis、mongodb的区别联系

这是3个场景完全不同的东西,但是又统称为Nosql技术。

1.memcached:单一键值对内存缓存的,做对象缓存无可替代的分布式缓存;

2.redis:是算法和数据结构的集合,快速的数据结构操作是他最大的特点,支持数据持久化;3.mongodb是bson结构、介于rdb和nosql之间的,更松散更灵活的,但是不支持事务,只用作非重要数据存储

 

4.简述一下Mysql的优化方向

这个问题很笼统,因为大部分的mysql优化要看业务逻辑,有的能水平分表,有的不能,有的能做索引,有的不能,所以回答这类问题,我们一般也选择比较笼统的回答如:

1.可以送mysql的类型上面优化,有些使用MyISAM作为数据表类型,便于快速读取;

2.mysql在创建表和字段的时候尽量根据业务逻辑选择合适的类型(int,smallint,varchar等);

3.对mysql的慢查询日志进行分析,看看那些表的查询速度较慢,这时候可以采用分表的方式,分表有多种办法,水平和垂直,一般的业务逻辑(账户流水,记录用户行为习惯等)都是垂直分表,也就是一个大表拆分成多个小表,可以按照用户ID求余分表,可以按照流水业务按年度、月度分表等

4.建立索引,对经常查询的字段建立对应的索引,可以明显提高查询的效率(顺便介绍下索引的原理回家很多印象分),优化查询语句,已添加索引的字段不能使用sql函数,会使索引无效。

5.读写分离

 

5.简述一下PHP的自动加载原理

说到自动加载,如果一直使用框架的同学可能有点懵逼,内心当中澎湃这,实例化?继承?等等等等,但是从基本的概念分析,我们说的是类的自动加载,也就是你在new的时候后面的引入文件。

在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。

 

这时候首先想到的可能是魔术方法__autoload()方法

1
2
3
4
5
6
7
8
9
function
__autoload(
$class
)
{
    
// 根据类名确定文件名
    
$file
=
$class
.
'.php'
;
 
    
if
(
file_exists
(
$file
)) {
        
include
$file
;
// 引入PHP文件
    
}
}

使用的时候new一下就OK啦,但是在引入命名空间的时候这种方法过于简单,不利于程序的维护,这时候引入spl_autoload_register()函数,spl_autoload_register 函数的功能就是把传入的函数(参数可以为回调函数或函数名称形式)注册到 SPL __autoload 函数队列中,并移除系统默认的 __autoload() 函数,类似一个双向队列。

简单描述一下TP5中的自动加载实现

首先创建一个Index.php,加入位置在\app\index\controller\hello中

1
2
3
4
5
6
7
8
9
namespace
app\index\controller\hello;
 
class
Index
{
    
function
__construct()
    
{
        
echo
'<h1> Welcome To Home </h1>'
;
    
}
}

接着我们在创建一个加载类(不需要命名空间),它处于根目录\中:

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
class
Loader
{
    
/* 路径映射 */
    
public
static
$vendorMap
=
array
(
        
'app'
=> __DIR__ . DIRECTORY_SEPARATOR .
'app'
,
    
);
 
    
/**
     
* 自动加载器
     
*/
    
public
static
function
autoload(
$class
)
    
{
        
$file
= self::findFile(
$class
);
        
if
(
file_exists
(
$file
)) {
            
self::includeFile(
$file
);
        
}
    
}
 
    
/**
     
* 解析文件路径
     
*/
    
private
static
function
findFile(
$class
)
    
{
        
$vendor
=
substr
(
$class
, 0,
strpos
(
$class
,
'\\'
));
// 顶级命名空间
        
$vendorDir
= self::
$vendorMap
[
$vendor
];
// 文件基目录
        
$filePath
=
substr
(
$class
,
strlen
(
$vendor
)) .
'.php'
;
// 文件相对路径
        
return
strtr
(
$vendorDir
.
$filePath
,
'\\'
, DIRECTORY_SEPARATOR);
// 文件标准路径
    
}
 
    
/**
     
* 引入文件
     
*/
    
private
static
function
includeFile(
$file
)
    
{
        
if
(
is_file
(
$file
)) {
            
include
$file
;
        
}
    
}
}

最后,将 Loader 类中的 autoload 注册到 spl_autoload_register 函数中:

1
2
3
4
include
'Loader.php'
;
// 引入加载器
spl_autoload_register(
'Loader::autoload'
);
// 注册自动加载
 
new
app\index\controller\hello\Index();
// 实例化未引用的类

 

转载于:https://www.cnblogs.com/applelife/p/11343961.html

你可能感兴趣的文章
java lock锁住特定对象
查看>>
JAX-WS 访问SSL 的WebService 老是HTTP transport error: Connection refused错误的解决办法。...
查看>>
面向对象与函数式的对比
查看>>
yii2实战教程之第一个Yii程序
查看>>
php上传文件及头像预览
查看>>
程序猿加班的不归路!
查看>>
【译】在Transformer中加入相对位置信息
查看>>
大四java实习生的一些经历
查看>>
python programming
查看>>
基础排序算法之快速排序(Quick Sort)
查看>>
Truncate 删除数据
查看>>
线程池的概念
查看>>
USB打印机开钱箱
查看>>
mysql数据库 中文乱码
查看>>
Linux下Mysql数据库互为主从的配置过程
查看>>
ECSHOP系统,数据库表名称、结构
查看>>
Python Web开发框架Django
查看>>
【Install】我是如何安装Linux类系统的
查看>>
作业三4
查看>>
多态存在的3个必要条件
查看>>