精华内容
下载资源
问答
  • 2021-03-23 08:16:50

    PHP面试题及答案

    PHP是一种通用开源脚本语言,下面是百分网小编为大家搜索整理的关于PHP面试题及答案题,欢迎参考阅读,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!

    b38352f25ad6752e6212dc6627588131.png

    练习题一

    1. echo count(“abc”); 输出什么?

    答案:1

    2. 用PHP代码写出显示客户端IP与服务器IP的代码。

    答案:客户端 getenv(‘REMOTE_ADDR’); 服务器端 getenv(‘SERVER_ADDR’);

    // gethostbyname(“www.phpmst.com”);

    3. error_reporting(2047)什么作用?

    答案:相当于 error_reporting(‘E_ALL’); 输出所有的错误。

    4.如何实现PHP、JSP交互?

    答案: 题目有点含糊不清,SOAP,XML_RPC,Socket function,CURL都可以实现这些,如果是考PHP和Java的整合,PHP内置了这种机制(如果考PHP和.NET的整合,也可以这么回答), 例如$foo = new Java(‘java.lang.System’);

    5. 打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。

    答案:此模块打开时,php将检查当前脚本的拥有者是否和受操作文件的拥有者相同,因此,将影响文件操作类函数,程序执行函数(program Execution Functions)。这些函数有.pathinfo,basename,fopen,system,exec,proc_open 等函数;

    6. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)。

    function checkEmail($mail){

    $reg = ‘/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/’;

    $rst = preg_match($reg , $mail);

    if($rst){

    return TRUE;

    }else {

    return FALSE;

    } }

    7. 写个函数用来对二维数组排序。

    答案:array_multisort() 。

    8、优化MYSQL数据库的方法。

    答案:(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率。

    (2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master。

    (3).(1)和(2)超越PHP programmer的要求了,会更好,不会没关系.检查有没有少加索引。

    (4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句。

    (5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然后msql_num_rows. 只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就… set title = ? where article_id = ?不要set content = ?(大文本)。

    (6).必要的时候用不同的存储引擎,比如InnoDB可以减少死锁,HEAp可以提高一个数量级的查询速度。

    练习题二

    1.请写出PHP5权限控制修饰符。

    答案:private protected public。

    2.对于大流量的网站,您采用什么样的方法来解决访问量问题?

    答案:首先,确认服务器硬件是否足够支持当前的流量。

    其次,优化数据库访问。

    第三,禁止外部的盗链。

    第四,控制大文件的'下载。

    第五,使用不同主机分流主要流量 第六,使用流量分析统计软件。

    3.在HTTP 1.0中,状态码 401 的含义是?;如果返回"找不到文件"的提示,则可用 header 函数, 其语句是?

    答案:401的含义是未授权。

    header(“HTTp/1.0 404 Not Found”);———找不到文件

    header(“HTTp/1.1 403 Forbidden”);———不允许访问

    4.以Apache模块的方式安装PHP,在文件http.conf中首先要怎样动态装载PHP模块,然后再用什么语句使得Apache把所有扩展名为php的文件都作为PHP脚本处理。

    答案:动态装载PHP模块:LoadModule php5_module "c:/php/php5apache2.dll"

    把所有扩展名为php的文件都作为pHp脚本处理: AddType application/x-httpd-php-source .phps AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml

    5.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是?

    答案:serialize() /unserialize()。

    6.一个函数的参数不能是对变量的引用,除非在php.ini中把什么模块设为on。

    答案:allow_call_time_pass_reference。

    【PHP面试题及答案】相关文章:

    更多相关内容
  • php 面试题

    2019-03-20 03:12:08
    NULL 博文链接:https://fly-sky.iteye.com/blog/786198
  • php面试题

    2018-08-08 14:06:56
    php面试题,php面试题php面试题php面试题php面试题php面试题
  • PHP面试题

    2019-07-22 12:38:05
    文档名称:PHP面试题目录:【】46种常见的浏览器兼容性问题大汇总【】php_kecheng_liucheng_bg【】PHP学习路线图【】PHP经典面试题(基础型)附答案【】PHP面试题(一)【】PHP面试题【】PHP面试题【】php面试题【】php...
  • php基础以及高级题目大全,涉及前端,开发,数据库等经典面试题型。
  • php面试题_百度.doc

    2021-08-10 18:58:39
    php面试题_百度.doc
  • php面试题,公司内部面试题
  • php面试题答案

    2018-07-16 10:14:26
    php面试题答案
  • 贪玩php面试题.docx

    2020-01-03 11:50:28
    贪玩公司php面试题,分享给大家参考
  • php面试题及答案

    2015-06-04 16:44:42
    php 面试题答案. 优化MYSQL数据库的方法。(4分,多写多得) (1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 (2).使用连接(JOIN)来代替子查询(Sub-...
  • PHP面试题整理

    2018-12-07 18:06:27
    整理了市场上一些公司的常见PHP面试题目,后续会整理更多、
  • PHP面试题答案.docx

    2020-04-14 15:21:04
    PHP面试题答案.docx
  • php 面试题整理汇总.doc php 面试题整理汇总.doc php 面试题整理汇总.doc
  • PHP面试题集锦

    2021-06-09 12:36:57
    这是Tom老师精心收集的面试题。本课程中的面试题都是真实公司出的题目。也是在csdn网站上独家的PHP面试题。面试题中不仅仅有PHP、html 和javascript编程知识的介绍。也有面试技巧的介绍
  • php面试题汇总

    2016-09-17 16:40:29
    php面试题汇总
  • 本篇文章是我在之前面试这家公司时遇到的问题,当时代码写的不全,后来通过查阅相关资料,整理出来的一份分享给大家
  • php面试题大全

    2016-03-31 10:37:27
    php面试题
  • 最全最详细的PHP面试题(带有详细答案),接近三百个左右的问题,涵盖所有技术细节和详细解释以及code sample
  • php面试题练习

    2016-05-16 15:51:25
    php应聘面试时会经常问到或者考核到的一些有关php的应用知识。这里对类似的题目做了总结归纳
  • 面试题包含前端基础,数据库,面向对象,PHP核心技术,数据结构及算法 面试题大多来自国内大型互联网公司。新浪,腾讯,阿里,小米,百度等等
  • BAT大厂PHP高级面试题

    2020-11-17 10:07:33
    大厂PH[高级面试题,里面有很多有用的知识点,PHPer如果想要跳槽或者学习瓶颈可以根据文档中的知识点进行深度学习,里面的问题的答案可能有些不全大家学习的时候可以再网上对问题进行深度的解答,对问题进行深度的...
  • 除了口语表达能力之外,还有一点就是实力,这也是你的php面试题所要体现的!那么提前掌握最新的PHP面试题,必然能使你在求职过程中事半功倍! 以下这些php面试题,希望能帮你进入你自己喜欢的公司,拿到自己最理想...

    一、php面试前言

    每个Phper在应聘的时候,都会有php面试与笔试。除了口语表达能力之外,还有一点就是实力,这也是你的php面试题所要体现的!那么提前掌握最新的PHP面试题,必然能使你在求职过程中事半功倍!

    以下这些php面试题,希望能帮你进入你自己喜欢的公司,拿到自己最理想的收入!!!

    二、PHP面试题整理大全如下

    可以关注博主的微信公众号  “PHP大神”  回复  “面试题”  即可获取更多PHP面试题

    1、get与post 的区别?

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

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

    GET请求会被浏览器主动cache,而POST不会,除非手动设置。

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

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

    GET请求在URL中传送的参数是有长度限制的,而POST没有。

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

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

    GET参数通过URL传递,POST放在Request body中。

    GET产生一个TCP数据包,POST产生两个TCP数据包

    2、PHP 的垃圾回收机制

    PHP 可以自动进行内存管理,清除不需要的对象。

    PHP 使用了引用计数 (reference counting) GC 机制。

    每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。

    3、什么是 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 的进程管理器,支持平滑重启,可以启动的时候预先生成多个进程。

    4、什么是 Redis 穿透和雪崩

    缓存穿透就是访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询.

    如果是黑客,进行恶意攻击的时候,每次都请求超过2000个/秒的时候,这个时候mysql基本上就挂了.

    解决办法是:每次从数据库中查询到一个不存在的key的时候,就写一个空值到缓存库中,有恶意攻击的时候,直接从缓存中取到这个空值.

    缓存雪崩就是每秒有5000个请求过来时候,redis缓存库崩了,然后这些请求瞬间落在了mysql数据库上,直接导致数据库死机.

    解决方案就是:

    事前:提高缓存库的高可用, 使用主从结构加哨兵 cluster集群,

    事中:使用ehcache+hystrix限流组件(当请求量非常巨大的时候,就调用自己开发好的一个降级饿组件,返回一些默认值,如友情提示,或者空白值)

    事后:做持久化,尽快恢复缓存集群,一旦恢复,自动从磁盘上读取数据,恢复内存中的数据.

    5、约瑟夫环问题,猴子选大王

    一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。

    6、冒泡排序

    思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

    代码实现:

    7、redis 消息队列先进先出需要注意什么?

    通常使用一个list来实现队列操作,这样有一个小限制,所以的任务统一都是先进先出,如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务,实现方式有以下几种方式:

    A)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)

    B)使用两个队列,一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看,并在找到的第一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0

    list1 做为高优先级任务队列

    list2 做为普通任务队列

    这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务

    方式1最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护

    方式2是推荐用法,实际应用最为合适

    8、Redis 如何防止高并发?

    其实redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。我们使用的时候,可能会出现并发问题,比如获得和设定这一对。Redis的为什么 有高并发问题?Redis的的出身决定

    Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。

    同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。

    在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。

    解决办法

    在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

    服务器角度,利用setnx变向实现锁机制。

    9、说说对 SQL 语句优化有哪些方法?

    (1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

    (2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

    (3) 避免在索引列上使用计算

    (4)避免在索引列上使用IS NULL和IS NOT NULL

    (5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    (6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    (7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

    10、我应该在什么时候使用 require 和 include 呢?

    require() 函数与 include() 函数相同,只是它处理错误的方式不同。如果出现错误,include() 函数会生成警告,但脚本会继续执行。require() 函数会产生致命错误,脚本会停止。

    我的建议是 99.9% 的时间里只使用 require_once。

    使用 require 或 include 代替意味着您的代码在其他地方不可重用,即您引入的脚本实际上是在执行代码,而不是提供类或某些类功能库。

    11、PHP 中的 stdClass 是什么?

    stdClass 只是将其他类型强制转换为对象时使用的通用” 空’’类。stdClass 不是 PHP 中对象的基类。这可以很容易地证明:

    对于匿名对象,动态属性等很有用。

    考虑 StdClass 的一种简单使用场景是替代关联数组。请参见下面的示例,该示例显示 json_decode() 如何允许获取 StdClass 实例或关联数组。

    同样但未在本示例中显示的SoapClient::__soapCall返回一个StdClass实例。

    12、PHP 中的 die () 和 exit () 函数有什么不同?

    没有区别,它们是一样的。 选择die()而不是exit()的唯一好处可能是你节省了额外键入一个字母的时间。

    13、isset () 和 array_key_exists () 之间有什么区别?

    array_key_exists 它会告诉你数组中是否存在键,并在 $a 不存在时报错。

    如果 key 或变量存在且不是 null,isset 才会返回 true。当 $a 不存在时,isset 不会报错。

    考虑:

    14、var_dump () 和 print_r () 有什么不同?

    var_dump函数用于显示变量 / 表达式的结构化信息,包括变量类型和变量值。数组递归浏览,缩进值以显示结构。它还显示哪些数组值和对象属性是引用。

    print_r()函数以我们可读的方式显示有关变量的信息。数组值将以键和元素的格式显示。类似的符号用于对象。

    考虑:

    var_dump($obj)将在屏幕的输出下方显示:

    print_r($obj)将在屏幕的输出下方显示:

    15、如何在 PHP 中启用错误报告?

    检查 php.ini 中的 “display_errors” 是否等于 “on”,或者在脚本中声明 “ini_set('display_error',1)”。

    然后,在你的代码中包含 “ERROR_REPORTING(E_ALL)”,以便在脚本执行期间显示所有类型的错误消息。

    16、我们如何在 PHP 中处理异常?

    当程序执行出现异常报错时,后面的代码将不会再执行,这时 PHP 将会尝试匹配第一个 catch 块进行异常的处理,如果没有捕捉到异常程序将会报致命错误并显示”Uncaught Exception”。

    可以在 PHP 中抛出和捕获异常。

    为了处理异常,代码可以被包围在”try” 块中.

    每个 try 必须至少有一个对应的catch块 。多个不同的 catch 块可用于捕获不同类的异常。

    在 catch 块中也可以抛出异常(或重新抛出之前的异常)。

    思考:

    17、PHP 和 Javascript 是如何交互的?

    PHP 和 Javascript 无法直接进行交互,因为 PHP 是一种服务器端语言,而 Javascript 是一种浏览器语言。但是,我们可以交换变量,因为 PHP 可以生成将由浏览器执行的 Javascript 代码,并且可以通过 URL 将特定的变量传递回 PHP。

    18、PHP 处理图片需要添加什么扩展?

    需要 GD 库来执行处理图片功能。

    19、获取图片属性(size, width, 和 height)的函数是什么?

    获取图片大小 size:getimagesize ();获取图片宽度 width:imagesx ();获取图片高度 height:imagesy ()。

    20、如何使用 PHP 脚本显示文本?

    可以使用以下两种方法:

    <!--?php echo "Method 1"; print "Method 2"; ?-->

    21如何将数据导出到 Excel 文件中?

    最常见和常用的方法是将数据转换为 Excel 支持的格式。例如,可以编写 .csv 文件,例如选择逗号作为字段之间的分隔符,然后使用 Excel 打开文件。

    22、如何在 PHP 中处理 MySQL 的结果集?

    可以使用 mysqli_fetch_array, mysqli_fetch_assoc, mysqli_fetch_object or mysqli_fetch_row 函数处理。可以关注博主的微信公众号  “PHP大神”  回复  “面试题”  即可获取更多PHP面试题

    23、如何检查给定变量的值为字母和数字字符?

    可以使用专用函数 ctype_alnum 来检查它是否为字母数字字符。

    24、哪种加密扩展可以生成和验证数字签名?

    PHP-OpenSSL 扩展提供了几种加密操作,包括数字签名的生成和验证。

    25、如何在 PHP 中强制转换类型?

    输出类型的名称必须在要强制转换的变量前的括号中指定,如下所示:

    (int), (integer) - 强制转换为整型

    (bool), (boolean) - 强制转换为布尔值

    (float), (double), (real) - 强制转换为浮点型

    (string) - 强制转换为字符串

    (array) - 强制转换为数组

    (object) - 强制转换为对象

    26、PHP 中如何使用三元条件运算符?

    它由三个表达式组成:一个条件和两个操作数,它们描述在指定条件为 true 或 false 时应执行的指令,如下所示:

    Expression_1?Expression_2 : Expression_3;

    27、如何完成微信的接口配置? 以及配置失败的原因?

    填写的URL需要正确响应微信发送的Token验证

    失败原因未删除里面的html文件

    28、如何获取微信发送的内容?

    $postStr = file_get_contents("php://input");

    29、网页授权用户消息流程步骤

    引导用户进入授权页面同意授权,获取code

    通过code换取网页授权access_token(与基础支持中的access_token不同)

    如果需要,开发者可以刷新网页授权access_token,避免过期

    通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

    30、描述小程序的框架

    框架名称:MINA (MINA IS NOT APP) 是在微信中开发小程序的框架。

    框架结构 :MINA 框架由两部分组成。视图层 (View) 和逻辑层 (App Service)。

    框架特征:响应式的数据绑定 (MINA 用响应式数据绑定的方式,在视图层和逻辑层之间进行通信。从某种程度上,可以看成是 MVVM 模式。)

    结构:MINA 程序包含一个描述整体程序的 app 和多个描述各自页面的 page。

    一个 MINA 程序主体部分由三个文件组成,必须放在根目录下。

    Paste_Image.png

    一个 MINA 页面由四个文件组成。

    31、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?

    使用 keys 指令可以扫出指定模式的 key 列表。

    对方接着追问:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题?

    这个时候你要回答 redis 关键的一个特性:redis 的单线程的。keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。

    32、使用过 Redis 做异步队列么,你是怎么用的?

    一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。

    如果对方追问可不可以不用 sleep 呢?list 还有个指令叫 blpop,在没有消息的时候,它会阻塞住直到消息到来。

    如果对方追问能不能生产一次消费多次呢?使用 pub/sub 主题订阅者模式,可以实现 1:N 的消息队列。

    如果对方追问 pub/sub 有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 rabbitmq 等。

    如果对方追问 redis 如何实现延时队列?我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用 sortedset,拿时间戳作为 score,消息内容作为 key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。

    33、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

    如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

    34、Yii2 的自动加载原理

    检查类名是否已缓存在$classMap或$_coreClasses数组中,如果是则直接require相应的文件路径,$_coreClasses是框架自有类的映射表;否则去第2步;

    检测YiiBase::$enableIncludePath是否为false,如果是则去第3步,否则直接include($className . '.php')

    遍历$includePaths数组,将目录名拼接上类名,检查是否为合法的php文件,如果是则include,然后跳出循环

    结束。

    35、进程和线程的关系

    进程就像地主,有土地(系统资源),线程就像佃户(线程,执行种地流程)。每个地主(进程)只要有一个干活的佃户(线程)。

    进程-资源分配的最小单位,相对健壮,崩溃一般不影响其他进程,但是切换进程时耗费资源,效率差些。

    线程-程序执行的最小单位,没有独立的地址空间,一个线程死掉可能整个进程就死掉,但是节省资源,切换效率高。

    36、php 编程常见的进程和线程

    在web应用中,我们每次访问php,就建立一个PHP进程,当然也会建立至少一个PHP线程。

    PHP使用pcntl来进行多进程编程

    PHP中使用pthreads来进行多线程编程

    nginx的每个进程只有一个线程,每个线程可以处理多个客户端的访问

    php-fpm使用多进程模型,每个进程只有一个线程,每个线程只能处理一个客户端访问。

    apache可能使用多进程模型,也可能使用多线程模型,取决于使用哪种SAPI.

    进程是cpu资源分配的最小单位,线程是cpu调度的最小单位

    37、如何设计支付接口

    接口规则

    传输方式 为保证交易安全性,采用HTTPS传输

    提交方式 采用POST方法提交

    数据格式 提交和返回数据都为XML格式,根节点名为xml

    字符编码 统一采用UTF-8字符编码

    签名算法 MD5,后续会兼容SHA1、SHA256、HMAC等。

    签名要求 请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法

    证书要求 调用申请退款、撤销订单接口需要商户证书

    判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态

    参数规定

    交易金额

    交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。

    外币交易的支付金额精确到币种的最小单位,参数值不能带小数点。

    交易类型

    JSAPI--JSAPI支付(或小程序支付)、NATIVE--Native支付、APP--app支付,MWEB--H5支付,不同trade_type决定了调起支付的方式,请根据支付产品正确上传

    MICROPAY--付款码支付,付款码支付有单独的支付接口,所以接口不需要上传,该字段在对账单中会出现

    货币类型

    货币类型的取值列表:

    CNY:人民币

    时间

    标准北京时间,时区为东八区;如果商户的系统时间为非标准北京时间。参数值必须根据商户系统所在时区先换算成标准北京时间, 例如商户所在地为0时区的伦敦,当地时间为2014年11月11日0时0分0秒,换算成北京时间为2014年11月11日8时0分0秒。

    时间戳

    标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数。注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。

    商户订单号

    商户支付的订单号由商户自定义生成,仅支持使用字母、数字、中划线-、下划线_、竖线|、星号*这些英文半角字符的组合,请勿使用汉字或全角等特殊字符。微信支付要求商户订单号保持唯一性(建议根据当前系统时间加随机序列来生成订单号)。重新发起一笔支付要使用原订单号,避免重复支付;已支付过或已调用关单、撤销(请见后文的API列表)的订单号不能重新发起支付。

    body字段格式

    使用场景 支付模式 商品字段规则 样例 备注

    PC网站 扫码支付 浏览器打开的网站主页title名 -商品概述 腾讯充值中心-QQ会员充值

    微信浏览器 公众号支付 商家名称-销售商品类目 腾讯-游戏 线上电商,商家名称必须为实际销售商品的商家

    门店扫码 公众号支付 店名-销售商品类目 小张南山店-超市 线下门店支付

    门店扫码 扫码支付 店名-销售商品类目 小张南山店-超市 线下门店支付

    门店刷卡 刷卡支付 店名-销售商品类目 小张南山店-超市 线下门店支付

    第三方手机浏览器 H5支付 浏览器打开的移动网页的主页title名-商品概述 腾讯充值中心-QQ会员充值

    第三方APP APP支付 应用市场上的APP名字-商品概述 天天爱消除-游戏充值

    银行类型

    安全规范

    签名算法

    (签名校验工具)

    签名生成的通用步骤如下:

    第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

    特别注意以下重要规则:

    ◆ 参数名ASCII码从小到大排序(字典序);

    ◆ 如果参数的值为空不参与签名;

    ◆ 参数名区分大小写;

    ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。

    ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

    第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

    ◆ key设置路径:微信商户平台(微信支付 - 中国领先的第三方支付平台 | 微信支付提供安全快捷的支付方式)-->账户设置-->API安全-->密钥设置

    第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

    第二步:拼接API密钥:

    生成随机数算法

    微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。

    API证书

    获取API证书(什么是api证书?如何升级?)

    微信支付接口中,涉及资金回滚的接口会使用到API证书,包括退款、撤销接口。商家在申请微信支付成功后,收到的相应邮件后,可以按照指引下载API证书,也可以按照以下路径下载:微信商户平台(微信支付 - 中国领先的第三方支付平台 | 微信支付提供安全快捷的支付方式)-->账户中心-->账户设置-->API安全 。证书文件说明如下:

    证书附件 描述 使用场景 备注

    pkcs12格式

    (apiclient_cert.p12、 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 撤销、退款申请API中调用 windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:10010000)

    以下两个证书在PHP环境中使用:

    证书附件 描述 使用场景 备注

    证书pem格式

    (apiclient_cert.pem) 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 PHP等不能直接使用p12文件,而需要使用pem,为了方便您使用,已为您直接提供 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem

    证书密钥pem格式

    (apiclient_key.pem) 从apiclient_key.pem中导出密钥部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 PHP等不能直接使用p12文件,而需要使用pem,为了方便您使用,已为您直接提供 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem

    使用API证书

    ◆ apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。

    ◆ 商户如果使用.NET环境开发,请确认Framework版本大于2.0,必须在操作系统上双击安装证书apiclient_cert.p12后才能被正常调用。

    ◆ API证书调用或安装需要使用到密码,该密码的值为微信商户号(mch_id)

    API证书安全

    证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载;

    建议将证书文件名改为复杂且不容易猜测的文件名;

    商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。

    商户回调API安全

    在普通的网络环境下,HTTP请求存在DNS劫持、运营商插入广告、数据被窃取,正常数据被修改等安全风险。商户回调接口使用HTTPS协议可以保证数据传输的安全性。所以微信支付建议商户提供给微信支付的各种回调采用HTTPS协议。

    38、三次握手,四次挥手,为什么是三次握手四次挥手

    四次挥手

    TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作。

    由于TCP连接时全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成他的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    这是因为服务端的LISTEN状态下的socket当收到SYN报文连接的请求后,它可以把ACK和SYN放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,他仅仅表示对方没有数据发送给你了,但未必你的所有数据都全部发送给对方了,所以你可以不马上关闭socket,即你可能还会发送一些数据给对方之后,在发送FIN报文给对方来表示你同意现在可以关闭连接了,所以这里的ACK和FIN报文多情况下都是分开发送的。

    39、可以关注博主的微信公众号  “PHP大神”  回复  “面试题”  即可获取更多PHP面试题

    展开全文
  • 2021年最新PHP面试题(附带答案)

    万次阅读 2021-06-23 18:58:31
    php面试题的题型很多,但是都离不开PHP面试题基础常见的。没有经验的可能不懂试题,告诉你一个方法,那个时候我真的用了,就是把所有题型都背下来!方法很老套又不切合实际,但是很有用!因为常见的PHP面试题型都...

    一、前言

    在进入你心仪的公司之前,会有一到两轮的面试与笔试,做我们这个行业的都是这样,所以除了口语表达能力(能吹)之外,还有一点就是实力!这也是你的php面试题所要体现的。php面试题的题型很多,但是都离不开PHP面试题基础常见的。没有经验的可能不懂试题,告诉你一个方法,那个时候我真的用了,就是把所有题型都背下来!方法很老套又不切合实际,但是很有用!因为常见的PHP面试题型都遇到了~~可能是幸运吧!

    博主已将php相关面试题汇总整理成了PDF版的PHP面试宝典,关注微 信 公 众 号 “PHP大神” 回复“面试题”即可获取!

    二、PHP常见面试题

    1.详述一次完整的HTTP请求过程

    这个问题的核心是域名解析和服务器(nginx)解析这两部分,基本上这两部分详细阐述就可以了。

    步骤一、解析URL

    浏览器会解析当前的URL数据,判断此URL是否为合法的链接。如果是合法链接则正常的向下一步骤前进。如果不是合法的链接,则会执行搜索功能,例如执行百度、360、Google搜索等。

    步骤二、解析域名

    服务器是以ip的形式存在的。而域名需要解析到ip上,解析IP会有三个小的步骤:

    1)、从浏览器自身的缓存中解析此域名数据

    2)、从本地电脑的HOST文件中解析域名

    3)、通过DNS服务器解析域名

    步骤三、拿信息

    这个步骤我们拿到了URL的信息,主要是IP和端口信息。

    步骤四、封包并进行三次握手

    浏览器将请求信息进行打包,通过TCP的三次握手将数据传递至服务器。

    步骤五、服务器解析、处理、返回数据

    服务器通过种种层级、方式拿到传递的数据,对数据进行分析、处理,最后返回响应类MIME类型数据。正常状态码为200,非正常的错误码有404、500、501等等

    步骤六、浏览器获得、渲染、展现数据

    浏览器从服务器拿到数据、通过加载资源、渲染页面等操作,将页面展现给用户。

    2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

    1)、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。

    2)、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。

    禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

    3.HTTP 状态中302、403、 500代码含义?

    一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列

    302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。

    4. Linux 下建立压缩包,解压缩包的命令

    Tar.gz:

    打包: tar czf file.tar.gz file.txt

    解压: tar xzf file.tar.gz

    Bz2:

    打包: bzip2 [-k] 文件

    解压: bunzip2 [-k] 文件

    Gzip(只对文件,不保留原文件)

    打包: gzip file1.txt

    解压: gunzip file1.txt.gz

    Zip: -r 对目录

    打包: zip file1.zip file1.txt

    解压: unzip file1.zip

    5. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?

    Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型 Varchar 与char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。 Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

    6. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?

    MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。

    创建索引:alert table tablename add index (`字段名`)

    7. 不使用cookie向客户端发送一个cookie.

    理解:session_start()开启时,生成一个常量 SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。通过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面可以使用SESSION里面的值。 当客户端开启COOKIE和服务器端开启SESSION时。 浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID. 当浏览器第二次请求时,会把已存在

    8. isset() 和 empty() 区别

    Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。

    9.持久化redis有几种方式?

    答:主要有两种方式:

    1) 快照持久化

    在redis配置文件中已经自动开启了,

    格式是:save N M

    表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。

    当然我们也可以手动执行save或者bgsave(异步)命令来做快照

    2)append only file  AOF持久化

     总共有三种模式,如

    appendfsync everysec默认的是每秒强制写入磁盘一次

    appendfsync always 每次执行写操作的时候就强制写入磁盘

    appendfsync no 完全取决于os,性能最好但是持久化没法保证

    其中第三种模式最好。redis默认的也是采取第三种模式。

    10.mysql存储引擎

    答:常用的主要分为两种,一种是innodb,一种是myisam,两者的主要区别是

    1)myisam不支持事务处理,而innoDB支持事务处理

    2)myisam 不支持外键,innoDB支持外键

    3)myisam支持全文检索,而innoDB在MySQL5.6版本之后才支持全文检索

    4)数据的存储形式不一样,mysiam表存放在三个文件:结构、索引、数据,innoDB存储把结构存储为一个文件,索引和数据存储为一个文件

    5)myisam在查询和增加数据性能更优于innoDB,innoDB在批量删除方面性能较高。

    6)myisam支持表锁,而innoDB支持行锁

    11.sql注入是什么及如何预防sql注入?

    答:SQL注入攻击指的是用户或者黑客通过构建特殊的输入作为参数传入我们的Web应用程序端,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序员没有细致地过滤用户输入的数据,致使非法数据侵入系统而造成的。因此我们在做开发过程中一定要预防sql注入,主要从两方面着手:

    1)占位符的方式,就是对sql语句进行预处理,然后执行sql语句

    2)通过addslashes或者mysql_real_escape_string这两个函数对用户输入的值进行转义处理,把一些特殊的字符转义掉。

    12.有用过预处理么?

    答:用过,PDO类中,有个prepare方法可以实现预处理,PDOStament类中 的excute方法可以执行预处理,预处理的参数分为两种,一种是:字符串占位符,另一种是?占位符,:字符串占位符在执行预处理传递参数时传入的是关联数组,而?占位符传递的是索引数组。两者不能混合使用,但一般推荐使用:字符串占位符。

    13.用框架还用自己的处理吗

    答:一般成熟的开源框架中都考虑到了数据安全这方面的东西,但有时候我们可能会使用一些原生的SQL语句时,我们就需要考虑自己对sql语句进行预处理。当然有时候框架中的过滤方法我们不希望采用,比如使用文本编辑器时,我们可以使用自己的过滤方式。

    14.mysql优化怎么做的?

    答:mysql优化主要从以下几个方面来实现:

      1)设计角度:存储引擎的选择,字段类型选择,范式

      2)功能角度:可以利用mysql自身的特性,如索引,查询缓存,碎片整理,分区、分表等

      3)sql语句的优化方面:尽量简化查询语句,能查询字段少就尽量少查询字段,优化分页语句、分组语句等。

      4)部署大负载架构体系:数据库服务器单独出来,负载大时可以采用主从复制,读写分离机制进行设计

      5)从硬件上升级数据库服务器。

    15.请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?

    按值传递:函数范围内对值的任何改变在函数外部都会被忽略

    按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

    优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

    16.在PHP中error_reporting这个函数有什么作用?

    设置 PHP 的报错级别并返回当前级别。

    17.使用PHP描述快速排序算法,对象可以是一个数组吗?

    原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:

    (1)从数列中挑出一个元素,称该元素为“基准”。

    (2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。

    (3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。

    //快速排序(数组排序)
    function QuickSort($arr){
     $num = count($arr);
     $l=$r=0;
     for($i=1;$i<$num;$i++){
      if($arr[$i] < $arr[0]){
       $left[] = $arr[$i];
       $l++;
      }else{
       $right[] = $arr[$i];
       $r++;
      }
     }
     if($l > 1){
      $left = QuickSort($left);
     }
     $new_arr = $left;
     $new_arr[] = $arr[0];
     if($r > 1){
      $right = QuickSort($right);
     }
     for($i=0;$i<$r;$i++){
      $new_arr[] = $right[$i];
     }
     return $new_arr;
    }

    18.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

    //二分查找(数组里查找某个元素)
    function bin_sch($array, $low, $high, $k){
     if ($low <= $high){
      $mid = intval(($low+$high)/2);
      if ($array[$mid] == $k){
       return $mid;
      }elseif ($k < $array[$mid]){
       return bin_sch($array, $low, $mid-1, $k);
      }else{
       return bin_sch($array, $mid+1, $high, $k);
      }
     }
     return -1;
    }
    //顺序查找(数组里查找某个元素)
    function seq_sch($array, $n, $k){
     $array[$n] = $k;
     for($i=0; $i<$n; $i++){
      if($array[$i]==$k){
       break;
      }
     }
     if ($i<$n){
      return $i;
     }else{
      return -1;
     }
    }

    19.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())

    //二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序
    function array_sort($arr, $keys, $order=0) {
     if (!is_array($arr)) {
      return false;
     }
     $keysvalue = array();
     foreach($arr as $key => $val) {
      $keysvalue[$key] = $val[$keys];
     }
     if($order == 0){
      asort($keysvalue);
     }else {
      arsort($keysvalue);
     }
     reset($keysvalue);
     foreach($keysvalue as $key => $vals) {
      $keysort[$key] = $key;
     }
     $new_array = array();
     foreach($keysort as $key => $val) {
      $new_array[$key] = $arr[$val];
     }
     return $new_array;
    }

    20.对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息

    class regx { 
     public static function check($str) { 
     if(preg_match("/^([1-9,])+$/",$str)) { 
      return true; 
     } 
     return false; 
     } 
    } 
    $str="12345,6"; 
    if(regx::check($str)) { 
    echo "suc"; 
    } else { 
    echo "fail"; 
    }

    21.单例模式,创建mysqli数据库链接的单例对象

    class Db { 
     private static $instance; 
     public $handle; 
     Private function __construct($host,$username,$password,$dbname) { 
      $this->handle=NULL; 
      $this->getcon($host,$username,$password,$dbname); 
     } 
     public static function getBb() { 
      self::$instance=new Db(); 
      return self::$instance; 
     } 
     private function getcon($host,$username,$password,$dbname) { 
      if($this->handle!=NULL){ 
       return true; 
      } 
      $this->handle=mysqli_connect($host,$username,$password,$dbname); 
     } 
    }

    22.PHP session扩展默认将session数据储存在哪里? D

    A) SQLite Database

    B) MySQL Database

    C) Shared Memory

    D) File System

    E) Session Server

    23.PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换

    答:原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)

    手动解决:用str_split(string string,intstring,intsplit_length = 1)按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。

    <?php  
    function mystrtoupper($a){  
        $b = str_split($a, 1);  
        $r = '';  
        foreach($b as $v){  
            $v = ord($v);  
            if($v >= 97 && $v<= 122){  
                $v -= 32;  
            }  
            $r .= chr($v);  
        }  
        return $r;  
    }  
     
     
    $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';  
    echo 'origin string:'.$a."\n";  
    echo 'result string:';  
    $r = mystrtoupper($a);  
    var_dump($r); 

    24.PHP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写,请写一个函数来判断目录/文件是否绝对可写

    答:其中bug存在两个方面, 
    1)在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。 
    如果是目录,在目录中新建文件并通过打开文件来判断; 
    如果是文件,可以通过打开文件(fopen),来测试文件是否可写。

    2)在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。 
    读取配置文件是否safe_mode是否开启。

    /**
    * Tests for file writability
    *
    * is_writable() returns TRUE on Windows servers when you really can't write to
    * the file, based on the read-only attribute. is_writable() is also unreliable
    * on Unix servers if safe_mode is on.
    *
    * @access   private
    * @return   void
    */
    if ( ! function_exists('is_really_writable'))
    {
        function is_really_writable($file)
        {
        // If we're on a Unix server with safe_mode off we call is_writable
        if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
        {
            return is_writable($file);
        }
     
        // For windows servers and safe_mode "on" installations we'll actually
        // write a file then read it. Bah...
        if (is_dir($file))
        {
            $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
     
            if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
            {
                return FALSE;
            }
     
            fclose($fp);
            @chmod($file, DIR_WRITE_MODE);
            @unlink($file);
            return TRUE;
        } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
            return FALSE;
        }
     
        fclose($fp);
        return TRUE;
        }
    }

    25.PHP处理上传文件信息数组中的文件类型$_FILES[‘type’]由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠

    答:用getimagesize来判断上传图片的类型比$_FILES函数的type更可靠 
    同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话, 
    就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。 
    可以通过getimagesize()函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组

    Array
    (
        [0] => 331
        [1] => 234
        [2] => 3
        [3] => width="331" height="234"
        [bits] => 8
        [mime] => image/png
    );

    26.如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

    答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交) 

    1)屏蔽错误,将display_errors 设置为off 
    2)过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤

    这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。
          1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句
          2 使用addslashes 将所有特殊字符过滤
          3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成  \'

    3)可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容 
    4)可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php

    27.请写出让PHP能够在命令行下以脚本方式执行时安装PHP所必须指定的configure参数,并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?

    答:由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php

    php -f “index.php” 
    php -r “print_r(get_defined_constants());”

    28.PHP的垃圾收集机制是怎样的?

    说明: 
    1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分 
    2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。 
    3)对,则有分,错误不扣,不写无分。

    答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

    29.get和post的区别?

    1. get是从服务器上获取数据,post是向服务器传送数据。
    2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
    4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
    

    30.如何修改会话的生存时间?

    一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间
    二:代码实现      $ lifeTime = 24 * 3600; //保存一天
        session_set_cookie_params($ lifeTime); 
        在session_start(); 
    

    31.微信支付回调失败该如何处理?

    他问的是已经支付成功后,但是回调失败了。

    自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。

    32.调用区块链接口的安全措施,有那些实现方法?

    来自PHP技术交流群 群友分享

    1. 使用MD5实现对接口加签,目的是为了防止篡改数据。
    2. 基于网关实现黑明单与白名单拦截
    3. 可以使用rsa非对称加密 公钥和私钥互换
    4. 如果是开放接口的话,可以采用oath2.0协议
    5. 使用Https协议加密传输,但是传输速度慢
    6. 对一些特殊字符实现过滤 防止xss、sql注入的攻击
    7. 定期使用第三方安全扫描插件
    8. 接口采用dto、do实现参数转化 ,达到敏感信息脱敏效果
    9. 使用token+图形验证码方法实现防止模拟请求
    10. 使用对ip访问实现接口的限流,对短时间内同一个请求(ip)一直访问接口 进行限制。

    33.服务器受到dos攻击,这个问题如何应付?

    看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。

    • 对于特定的IP访问的情况,限制IP访问
    • 限制同一IP在单位时间内的访问次数
    • 上级服务器,提高吞吐能力

    是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。

    34.简述Linux下安装Mysql的过程?

    Groupadd mysql 添加一个用户组mysql
    Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql
    Cd /lamp/mysql 进入mysql目录
    ./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all
    Make
    Make all

    35.对于大流量的网站,您采用什么样的方法来解决访问量问题?

    优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:

    • 确定当前服务器设备是否满足流量需求。
    • 使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
    • 禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
    • 控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
    • 使用不同的主机分流主要流量,使服务器均衡负载。
    • 使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

    36.对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:

    1)索引的目的是什么?

    • 快速访问数据表中的特定信息,提高检索速度
    • 创建唯一性索引,保证数据库表中每一行数据的唯一性
    • 加速表和表之间的连接
    • 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

    2) 索引对数据库系统的负面影响是什么?

    负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。

    3) 为数据表建立索引的原则有哪些?

    • 在最频繁使用的、用以缩小查询范围的字段上建立索引
    • 在平频繁使用的、需要排序的字段上建立索引

    4) 什么情况下不宜建立索引?

    • 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
    • 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。

    37.PHP字符串中单引号与双引号的区别?

    单引号不能解释变量,而双引号可以解释变量。

    单引号不能转义字符,在双引号中可以转义字符。

    38.求两个日期的差数,例如2021-2-5 ~ 2021-3-6 的日期差数

    方法一:
    <?php
    class Dtime{
     function get_days($date1, $date2){
      $time1 = strtotime($date1);
      $time2 = strtotime($date2);
      return ($time2-$time1)/86400;
     }
    }
    $Dtime = new Dtime;
    echo $Dtime->get_days(’2021-2-5′, ’2021-3-6′);
    ?>
    方法二:
    <?php
    $temp = explode(‘-’, ’2021-2-5′);
    $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
    $temp = explode(‘-’, ’2021-3-6′);
    $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
    echo ($time2-$time1)/86400;
    方法三:echo abs(strtotime(“2021-2-5″)-strtotime(“2021-3-1″))/60/60/24 计算时间差

    39.有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)

    <?php
    function BubbleSort(&$arr){
     $cnt=count($arr);
     $flag=1;
     for($i=0;$i<$cnt;$i++){
     if($flag==0){
      return;
     }
     $flag=0;
     for($j=0;$j<$cnt-$i-1;$j++){
      if($arr[$j]>$arr[$j+1]){
       $tmp=$arr[$j];
       $arr[$j]=$arr[$j+1];
       $arr[$j+1]=$tmp;
       $flag=1;
      }
     }
     }
    }
    $test=array(1,3,6,8,2,7);
    BubbleSort($test);
    var_dump($test);

    40.博主已将php相关面试题汇总整理成了一个PDF版的PHP面试宝典,关注微 信 公 众 号 “PHP大神” 回复“面试题”即可获取!

    展开全文
  • php面试题和进阶资料

    2018-09-28 12:22:10
    里面包含php面试题库和进阶资料,很实用,有这方面需要的可以看看
  • 大公司的php面试题

    2016-10-23 20:22:23
    大公司的php面试题,要面试的php程序员们可以参考
  • PHP面试题整合,自己在网上整合的PHP面试题集锦,有简单的算法,有简单的PHP基础,还有mysql相关
  • php面试题题库

    2019-03-01 00:59:37
    这篇文章介绍的内容是关于最全最详细的PHP面试题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
  • php面试题和答案php

    2022-03-27 14:38:21
    php面试题和答案

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,611
精华内容 13,444
关键字:

PHP面试题