`
syu
  • 浏览: 16732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

PHP常见面试题目深入解答分析(二)

阅读更多

高手请继续无视本文,骨灰们请跳跃路过... :-)

很久没有更新了,继续上一篇文.再来讨论几道常见的试题.查看上次的文章请点击这里

题目一: mysql_pconnect与mysql_connect的区别在哪里?哪一个更好
这道题涉及到了数据库长连接的概念.我们知道,PHP脚本的运行机制,每次使用数据库之前,都必须使用connect去连接数据库.而web应用又是并发性非常高的应用场景,如果同时有10个用户访问,便会有10个进程在运行脚本,相应的,就会产生10次数据库连接.如果有100个用户同时访问.那么就自然会产生100次数据库连接.这样便会有两个问题产生:1是频繁建立和撤消数据库连接.本身的开销就非常大,2是数据库的同时连接数是有限的.如果有1000个用户请求同时要访问数据库.而数据库只开放了最高100个连接允许的话,那么就有900个会进入等待或失败的队列. 这就好比是,一群搬运工往屋里搬东西,每一次都需要 开门-->搬东西-->关门 的操作,如果有很多搬运工同时搬,每个人都要执行 开门/关门 这两步操作的话,显然是会产生很大的不必要开销.而且如果这道门能同时通过的人数有限,很多搬运工不得不在外等待.

pcconnect的长连接方式是怎么解决这个问题的呢?

官方手册中对此的描述是:在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

其机制无非是:初次连接数据库时,便将连接句柄交至父进程,子进程要使用数据库连接时,直接将父进程手中早已连接好的句柄交给子进程,这样子进程的连接就成了一种"虚连接"---它并不用真正去与数据库通讯,只需要从父进程手中拿到已经打开的连接句柄,这样就大大节省了连接/关闭的开销.另外,多个子进程,共享父进程的连接句柄,这样实际上数据库对外的连接数,只是跟父进程之间的个数,1000个用户请求,会产生1000个子进程,可能只会产生10个父进程,有10个数据库连接.这样就解决了连接数的问题.

这样看来.长连接的确是很不错的方式.从机理上讲好于connect.所以长连接更好一些.

但事实是并不能这样简单论定的 :-) ,继续深入下去.
首先,长连接的机制是基于父-子进程模式,也就是说,只能跑于模块(apache-php module或iis的isapi)方式,不适用于CGI和CLI模式,因为CGI和CLI模式都是单独进程,执行完就关闭,没有父进程控制.也就谈不上长链接.

另外,由于多个子进程共用父进程的连接句柄,有时会出现一些意外,比如某个子进程由于一些原因,造成一个连接句柄死锁,便会搞得共享这个句柄的所有其它子进程都无法使用数据库.这时候只有重启web服务才能恢复.

优缺点都摆明了出来.至于用哪一个,大家自己根据情况选择吧.

题目二:CGI模式,模块模式与CLI模式运行PHP的区别

以CGI方式运行时,web server将用户请求以消息的方式转交给PHP独立进程,PHP与web服务之间无从属关系.

纯粹调用--返回结果的形式通讯.而模块方式,则是将PHP做为web-server的子进程控制,两者之间有从属关系.最明显的例子就是在CGI模式下,如果修改了PHP.INI的配置文件,不用重启web服务便可生效,而模块模式下则需要重启web服务.

CLI则是命令行接口,用于在操作系统命令行模式下执行PHP,比如可以直接在win的cmd或linux的shell模式下直接输入 php a.php 来得到结果.它与CGI模式最大的不同的地方在于既不会输出HTTP头信息(CGI模式除了输出用户能看到的结果外,还会输出用户不能直接看到的HTTP头信息),抛出的信息也直接以文本方式而不以HTML方式给出,比如新建一个 test.php,

写入内容 <?php phpinfo();?> ,在浏览器中可以看到以HTML表格描述的信息,而在命令行输入 php test.php 则会直接看到纯文本的输出.

题目三:用PHP实现一个双向队列?(腾讯公司面试题)

上次有人问过我这道题,我个人认为用数组函数处理这道题绰足有余了.

<?php

$data = array(1,2,3,4,5);
//从头部插入
array_unshift($data,6,7,8);
//从头部移除
array_shift($data);

//从尾部插入

array_push($data,9);

//从尾部移除

array_pop($data);

?>

以上四个函数已实现双向队列的四个基本操作.可以写一个class将其封装起来即可.

题目四:遍历一个目录及其子目录(新浪公司面试题)

与网上普遍给的代码不同,这道解答,我用了PHP5更安全的scandir函数,以及迭代(foreach)和递归.

各位自己研究吧.未负责的测试/经验感觉应该比网上普遍的要快一些些.

<?php
Function showDir($rDir)
{
foreach(scandir($rDir) as $v)
{
if($v=='.' || $v=='..') continue;
is_dir($rDir.'/'.$v)?$r[$v]=showDir($rDir.'/'.$v):1;
}
return $r;
}
print_r(showDir('.'));
?>

分享到:
评论

相关推荐

    PHP程序员面试宝典 笔试 (PHP版).zip

    这个压缩包中的核心文件是"PHP程序员面试宝典 笔试 (PHP版).pdf",它很可能是详细讲解了PHP编程语言的关键概念、面试技巧以及常见笔试题目的解答。 首先,让我们深入探讨PHP的基础知识,这是任何PHP面试的起点。PHP...

    PHP面试题_php_

    对于提供的文档列表,如"面试题4.doc、面试题3.doc、笔试题.doc、面试题2.doc、PHP面试题",这些文档很可能是具体的面试题目集合,通过研读并解答它们,可以更好地准备面试,检验自己的PHP技能。

    PHP面试-102313481

    掌握这些基本知识点对于PHP开发者来说非常重要,它们涵盖了PHP的基础语法、变量、函数、字符串操作、数组处理、时间日期处理等多个方面,是面试和日常开发中常见的问题。在实际工作中,还需要深入理解PHP与MySQL的...

    2017最新最全PHP面试题笔试题

    这个资料包包含的"2017最新最全【PHP面试题】【笔试题】.txt"文件将涵盖这些领域的题目,通过解答这些题目,开发者可以检验自己的PHP知识掌握程度,找出不足并进行针对性的学习和提升。对于PHP开发者来说,熟练掌握...

    php_mysql_面试题_2011_03-28

    标题“php_mysql_面试题_2011_03-28”表明这是一个关于PHP和MySQL面试题目的集合,可能包含2011年3月28日时流行的或者常问的问题。在这个主题中,我们可以深入探讨PHP编程语言与MySQL数据库系统之间的交互,以及在...

    Algorithm-php-interview.zip

    "php-interview-master"这个子文件可能包含了一系列PHP面试问题和解答,包括但不限于算法题目、数据结构应用、PHP语言特性和最佳实践、数据库操作、Web安全等方面。通过研究这个资源,你可以全面了解PHP后端面试的...

    PHP技术点整理,redis,swoole,搜索引擎,lua,面试题练习

    面试题练习是提升技术能力的有效方式,你可以通过模拟实际场景,设计和解答关于PHP、Redis、Swoole、搜索引擎和Lua的问题。例如,设计一个使用Swoole构建的聊天服务器,或者实现一个基于Redis的计数器系统,或是利用...

    php面试题必考

    在PHP面试中,掌握核心知识点是至关重要的。以下是一些基于`标题`“php面试...对于`压缩包子文件的文件名称列表`“面试题修改后”,这可能包含了一些经过修订的面试题目,你可以通过解答这些题目来检验和巩固你的知识。

    程序员java面试题汇总.zip

    【文件名称列表】:“doc”通常指的是Microsoft Word文档,这意味着压缩包中包含的可能是文字版的面试题目和解答,可能包括详细的解释、代码示例和解题思路。 综上所述,这份“程序员java面试题汇总.zip”资源可能...

    面试经验等多文档

    此外,C#特性和MVVM模式也是常见的面试题目。 JavaScript是用于网页和应用程序的脚本语言,主要应用于客户端的交互式开发。面试中,会涉及JavaScript的基础语法、DOM操作、事件处理、闭包、作用域链、原型链、异步...

    php相关试题

    在准备面试时,可以参考《51CTO下载-传智播客PHP面试题及答案宝典》上下卷,这些资料通常涵盖了基础到高级的面试题目,通过解答这些题目,不仅可以检验自身技能,还能发现知识盲点并进行补充。 此外,良好的项目...

    interview_php:面试题的php版本

    【描述】中的“面试题的php版本”进一步确认了这个资源是专门为准备PHP程序员面试而设计的,它可能包含了各种类型的面试题目,如基础题、进阶题和实战题,帮助开发者检验和提升自己的PHP技能。 【标签】"PHP"表明这...

    PHP笔试题C库

    通过解答这些C语言的题目,不仅可以提高对C语言的理解,也能为PHP开发者提供更深层次的洞见,尤其是在性能优化、内存管理和底层原理方面。这将有助于在面试过程中展示出扎实的编程基础和问题解决能力。 总而言之,...

    PHP中提问频率最高的11个面试题和答案

    掌握这些知识点可以帮助开发者更好地准备PHP相关的面试题目,理解常见的面试问题及答案,以提高面试成功的可能性。面试者需要对PHP的基础知识有深入理解,并且能够根据具体的工作角色和公司的技术要求提供相应的解答...

    php-leetcode题解之整数反转.zip

    在本压缩包“php-leetcode题解之整数反转.zip”中,主要包含的是使用PHP语言解决LeetCode上的一个经典问题——整数...通过对这个问题的解答,你可以深入理解整数反转背后的逻辑,同时提高对PHP语言特性和位运算的掌握。

    PHP工程师笔试题

    【PHP工程师笔试题】 在IT行业中,PHP是一种广泛使用的服务器端脚本语言,尤其在Web开发领域占据着重要地位。...通过解答“腾讯PHP工程师笔试题.txt”中的题目,你可以更好地巩固这些知识,并提升解决问题的能力。

    php-leetcode题解之求众数.zip

    LeetCode是一个在线的编程练习平台,它提供了一系列的算法题目,旨在帮助程序员提升算法技能和面试准备。 “求众数”是一个常见的数据结构与算法问题,它的目标是找出数组中的众数,即出现次数最多的元素。在数组中...

    php-leetcode题解之有效的字母异位词.zip

    在这里,我们将深入理解这个问题,探讨其背后的算法思想,并通过PHP实现来详细解答。 字母异位词是指两个字符串包含的字母相同,但排列顺序不同。例如,“cinema”和“iceman”就是一对字母异位词。判断字母异位词...

Global site tag (gtag.js) - Google Analytics