2019年腾讯PHP程序员面试题目分享

有须要学习交流的友人请加入交流群的我们一块儿,有问题一块儿交流,一块儿进步!前提是你是学技术的。感谢阅读!php

点此加入该群​jq.qq.comcss

 

1. php 的垃圾回收机制html

PHP 能够自动进行内存管理,清除不须要的对象。前端

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

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

2. session 与 cookie 的区别和联系web

区别:ajax

1. 存放位置:Session 保存在服务器,Cookie 保存在客户端。正则表达式

2. 存放的形式:Session 是以对象的形式保存在服务器,Cookie 以字符串的形式保存在客户端。sql

3. 用途:Cookies 适合作保存用户的我的设置,爱好等,Session 适合作客户的身份验证

4. 路径:Session 不能区分路径,同一个用户在访问一个网站期间,全部的 Session 在任何一个地方均可以访问到。而 Cookie 中若是设置了路径参数,那么同一个网站中不一样路径下的 Cookie 互相是访问不到的。

5. 安全性:Cookie 不是很安全,别人能够分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session

6. 大小以及数量限制:每一个域名所包含的 cookie 数:IE7/8,FireFox:50 个,Opera30 个; Cookie 总大小:Firefox 和 Safari 容许 cookie 多达 4097 个字节,Opera 容许 cookie 多达 4096 个字 节,InternetExplorer 容许 cookie 多达 4095 个字节;通常认为 Session 没有大小和数量限制。

关系:

Session 须要借助 Cookie 才能正常工做。若是客户端彻底禁止 Cookie,Session 将失效!由于 Session 是由应用服务器维持的一个 服务器端的存储空间,用户在链接服务器时,会由服务器生成一个惟一的 SessionID, 用该 SessionID 为标识符来存取服务器端的 Session 存储空间。

而 SessionID 这一数据则是保存到客户端,用 Cookie 保存的,用户提交页面时,会将这一 SessionID 提交到服务器端,来存取 Session 数据。这一过程,是不用开发人员干预的。因此一旦客户端禁用 Cookie,那么 Session 也会失效。

3. 如何修改 SESSION 的生存时间

一、设置浏览器保存的 sessionid 失效时间 setcookie (session_name (), session_id (), time () + $lifeTime, "/");

二、可使用 SESSION 自带的 session_set_cookie_params (86400); 来设置 Session 的生存期

三、经过修改 php.ini 中的 session.gc_maxlifetime 参数的值就能够改变 session 的生存时间

4. PHP 页面重定向的方法有哪些

 

 

5. PDO、adoDB、PHPLib 数据库抽象层比较

PHP 数据库抽象层就是指,封装了数据库底层操做的介于 PHP 逻辑程序代码和数据库之间的中间件。

PDO 以 PHP 5.1 为基础进行设计,它使用 C 语言作底层开发,设计沿承 PHP 的特色,以简洁易用为准,从严格意义上讲,PDO 应该归为 PHP 5 的 SPL 库之一,而不该该归于数据抽象层,由于其自己和 MySQL 和 MySQLi 扩展库的功能相似。PDO 是不适合用在打算或者有可能会变动数据库的系 统中的。

ADODB 无论后端数据库如何,存取数据库的方式都是一致的;

转移数据库平台时,程序代码也没必要作太大的更动,事实上只须要改动数据库配置文 件。提供了大量的拼装方法,目的就是针对不一样的数据库在抽象层的底层对这些语句进行针对性的翻译,以适应不一样的数据库方言!

可是这个抽象层彷佛体积过于庞 大了,所有文件大概有 500K 左右,若是你作一个很小的网站的话,用这个彷佛大材小用了

PHPLib 多是伴随 PHP 一同成长最老的数据库抽象层(但和 ADODB 相比,它只算是一个 MySQL 抽象类库),这个抽象类使用方法至关简单,体积小,是小型网站开发不错的选择。

PDO 提供预处理语句查询、错误异常处理、灵活取得查询结果(返回数组、字符串、对象、回调函数)、字符过滤防止 SQL 攻击、事务处理、存储过程。

ADODB 支持 缓存查询、移动记录集、(HTML、分页、选择菜单生成)、事务处理、输出到文件。

6. 长链接、短链接的区别和使用

长链接:client 方与 server 方先创建链接,链接创建后不断开,而后再进行报文发送和接收。这种方式下因为通信链接一直存在。此种方式经常使用于 P2P 通讯。

短链接:Client 方与 server 每进行一次报文收发交易时才进行通信链接,交易完毕后当即断开链接。此方式经常使用于一点对多点通信。C/S 通讯。

长链接与短链接的使用时机:

长链接:

短链接多用于操做频繁,点对点的通信,并且链接数不能太多的状况。每一个 TCP 连 接的创建都须要三次握手,每一个 TCP 链接的断开要四次握手。若是每次操做都要创建链接而后再操做的话处理速度会下降,因此每次操做下次操做时直接发送数据 就能够了,不用再创建 TCP 链接。例如:数据库的链接用长链接,若是用短链接频繁的通讯会形成 socket 错误,频繁的 socket 建立也是对资源的浪 费。

短链接:

web 网站的 http 服务通常都用短链接。由于长链接对于服务器来讲要耗费必定 的资源。像 web 网站这么频繁的成千上万甚至上亿客户端的链接用短链接更省一些资源。试想若是都用长链接,并且同时用成千上万的用户,每一个用户都占有一个 链接的话,可想而知服务器的压力有多大。因此并发量大,可是每一个用户又不需频繁操做的状况下须要短链接。

7. HTTP 协议详解、应用

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、短链接、灵活、应用层的协议,常基于 TCP 的链接方式。

(HTTP 响应状态码)

HTTP 响应状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息 -- 表示请求已接收,继续处理

2xx:成功 -- 表示请求已被成功接收、理解、接受

3xx:重定向 -- 要完成请求必须进行更进一步的操做

4xx:客户端错误 -- 请求有语法错误或请求没法实现

5xx:服务器端错误 -- 服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 OK // 客户端请求成功

400 Bad Request // 客户端请求有语法错误,不能被服务器所理解

401 Unauthorized // 请求未经受权,这个状态代码必须和 WWW-Authenticate 报头域一块儿使用 403 Forbidden // 服务器收到请求,可是拒绝提供服务

404 Not Found // 请求资源不存在,eg:输入了错误的 URL

500 Internal Server Error // 服务器发生不可预期的错误

503 Server Unavailable // 服务器超时 // 可能恢复正常

304 Not Modifed // 自从上次请求后,请求的网页未修改过。

// 服务器返回此响应时,不会返回网页内容。

8. 异构系统通信中的通信加密方案

9. socket 链接步骤

Socket(套接字)概念

套接字(socket)是通讯的基石,是支持 TCP/IP 协议的网络通讯的基本操做单元。它是网络通讯过程当中端点的抽象表示,包含进行网络通讯必须的五种信息:链接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。

Socket 链接过程

创建 Socket 链接至少须要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另外一个运行于服务器端,称为 ServerSocket

套接字之间的链接过程能够分为三个步骤:服务器监听,客户端请求,链接确认。

服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待链接的状态,实时监控网络状态。

客户端请求:是指由客户端的套接字提出链接请求,要链接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要链接的服务器的套接字,指出服务器端套接字的地址和端口号,而后就向服务器端套接字提出链接请求。

链接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的链接请求,它就响应客户端

套接字的请求,创建一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,链接就创建好了。而服务器端套接字继续处于监听状态,继续接收其余客户端套接字的链接请求。

10. TCP 协议,三次握手、四次挥手

TCP 协议 (Transmission Control Protocol) 是主机对主机层的传输控制协议,提供可靠的链接服务,采用三次握手确认创建一个链接,四次挥手断开链接。

位码即 tcp 标志位,有 6 种标示:

SYN (synchronous 创建联机) 同步

ACK (acknowledgement 确认)

PSH (push 传送)

FIN (finish 结束)

RST (reset 重置)

URG (urgent 紧急)

11. php 中经常使用做用类似,性能差别很大的函数区分及举例

12. posix 及 perl 兼容正则比较,及函数性能分析

POSIX 正则和 PCRE 正则最显著的须要知道的不一样点:

一、PCRE 函数须要模式以分隔符闭合.

二、POSIX 兼容正则没有修正符。不像 POSIX, PCRE 扩展没有专门用于大小写不敏感匹配的函数。取而代之的是,支持使用 /i 模式修饰符完成一样的工做。其余模式修饰符一样可用于改变匹配策略.

三、POSIX 函数从最左面开始寻找最长的匹配,可是 PCRE 在第一个合法匹配后中止。若是字符串 不匹

配这没有什么区别,可是若是匹配,二者在结果和速度上都会有差异。为了说明这个不一样,考虑下面的例子 (来自 Jeffrey Friedl 的《精通正则表达式》一书). 使用模式 one (self)?(selfsufficient)? 在字符串 oneselfsufficient 上匹配,PCRE 会匹配到 oneself, 可是使用 POSIX, 结果将是整个字符串 oneselfsufficient. 两个子串都匹配原始字符串,可是 POSIX 将 最长的最为结果.

PCRE 可用的修饰符: (i,s,m)

13. 实现 PERL 正则表达式,抓取 html 文件 a 标签的全部 href 超连接

 

 

14. 预约义变量、魔术变量、魔术方法比较,及做用举例

预约义变量(超级全局变量)

$GLOBALS

$_SERVER

$_GET

$_POST

$_COOKIE

$_SESSION

$_REQUEST

$_ENV

 

 

construct 和 destruct

__autoload

get 和 set

isset 和 unset

call 和 callStatic

__clone

__toString

sleep 和 wakeup

__invoke

 

 

LINE

FILE

DIR

CLASS

FUNCTION

METHOD

NAMESPACE

15. spl 经常使用数据结构类

16. PHP 设计模式

工厂模式

创建一个工厂(一个函数或一个类方法)来制造新的对象

工厂模式 是一种类,它具备为您建立对象的某些方法。您可使用工厂类建立对象,而不直接使用 new。这样,若是您想要更改所建立的对象类型,只需更改该工厂便可。使用该工厂的全部代码会自动更改。

单例模式

某些应用程序资源是独占的,由于有且只有一个此类型的资源。例如,经过数据库句柄到数据库的链接是独占的。您但愿在应用程序中共享数据库句柄,由于在保持链接打开或关闭时,它是一种开销,在获取单个页面的过程当中更是如此。

单元素模式能够知足此要求。

PHP 中的单例模式(singleton pattern):指的是在 PHP 的应用程序的范围内只对指定的类建立一个实例。

在 PHP 中使用单例模式的类一般拥有一个私有构造函数和一个私有克隆函数,以防 止用户经过建立对象或者克隆对其进行实例化。还有一个静态私有成员变量 $instance 与静态方法 getInstance。getInstance 负责对其自己实例化,而后将这个对象存储在 $instance 静态成员变量中,以确保只有一个实例被建立。

观察者模式

命令链模式

策略模式

17. 负载均衡的 web 应用服务器设计,例如 youku

用 PHP 作负载均衡指南

思考如何应对如下问题?

在 Apache 负载均衡的状况下,作 PHP 开发如何考虑一下几方面:

PHP 源文件在服务器、PHP 文件上传处理、相关配置文件、Session 会话放置、日志放置

Apache 负载均衡的原则

轮询均衡策略 (轮询转发请求)

按权重分配均衡策略 (按响应数量转发请求)

权重请求响应负载均衡策略 (按响应流量转发请求)

18. 如何优化前端性能

1) 页面内容的优化

a) 下降请求数

合并 css、js 文件,集成 CSS 图片

b) 减小交互通讯量

压缩技术:压缩 css、js 文件,优化图像,减小 cookie 体积;

合理利用缓存:使用外部 js/css 文件,缓存 ajax;

减小没必要要的通讯量:剔除无用脚本和样式、推迟加载内容、使用 GET 请求

c) 合理利用 “并行” 尽可能避免重定向

慎用 Iframe 样式表置于顶部 脚本放到样式后面加载

d) 节约系统消耗

避免 CSS 表达式、滤镜

2) 服务器的优化

a) b)

c)

d)

19. yahoo 的 34 条前端优化法则

减小 HTTP 请求、利用 CDN 技术、 设置头文件过时或者静态缓存、Gzip 压缩、把 CSS 放顶部、 把 JS 放底部、避免 CSS 表达式、将 JS 和 CSS 外链、减小 DNS 查找、减少 JS 和 CSS 的体积、 避免重定向、删除重复脚本、 配置 ETags、缓存 Ajax、尽早的释放缓冲、

用 GET 方式进行 AJAX 请求、延迟加载组件、 预加载组件、减小 DOM 元素数量、跨域分离组件、

减小 iframe 数量、不要出现 404 页面、减少 Cookie、 对组件使用无 Cookie 的域名、减小 DOM 的访问次数、开发灵活的事件处理句柄、使用 <link> 而非 @import、避免过滤器的使用、优化图片、优化 CSS Sprites、 不要在 HTML 中缩放图片、缩小 favicon. ico 的大小并缓存它、保证组件在 25K 如下、将组件打包进一个多部分的文档中

20. 数据库缓存的基本理论,参考 memcached

什么是 Memcached?

memcached 是高性能的分布式内存缓存服务器。通常的使用目的是,经过缓存数据库查询结果,减小数据库访问次数,以提升动态 Web 应用的速度、提升可扩展性。

虽然 memcached 使用了一样的 “Key=>Value” 方式组织数据,可是它和共享内存、APC 等本地缓存有很是大的区别。Memcached 是分布式的,也就是说 它不是本地的。它基于网络链接(固然它也可使用 localhost)方式完成服务,自己它是一个独立于应用的程序或守护进程(Daemon 方式)

PHP 与 Memcached

Memcached 使用 libevent 库实现网络链接服务,理论上能够处理无限多的链接,可是它和

基于反向代理的 Web 缓存;

基于反向代理的 Web 缓存

21. PHP 安全模式

php 安全模式:safe_mode=on|off

启用 safe_mode 指令将对在共享环境中使用 PHP 时可能有危险的语言特性有所限制。能够将 safe_mode 是指为布尔值 on 来启用,或者设置为 off 和脚本尝试访问的文件的 UID,以此做为限制机制的基础。若是 UID 相同,则执行脚本;不然,脚本失败。

当启用安全模式时,一些限制将生效

一、 全部输入输出函数(例如 fopen ()、file () 和 require ())的适用会受到限制,只能用于与调用这些函数的

脚本有相同拥有者的文件

二、 若是试图经过函数 popen ()、system () 或 exec () 等执行脚本,只有当脚本位于 safe_mode_exec_dir

配置指令指定的目录才可能

三、HTTP 验证获得进一步增强,由于验证脚本用于者的 UID 划入验证领域范围内。此外,当启用安

全模式时,不会设置 PHP_AUTH。

四、若是适用 MySQL 数据库服务器,连接 MySQL 服务器所用的用户名必须与调用 mysql_connect ()

的文件拥有者用户名相同。

如下是一些和安全模式相关的配置选项

 

 

22. 常见的 web 攻击方式

常见攻击

XSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入的恶意 html 代码会被执行,从而达到恶意用户的特殊 目的。

XSS 属于被动式的攻击,由于其被动且很差利用,因此许多人常呼略其危害性。可是随着前端技术的不断进步富客户端的应用愈来愈多,这方面的问题越来 越受关注。

举个简单例子 :

假如你如今是 sns 站点上一个用户,发布信息的功能存在漏洞能够执行 js 你在 此刻输入一个 恶意脚本,那么当前全部看到你新信息的人的浏览器都会执行这个脚本弹出提示框 (很爽吧 弹出广告 :)),若是你作一些更为激进行为呢 后果不可思议。

CSRF (Cross Site Request Forgery),跨站点伪造请求。顾名思义就是 经过伪造链接请求在用户不知情的状况下,让用户以本身的身份来完成攻击者须要达到的一些目的。csrf 的攻击不一样于 xss csrf 须要被攻击者的主动行为触发。这样听来彷佛是有 “被钓鱼” 的嫌疑。

多窗口浏览器这这方面彷佛是有助纣为虐的嫌疑,由于打开的新窗口是具备当前全部 会话的,若是是单浏览器窗口相似 ie6 就不会存在这样的问题,由于每一个窗口都是一个独立的进程。

举个简单例子 : 你正在玩白社会, 看到有人发了一个链接,你点击过去,而后这个链接里面伪造了一个送礼物的表单,这仅仅是一个简单的例子,问题可见通常。

cookie 劫持。经过获取页面的权限,在页面中写一个简单的到恶意站点的请 求,并携带用户的 cookie 获取 cookie 后经过 cookie 就能够直以被盗用户的身份登陆站点。这就是 cookie 劫持。

举个简单例子: 某人写了一篇颇有意思的日志,而后分享给你们,不少人都点击查看而且分享了该日志,一切彷佛都很正常,然而写日志的人却另有用心,在日志中偷偷隐藏了一个 对站外的请求,那么全部看过这片日志的人都会在不知情的状况下把本身的 cookie 发送给了 某人,那么他能够经过任意一我的的 cookie 来登陆这我的的帐户。

SQL 注入攻击

在 SQL 注入攻击 中,用户经过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。

DNS 攻击

拒绝服务攻击

拒绝服务攻击即攻击者想办法让目标机器中止提供服务,是黑客经常使用的攻击手段之。

攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用 IP 欺骗,迫使服务器把合法用户的链接复位,影响合法用户的链接

23. PHP 作好防盗链的基本思想 防盗链

什么是盗链?

盗链是指服务提供商本身不提供服务的内容,经过技术手段绕过其它有利益的最终用户界面 (如广告),直接在本身的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供不多的资源,而真正的服务提供商却得不到任何的收益。

网站盗链会大量消耗被盗链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益。 如何作防盗链?

不按期改名文件或者目录

限制引用页

原理是,服务器获取用户提交信息的网站地址,而后和真正的服务端的地址相比较, 若是一致则代表是站内提交,或者为本身信任的站点提交,不然视为盗链。实现时可使用 HTTP_REFERER1 和 htaccess 文件 (须要启用 mod_Rewrite),结合正则表达式去匹配用户的每个访问请求。

文件假装

文件假装是目前用得最多的一种反盗链技术,通常会结合服务器端动态脚本 (PHP/JSP/ASP)。实际上用户请求的文件地址,只是一个通过假装的脚本文件,这个脚本文件会对用户的请求做认证,通常会检查 Session,Cookie 或 HTTP_REFERER 做为判断是否为盗链的依据。而真实的文件实际隐藏在用户不可以访问的地方,只有用户经过验证之后才会返回给用户

加密认证

这种反盗链方式,先从客户端获取用户信息,而后根据这个信息和用户请求的文件名 字一块儿加密成字符串 (Session ID) 做为身份验证。只有当认证成功之后,服务端才会把用户须要的文件传送给客户。通常咱们会把加密的 Session ID 做为 URL 参数的一部分传递给服务器,因为这个 Session ID 和用户的信息挂钩,因此别人就算是盗取了连接,该 Session ID 也没法经过身份认证,从而达到反盗链的目的。这种方式对于分布式盗链很是有效。

随机附加码

每次,在页面里生成一个附加码,并存在数据库里,和对应的图片相关,访问图片时和此附加码对比,相同则输出图片,不然输出 404 图片

加入水印

24. HTTP 请求头信息和响应头信息

请求头信息

 

 响应头信息

 

 

25. MySQL

MySQL 数据库性能优化

使用 mysqlreport;

正确使用索引:explain 分析查询语句,组合索引,索引反作用(占空间、update)

开启慢查询日志、使用慢查询分析工具 mysqlsla;

索引缓存、索引代价(插入更新索引);

表锁,行锁,行锁反作用(update 多时候变慢),在 select 和 update 混合的状况下,行锁巧妙解决了读写互斥的问题;

开启使用查询缓存;

修改临时表内存空间;

开启线程池;

MySQL Query 语句优化的基本思路和原则

一、优化须要优化的 Query;

二、定位优化对象的性能瓶颈;

三、明确优化目标;

四、从 Explaing 入手;

五、多使用 Profile;

六、永远用小结果集推进大的结果集;

七、尽量在索引中完成排序;

八、只取本身须要的 Columns;

九、仅仅使用最有效的过滤条件;

十、尽量避免复杂的 Join 和子查询。

MySQL 中 MyISAM 引擎和 InnoDB 引擎的区别以及它们的性能

1:Innodb 支持事物,Myisam 不支持

2:锁定机制不同,Myisam 支持表锁定,而 Innodb 支持行锁

3:Myisam 不支持外键,Innodb 能支持

4:Myisam 能在特定环境下支持全文索引,而 Innodb 不支持

5:Myisam 支持数据压缩,Innodb 不支持

6:在数据存储上,Myisam 占用的空间少,Innodb 相对多些

7:Myisam 在批量插入和查询方面速度上有优点,而 Innodb 因为支持行锁,因此在数据修改方面更胜一筹

MySQL 存储引擎

MyISAM:不支持事务、表锁和全文索引,操做速度快

InnoDB:行锁设计、支持外键、支持安全事务

HEAP:数据存放在内存中,临时表

NDB Cluster:MySQL 的簇式数据库引擎

CSV: 存储引擎把数据以逗号分隔的格式存储在文本文件中。

FEDERATED:存储引擎表并不存放数据,它只是指向一台远程 MySQL 数据库服务器上的表 Archive: 只支持 INSERT 和 SELECT 操做,压缩后存储,很是适合存储归档数据

Merge:容许将一系列等同的 MyISAM 表以逻辑方式组合在一块儿,并做为 1 个对象引用它们 表类型,区分表类型

优化表设计的经常使用思路

负载均衡的数据库设计

数据类型及详细定义,区分

26. Apache

性能优化,配置,fastCGI 等几种工做模式

27. Ajax

用 JS 实现 Ajax 功能

 

 

28. Javascript

变量、做用域、做用域链.

相关文章
相关标签/搜索