分享一波腾讯PHP面试题

·  阅读 128

1.php 的垃圾回收机制 

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

2. session 与 cookie 的区别和联系 

区别: 

  • 存放位置:Session 保存在服务器,Cookie 保存在客户端。 
  • 存放的形式:Session 是以对象的形式保存在服务器,Cookie 以字符串的形式保存在客户端。 
  • 用途:Cookies 适合做保存用户的个人设置,爱好等,Session 适合做客户的身份验证
  • 路径:Session 不能区分路径,同一个用户在访问一个网站期间,所有的 Session 在任何一个地方都 可以访问到。而 Cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 Cookie 互相是访问 不到的。 
  • 安全性:Cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全 应当使用 session 
  • 大小以及数量限制:每个域名所包含的 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.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、分页、选择菜单生成)、事务处理、输出到文件。 

5.长连接、短连接的区别和使用 

长连接:client 方与 server 方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方 式下由于通讯连接一直存在。此种方式常用于 P2P 通信。 

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

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

长连接:短连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。每个 TCP 连 接的建立 都需要三次握手,每个 TCP 连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速 度会降低,所以每次操作下次操作时直接发送数据 就可以了,不用再建立 TCP 连接。例如:数据库的 连接用长连接,如果用短连接频繁的通信会造成 socket 错误,频繁的 socket 创建也是对资源的浪费 。 

短连接:web 网站的 http 服务一般都用短连接。因为长连接对于服务器来说要耗费一定 的资源。像 web 网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,而 且同时用成千上万的用户,每个用户都占有一个 连接的话,可想而知服务器的压力有多大。所以并发量 大,但是每个用户又不需频繁操作的情况下需要短连接。 

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

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

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

  •  SYN (synchronous 建立联机)同步 

  •  ACK (acknowledgement确认) 

  •  PSH (push 传送) 

  •  FIN (finish 结束)

  •  RST (reset 重置) 

  •  URG (urgent 紧急) 

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

减少 HTTP 请求、利用 CDN 技术、 设置头文件过期或者静态缓存、Gzip 压缩、把 CSS 放顶部、 把 JS 放底部、避免 CSS 表达式、将 JS 和 CSS 外链、减少 DNS 查找、减小 JS 和 CSS 的体积、 避免 重定向、删除重复脚本、 配置 ETags、缓存 Ajax、尽早的释放缓冲、用 GET 方式进行 AJAX 请求、延 迟加载组件、 预加载组件、减少 DOM 元素数量、跨域分离组件、减少 iframe 数量、不要出现 404 页 面、减小 Cookie、 对组件使用无 Cookie 的域名、减少 DOM 的访问次数、开发灵活的事件处理句柄、 使用 而非 @import、避免过滤器的使用、优化图片、优化 CSS Sprites、 不要在 HTML 中缩放 图片、缩小 favicon. ico 的大小并缓存它、保证组件在 25K 以下、将组件打包进一个多部分的文档中 

8.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 ()的 文件拥有者用户名相同。

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

  1.  safe_mode_gid=onoff

  2.  safe_mode_include_dir=string 

  3. safe_mode_env_vars=string 

  4. safe_mode_exec_dir=string 

  5. safe_mode_protected_env_vars=string

9.PHP 做好防盗链的基本思想

什么是盗链? 

 盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面 (如广告), 直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益 者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。网站盗链会大量消耗被盗 链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益。 

 如何做防盗链? 

  •  不定期更名文件或者目录 
  •  限制引用页 

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

  • 文件伪装 

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

  • 加密认证

这种反盗链方式先从客户端获取用户信息,然后根据这个信息和用户请求的文件名 字一起加密成字符串 (Session ID) 作为身份验证。只有当认证成功以后,服务端才会把用户需要的文件传送给客户。一般我 们会把加密的 Session ID 作为 URL 参数的一部分传递给服务器,由于这个 Session ID 和用户的信息 挂钩,所以别人就算是盗取了链接,该 Session ID 也无法通过身份认证,从而达到反盗链的目的。这 种方式对于分布式盗链非常有效。 

  • 随机附加码 

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

  • 加入水印 

点关注,不迷路 

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以点这里shimo.im/docs/rjJttd… 《进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】》

分类:
后端
标签: