后端开发 \ PHP \ php面试题锦集

php面试题锦集

总点击28
简介:1、用PHP打印出前一天的时间格式是2006-5-1022:21:21  date(\"Y-m-dH:i:s\",mktime(date(\"H\"),date(\"i\"),date(\"s\"),date(\"m\"),date(\"d\")-1,date(\"Y\")));

1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21


  date("Y-m-d H:i:s",mktime(date("H"),date("i"),date("s"),date("m"),date("d")-1,date("Y")));


  date("Y-m-d H:i:s",strtotime("-1 day"))


 


2、echo(),print(),print_r()的区别


print()打印字符串函数,print "this is {$bar['value']} !";


print()由于这是一个语言结构而非函数,因此它无法被变量函数调用。


EOT;


if(empty($_COOKIE['MOnline'])){


print<<<EOT


3、能够使HTML和PHP分离开使用的模板


定界符:<<<,所在的行不能包含任何其它字符,除了一个分号(;)之外


EOT;


if(empty($_COOKIE['MOnline'])){


print<<<EOT


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


  1.使用js引用


  fsockopen


5、使用哪些工具进行版本控制?


 vss,cvs,subversion


6、如何实现字符串翻转?


$str="abcd";


function duigui($str,$len){


    $str1.=substr($str,-$len,1);


    if($len==4){


         return $str1;


    }


     $len++;


     


   


     $str1.=duigui($str,$len);


     return $str1;


}


echo duigui($str,1);


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


1.查询字段上增加索引


2.尽可能减少in(select)


8、谈谈事务处理


9、apache+mysql+php实现最大负载的方法


10、实现中文字串截取无乱码的方法。


mbd_substr()


面试题2


var $empty       = '';


var $null        = NULL;


var $bool        = FALSE;


var $notSet;


var $array       = array();


1.


$a = "hello";


$b = &$a;


unset($b);


$b = "world";


what is $a? "hello"


2.


$a = 1;


$x = &$a;


$b = $a++;


what is $b? 1


3.


$x = empty($array);


what is $x?   true    or    false


4.您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?


 


 


5.您是否用过模板引擎? 如果有您用的模板引擎的名字是?


 


6.请简单阐述您最得意的开发之作.


 


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


 


 


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


面试题3


一、PHP/MySQL编程


1) 某内容管理系统中,表message有如下字段


id 文章id


title 文章标题


content 文章内容


category_id 文章分类id


hits 点击量


创建上表,写出MySQL语句


2)同样上述内容管理系统:表comment记录用户回复内容,字段如下


comment_id 回复id


id 文章id,关联message表中的id


comment_content 回复内容


现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面


文章id 文章标题 点击量 回复数量


 


用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0


3) 上述内容管理系统,表category保存分类信息,字段如下


category_id int(4) not null auto_increment;


categroy_name varchar(40) not null;


用户输入文章时,通过选择下拉菜单选定文章分类


写出如何实现这个下拉菜单


二、PHP文件操作


1)


上述内容管理系统:用户提交内容后,系统生成静态HTML页面;写出实现的基本思路


2) 简单描述用户修改以发布内容的实现流程和基本思路


三、PHP程序


1) 写出以下程序的输出结果


<?


$b=201;


$c=40;


$a=$b>$c?4:5;


echo $a;


?>


2) 写出以下程序的输出结果


<?


$str="cd";


$$str="hotdog";


$$str.="ok";


echo $cd;


?>


面试题4


一. 简答题


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


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


3. 请写一个函数验证电子邮件的格式是否正确


4. 简述如何得到当前执行脚本路径,包括所得到参数。


说明:例如有一个脚本www.domain.com,传给他的参数有参数1,参数2,参数3….


传递参数的方法有可能是GET有可能是POST,那么现在请写出类似


http://www.domain.com/scrīpt.php? 参数1=值1&参数2=值2..... 的结果


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


6..有一个网页地址http://www.domain.com/xxx.php,如何得到它的内容?


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


8. 请举例说明在你的开发过程中用什么方法来加快页面的加载速度。


二. 数据库设计题:


请设计一套图书馆借书管理系统的数据库表结构;可以记录基本的用户信息、图书信息、借还书信息;数据表的个数不超过6个;请画表格描述表结构(需要说明每个字段的字段名、字段类型、字段含义描述);


在数据库设计中应:


1. 保证每个用户的唯一性;


2.保证每种图书的唯一性;每种图书对应不等本数的多本图书;保证每本图书的唯一性;


3.借书信息表中,应同时考虑借书行为与还书行为,考虑借书期限;


4. 保证借书信息表与用户表、图书信息表之间的参照完整性;


5. 限制每个用户最大可借书的本数


6. 若有新用户注册或新书入库,保证自动生成其唯一性标识


7. 为以下的一系列报表需求提供支持:


(无特定说明,不需编写实现语句,而需在数据库设计中,保证这些报表可以用最多一条SQL语句实现)


a) 日统计报表:当日借书本数、当日还书本数报表;


b) 实时报表:


i. 当前每种书的借出本数、可借本数;


ii. 当前系统中所有超期图书、用户的列表及其超期天数


iii. 当前系统中所有用户借书的本数,分用户列出(包括没有借书行为的用户);请编写实现此需求的SQL语句:


数据库应用:


请撰写一系列的SQL语句,分别描述完整的借书行为与还书行为;并保证这一系列的SQL语句的执行完整性


下题是测验能力之最重要测试,如不能完成我们将无法给出评判结果!所以请写出详细的回答,并保证答案是可以执行的程序。在两日内将结果通过电子邮件寄到hr@88keke.com邮箱


结合第二题中你的设计,用一种数据库实现,要求使用三层结构或者多层结构,要求采用面向对象的思想进行编程,有可能的话,设计一套模板机制来实现之。


功能:列出当前借出图书的情况,按日期排列


编号 用户姓名 书名 书的编号 借出日期


1. 张进 大染坊 12576587 2004-9-1


2. 刘兴 西游记 32131098 2004-9-2


……


面试题5


1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的URL记录在预定义变量(2)中。


2.执行程序段<?php echo 8%(-3) ?>将输出(3)。


3.在HTTP 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(5)。


4.数组函数 arsort 的作用是(6);语句 error_reporting(2047)的作用是(7)。


5.PEAR中的数据库连接字符串格式是(8)。


6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把scrīpt标记及其内容都去掉):(9)。


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


8.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是(12);为了避免多次包含同一文件,可以用语句(13)来代替它们。


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


10.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.


11.SQL 中LEFT JOIN的含义是(16)。如果 tbl_user记录了学生的姓名(name)和学号(ID),tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和 考试成绩(score)以及考试科目(subject),要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句(17)。


12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。


13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。


14.简述论坛中无限分类的实现原理。


15.设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示。


面试题6


有一表 menu(mainmenu,submenu,url),请用递归法写出一树形菜单,将所有的menu列出来。


面试题7


1- 给你三个数,写程序求出其最大值。


2- 谈谈asp,php,jsp的优缺点


3- 谈谈对mvc的认识


4- 写出发贴数最多的十个人名字的SQL,利用下表:


   members(id,username,posts,pass,email)


面试题8


1-如何通过javascrīpt判断一个窗口是否已经被屏蔽。


2-写出session的运行机制


3-有一数组$a=array(4,3,8,9,2);请将其重新排序,按从小到大的顺序列出。


4-防止SQL注射漏洞一般用_____函数。


5-查询在线人数,并能处理异常掉线的SQL


....WHERE ________<now()


 


--------------------------------


function getLastTime($now,$times){


                $lastTime = $now - $dates;


                return date('Y-n-j G:i:s',$lastTime);


}


$times=(60*60);


echo getLastTime(time(),$times);


$times=(1*24*60*60);


echo getLastTime(time(),$times);


关于优化:


[硬件优化]


1、升级硬件的一般规则:对于 PHP 脚本而言,主要的瓶颈是 CPU ,对于静态页面而言,瓶颈是内存和网络。一台 400 Mhz 的普通奔腾机器所下载的静态页面就能让 T3 专线(45Mbps)饱和。


2、采用 hdparm 来优化磁盘,一般能提升 IDE 磁盘读写性能 200%,但是对 SCSI 硬盘也有效果。(不同类型的硬盘对比)


[策略优化]


3、Apache 处理 PHP 脚本的速度要比静态页面慢 2-10 倍,因此尽量采用多的静态页面,少的脚本。


4、PHP 脚本如果不做缓冲,每次调用都需要编译,因此,安装一个 PHP 缓冲产品能提升 25-100% 的性能。


5、如果你采用了 Linux 系统,建议升级内核到 2.4,因为静态页面由内核服务。


6、另外一项缓冲技术是把不常修改的 PHP 页面采用 HTML 缓冲输出。


7、不要在 Web 服务器上运行 X-Windows ,关掉没有必要运行的进程。


8、如果能够用文本就不要用图像,尽量减小图片的尺寸。


9、分散负载,把数据库服务器放到另外的机器上去。采用另外低端的机器服务图片和 HTML 页面,如果所有的静态页面在另外一台服务器上处理,可以设置 httpd.conf 中的 KeepAlives 为 off ,来减少断开连接的时间。


10、以上所有的方法都是针对单机而言的,如果你觉得系统还是不够快,可以采用集群,负载均衡,缓冲技术。采用 Squid 作为缓冲,配置 Squid 的方法。


[编译优化]


11、把基于文件的会话切换到基于共享内存的会话。编译 PHP 时采用 --with-mm 选项,在 php.ini 中设置 set session.save_handler=mm 。这个简单的修改能让会话管理时间缩短一半。


12、采用最新版本的 Apache ,并把 PHP 编译其中,或者采用 DSO 模式,不要采用 CGI 方式。


13、编译 PHP 时,建议采用如下的参数:


--enable-inline-optimization --disable-debug


[配置优化]


14、修改 httpd.conf :


# 关闭 DNS lookups,PHP 脚本只拿 IP 地址


HostnameLookups off


15、如果网络拥挤,CPU 资源不够用,采用 PHP 的 HTML 压缩功能:


output_handler = ob_gzhandler


PHP 4.0.4 的用户请不要使用,因为存在内存泄漏问题。


16、修改 httpd.conf 中的 SendBufferSize 为你最大的页面文件的大小。加大内核的 TCP/IP 写缓冲大小。


17、采用数据库的持久连接时,不要把 MaxRequestsPerChild 设置得太大。


[第三方软件优化]


18、如果喜欢从修改 Apache 源码入手,可以安装 lingerd。在页面产生和发送后,每个 Apache 进程都会浪费一段时光在客户连接上,Lingerd 能接管这项工作,让 Apache 迅速服务下一个客户请求。


19、如果你足够勇敢的话,还可以采用 Silicon Graphics 的 Accelerated Apache 补丁。这个工程能使 Apache 1.3 快 10 倍,使 Apache 2.0 快 4 倍。


安装一个 PHP 缓冲产品能提升 25-100% 的性能。


[Linux系统优化]


1.清理服务器磁盘碎片:


不论Linux文件系统采用什么文件格式(ext3、JFS、XFS、ReiserFS )、何种类型的硬盘(IDE 、SCSI),随着时间的推移文件系统都会趋向于碎片化。ext3、JFS等高级文件系统可以减少文件系统的碎片化,但是并没有消除。在繁忙的数据库服务器中,随着时间的过去,文件碎片化将降低硬盘性能,硬盘性能从硬盘读出或写入数据时才能注意到。时间长了会发现每个磁盘上确实积累了非常多的垃圾文件,释放磁盘空间可以帮助系统更好地工作。Linux最好的整理磁盘碎片的方法是做一个完全的备份,重新格式化分区,然后从备份恢复文件。但是对于7×24小时工作关键任务服务器来说是比较困难的。Kleandisk是一个高效的磁盘清理工具,它能把磁盘上的文件分成不同的"组",比如把所有的"core"文件归成一组(Group),这样要删除所有core文件时只要删除这个组就行了。core文件是当软件运行出错时产生的文件,它对于软件开发人员比较有用,对于其他用户(比如电子邮件服务器)却没有任何意义。因此,如果没有软件开发的需要,见到core文件就可以将其删除。


2、开启硬盘DMA


现在使用的IDE硬盘基本支持DMA66/100/133(直接内存读取)但是Linux发行版本安装后一般没有打开,可以 /etc/rc.d/rc.local 最後面加上一行: /sbin/hdparm -d1 –x66 -c3 -m16 /dev/hda 这样以后每次开机,硬盘的 DMA 就会开启,不必每次手动设定。添加前后你可以使用命令:hdparm -Tt /dev/hda 来测试对比一下。


3、调整缓冲区刷新参数


Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整 /proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:


# cat /proc/sys/vm/bdflush 30 64 64 256 500 3000 60 0 0


每一栏是一个参数,其中最重要的是前面几个参数。第一个数字是在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘,第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下来的参数是每次允许bd flush将多少个内存块排入空闲的缓冲块列表。 以上值为RHEL 4.0中的缺省值。可以使用两种方法修改:


(1)使用命令


# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush


并将这条命令加到/etc/rc.d/rc.local文件中去。


(2)在/etc/sysctl.conf 文件中加入如下行:


vm.bdflush = 100 128 128 512 5000 3000 60 0 0


以上的设置加大了缓冲区大小,降低了bdflush被启动的频度,VFS的缓冲刷新机制是Linux文件系统高效的原因之一。


4、优化输入输出


I/O程序对Linux系统性能也是相当重要的,网络硬件I/O对服务器尤其重要。现在大多数Linux服务器使用10/100 Mb以太网。如果有较重的网络负载,则可以考虑千兆以太网卡。如果没有能力购买千兆网卡的话:可以使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术,在Linux中,这种技术称为Bonding。Bonding在Linux2.4以上内核中已经包含了,只需要在编译的时候把网络设备选项中的 Bonding driver support选中见图1。当然利用Bonding技术配置双网卡绑定的前提条件是两块网卡芯片组型号相同,并且都具备独立的BIOS芯片。


然后,重新编译核心,重新起动计算机,执行如下命令:


#ismod bonding #ifconfig eth0 down #ifconfig eth1 down


#ifconfig bond0 ipaddress#ifenslave bond0 eth0#ifenslave bond0 eth1


现在两块网卡已经象一块一样工作了。这样可以提高集群节点间的数据传输.bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两块100 兆网卡作bonding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个子口映射为同一个虚拟接口。编辑 /etc/modules.conf文件,加入如下内容,以使系统在启动时加载Bonding模块。


alias bond0 bonding options bond0 mode=0


“mode”的值表示工作模式,共有0、1、2和3四种模式,这里设定为0。Bonding工作在负载均衡(Load Balancing (round-robin))方式下,即两块网卡同时工作,这时理论上Bonding能提供两倍的带宽。Bonding运行在网卡的混杂(Promisc)模式下,而且它将两块网卡的MAC地址修改为一样的。混杂模式就是网卡不再只接收目的硬件地址是自身MAC地址的数据帧,而是可以接收网络上所有的帧。


5、减少虚拟终端机的数量。


Linux安装后系统默认是6个虚拟终端机,也就是 CTRL+ALT F1~F6 那六个,作为服务器使用可以关掉其中四个,只留下 CTRL+ALT F1~F2,大约省下 4 Mbytes 的内存,但是这样一来,X-Window 会从原来的 CTRL+ALT F7 变成 CTRL+ALT F3 。 修改 /etc/inittab 中,将 mingetty 3 ~6 全部加上 # 字号 。


6. 关闭一些不用的服务


Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。linux系统有很多守护进程,大多数服务器都是用守护进程实现的。如Web服务http等。同时,守护进程完成许多系统任务,比如,作业规划进程crond、打印进程lqd等。有些书籍和资料也把守护进程称作:“服务”。关闭服务方法请查看笔者的文章:深入理解Linux守护进程。


7.其它优化列表


[MySQL优化]


优化文章列表:


          MySQL优化实例


         Mysql优化合集


         MySQL中SQL优化和架构设计的一些简单想法


[PHP优化]


优化文章列表:


PHP服务器安全配置


 


意见反馈 常见问题 官方微信 返回顶部