版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
某知名监控产品服务商PHP工程师面试笔试真题9一、选择题1.
要比较两个字符串,以下最万能的方法是______A.用strpos函数B.用==操作符C.用strcasecmp()D.用strcmp(江南博哥)()正确答案:D[解析]strcmp()函数提供了安全的字符串比较机制,比较的字符区分大小写。选项D正确。
strcasecmp()函数也可以用来比较两个字符串,但不区分大小写,它的二进制是安全的。该函数与strncasecmp()函数类似,不同的是,通过strncasecmp()可以指定每个字符串用于比较的字符数。strcasecmp()不是一个“万能”函数,因为它不区分大小写。选项C错误。
所以,本题的答案为D。
2.
下面不能将两个字符串$s1和$s2串联成一个单独的字符串的表达式是______A.$s1+$s2B."{$s1}{$s2}"C.$s1.$s2D.implode("",array($s1,$s2))正确答案:A[解析]本题中,对于选项A,描述错误。在JavaScript里可以这样做,但是PHP中不行。
很多读者对于选项B中{}不太理解,其实,在PHP中,{}有如下几种功能:
(1)代表程序块的开始和结束
示例代码如下:
if($a>0){'
echo$a;
}
(2)用来表示字符串下标
$a='hello';
echo$a{1};
//输出->'e'
(3)连接字符串
$a='hello,';
echo"{$a}php";
//输出->'hello,php'
本题中,选项C和选项D是最常用的字符串连接的方式。
所以,本题的答案为A。
3.
假设浏览器没有重启,那么在最后一次访问后的多久,会话(Session)才会过期并被回收?______A.1440s后B.在Session.gc_maxlifetime设置的时间过了后C.除非手动删除,否则永不过期D.除非浏览器重启,否则永不过期正确答案:B[解析]session.gc_maxlifetime设置的是用户最后一次请求到Session被回收之间的时间间隔。尽管数据文件并没有被真正删除,不过一旦Session被回收,将无法对此Session进行访问。巧合的是,session.gc_maxlifetime的默认设置正好是1440s,但这个数字是可以被系统管理员调整的。选项B正确。
所以,本题的答案为B。
4.
计算三个稠密矩阵A、B、C的乘积ABC,假定三个矩阵的尺寸分别为m*n、n*p和p*q,且m<n<p<q,以下计算顺序中,效率最高的是______A.(AB)CB.A(BC)C.(AC)BD.(BC)A正确答案:A[解析]根据矩阵运算知识,可以排除选项C与选项D,因为矩阵A与矩阵B相乘,矩阵A的列数必须与矩阵B的行数相等。
对于选项A与选项B,一个m*n的矩阵A乘以n*q的矩阵B,会用矩阵A的第一行,乘以矩阵B的第一列并相加。这一运算需要耗费n次乘法以及n-1次加法,矩阵B有q列,矩阵A有m行,所以,A*B的复杂度为m*(2n-1)*q。
根据上面的分析可知,选项A的复杂度为m*(2n-1)*p+m*(2p-1)*q,而选项B的复杂度为m*(2n-1)*q+n*(2p-1)*q,很显然,选项A的效率高于选项B。
所以,本题的答案为A。
5.
n从1开始,每个操作可以选择对n加1或者对n加倍。如果需要获得整数2013,最少需要______个操作。A.18B.24C.21D.不可能正确答案:A[解析]本题最容易想到的方法就是直接进行运算,采用反推的方法,从1到2013只允许执行加1操作或者加倍操作,那么从2013到1就只允许减1操作或者减半操作。具体步骤如下:由于2013是奇数,不能被2整除,此时对2013执行减1操作,变为2012,2012为偶数,能够被2整除,此时执行减半操作,变为1006,1006为偶数操作,于是继续执行减半操作,按照奇数减1,偶数减半的操作一直执行下去,最终结果就变为1。
整个过程如下:
2013→2012→1006→503→502→251→250→125→124→62→31→30→15→14→7→6→3→2→1,此过程一共执行了18次。正向推理过程也为18次。选项A正确。
所以,本题的答案为A。
6.
下列PHP配置项中,和安全最不相关的是______A.open_basedirB.register_globalsC.disable_functionsD.file_uploads正确答案:D[解析]对于选项A,open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也可用符号“.”来代表当前目录。注意,用open_basedir指定的限制实际上是前缀,而不是目录名。举例来说:若“open_basedir=/dir/user”,那么目录“/dir/user”和“/dir/user1”都是可以访问的。所以如果要将访问限制在仅为指定的目录,那么要用斜线结束路径名。例如,设置成“open_basedir=/dir/user/”。
对于选项B,register_globals的意思就是注册为全局变量,所以当被设置为on的时候,传递过来的值会被直接注册为全局变量直接使用,而被设置为off的时候,需要到特定的数组里去得到它。①PHP4.2.0版开始配置文件中register_globals的默认值从on改为off,虽然可以设置它为on,这种情况下代码的兼容性就成为一个大问题,所以,建议最好从现在就开始用off的风格来编程。②当register_globals被打开以后,各种变量都被注入代码,例如,来自HTML表单的请求变量。再加上PHP在使用变量之前是无须进行初始化的,这就使得更容易写出不安全的代码。当打开时,人们使用变量时确实不知道变量是哪里来的。但是register_globals的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。
对于选项C,disable_functions限制程序使用一些可以直接执行系统命令的函数,如system、exec、passthru、shell_exec、proc_open等。所以如果想保证服务器的安全,那么要将这个函数加到disable_functions里或者将安全模式打开。
对于选项D,file_uploads是决定PHP文件上传时记录file_uploads指令是否启用的函数,默认值为on。该函数和安全最不相关,选项D正确。
所以,本题的答案为D。
7.
在如下代码中,date()将会输出______
<?php
$date="2009-5-19";
$time="14:31:38";
$datetime=$date.$time;
echodate("Y-m-d:H:i:s",strtotime($datetime));
?>A.2009-05-19:14:31:38B.19-5-2009:2:31:38C.2009-5-19:2:31:38D.19/5/2009:14:31:38正确答案:A[解析]日期中输出的H:i:s中的H表示24小时制的小时,i表示分,s表示秒。所以根据拼接的时间通过strtotime()函数转换成时间戳后再转成日期可以得到2009-05-19:14:31:38。选项A正确。
所以,本题的答案为A。
8.
Gethostbyname函数的作用是______A.返回某个主机名的IPB.返回某个主机名的所有IP列表C.以长整型数的形式返回某个主机的IPD.以长整型数的形式返回某个主机的所有IP列表E.以上都不对正确答案:B[解析]gethostbynamel()函数的作用是根据主机名获取该主机名的所有IP列表。选项B正确。
所以,本题的答案为B。
9.
处理数据库中读取的日期数据时,以下有助于避免bug的方法是______(三选)A.确保日期数据与服务器使用相同的时区B.如果日期需要被转换成UNIX时间戳进行操作,那么要确保结果不会溢出C.用数据库功能测试日期的合法性D.如果可能,那么用数据库功能计算日期的值E.用代码控制日期只能在PHP中进行处理正确答案:BCD[解析]数据库存储日期/时间的能力比PHP强。大多数DBMS能够处理格里历上所有的日期,而基于UNIX时间戳的PHP,只能处理较短的一个时间段里的日期。因此在脚本中处理日期时,必须确保在它转换成时间戳后不会溢出(答案B)。
此外,在处理日期时,无论是验证一个日期的合法性(答案C)还是进行计算(答案D),都最好尽量让数据库来完成。
所以,本题的答案为BCD。
10.
以下关于PHP文件处理的说法中,正确的是______A.filegetcontents()函数能用来抓取网页数据,但是没办法设置超时时间B.file()函数既能读取文本文件也能读取二进制文件,但是读取二进制文件有可能出现安全问题C.如果表单中没有选择上传的文件,则PHP变量的值将为NULLD.fsockopen()和fputs()结合起来可以发送邮件,也可以用来抓取网页内容、下载ftp文件等正确答案:C[解析]对于选项A,可以通过context参数设置超时时间。选项A错误。
对于选项B,file()函数可以安全用于读取二进制文件。选项B错误。
对于选项C,表单中没有文件上传时,PHP的$_FILES变量值为NULL。选项C正确。
对于选项D,fputs()用于写入字符串到文件中,只能用于上传,不能用于下载ftp文件。选项D错误。
所以,本题的答案为C。
二、填空题1.
从一个get的form中获取信息的方式是______。正确答案:$_GET[]。[解析]获取表单get的数据主要使用$_GET[]方法获取,而获取表单post的数据是使用$_POST[]。
2.
PHP中的错误控制操作符是______。正确答案:@。[解析]PHP支持一个错误控制运算符@。当将其放置在一个php表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
3.
语句echointval((0.7+0.1)*10);的打印结果为______。正确答案:7。[解析]由于浮点数的精度是有限的,因此它在内存中存储的是一个近似值,而不是准确的值。对于((0.1+0.7)*10),在内存中实际存储的值为7.999999....,当通过intval把它转换为整型的时候(向下取整),转换的结果就是7。正因为如此,在条件判断的时候一般不能通过“==”来比较两个浮点数是否相等。
4.
在PHP运算符中,优先级从高到低分别是______、______、______。正确答案:算术运算符、关系运算符、逻辑运算符。[解析]PHP默认的优先级高低是先进行算术运算符的判断,再到关系运算符的判断,最后才到逻辑运算符判断。
5.
使用php操作mysq1时,想取得最近一条查询的信息,应该使用的函数是______。正确答案:mysql_info()。[解析]mysql_info()函数可以返回最近一条查询的信息。
三、简答题1.
如何合理地使用Memcache缓存?如果缓存数据量过大,那么如何部署?(分布式,缓存时间,优化缓存数据)正确答案:要合理地使用Memcache缓存,需要注意以下几点内容:
1)因为Memcache支持最大的存储对象大小为1MB,所以当合理使用Memcache缓存时,要求不能往Memcache存储一个大于1MB的数据。
2)Memcache存储的所有数据,如果数据大小分布于各种chunk大小区间,从64B到1MB都有,那么会造成内存的极大浪费和Memcache的异常。所以需要注意数据大小的分布区间。
3)key的长度不能大于250个字符。
4)虚拟主机不允许运行Memcache服务,所以不能把Memcache部署到虚拟主机中。
5)因为:Memcache可以运行在不安全的环境中,所以如果对数据安全要求高,那么需要着重考虑运行环境的安全问题。
6)因为Memcache存储的数据都在内存中,服务器挂掉就会清空内存,所以缓存中的数据尽量是丢失了也不会有太大影响的数据。
如果缓存中的数据量过大,那么可以采取以下的办法:
1)使用Memcache服务器集群的方法。首先是将数据放在不同的Memcache服务器上,此时可以将不同硬件服务器上的Menacache服务器再做成一个数据互相备份的组,以避免数据的单点丢失问题。
2)缓存数据到数据库中。首先在数据库中建一张表来说明Memcache服务器集群中缓存数据的存放逻辑,然后实现把缓存数据存到数据库中,可以保证数据库和缓存的数据双向存取。
2.
GD2库如何给图片增加水印(简述实现过程)?正确答案:GD2库给图片增加水印的方法如下:
1)利用imageString()函数可以在图片上写文本水印,实现在图片上添加文本的功能。
2)增加一个图形水印的方法为
①需要先读取要增加水印的图片,然后创建图像对象,根据不同的图片格式需要使用不同的创建图片格式函数,设置以png、gif、jpeg的图片格式将图像输出到浏览器或文件,可使用的函数为imagepng()、imagegif()、imagejpeg()等。
②根据不同的照片格式,对应使用imagecreatefrompng()、imagecreatefromjpeg()、imagecreatefromgif()函数创建一个水印图片的图像对象。
③可以使用imagecopymerge()函数拷贝图像并合并图像。
④将图像输出,可以设置以png、gif、jpeg的图片格式将图像输出到浏览器或文件。由于图片格式不同,对应的函数可以为imagepng()、imagegif()、imagejpeg()等。
⑤使用GD2库后,需要使用imagedestroy()清除图像资源。
3.
global关键词如何使用?预定义的全局变量数组$GLOBALS如何使用?正确答案:global主要是在函数内对变量进行声明定义使用,使用方式为global$a。在函数内使用global定义的变量主要是获取函数外同名的变量的值。而预定义的全局变量$GLOBALS可以在函数内使用,使用方式为SGLOBALS['变量名'],可以获取对应变量名的全局变量的值,而SGLOBALS['变量名']主要是获取外部的全局变量本身,即对$GLOBALS变量修改,全局变量也会修改。
global关键字和$GLOBALS全局变量的使用方式代码为
<?php
$a=10;
$b=11;
functiondemo(){
global$a;
$b=$GLOBALS['b'];
echo$a."-";
echo$b;
}
demo();
?>
程序的运行结果为10-11。
4.
在浏览器中,一个页面从输入URL到加载完成,都有哪些步骤?正确答案:为了便于理解,将这个过程简单地分为5步:
1)域名解析,根据域名找到服务器的IP地址。
2)建立TCP连接,浏览器与服务器经过3次握手后建立连接。
3)浏览器发起HTTP请求,获取想要的资源。
4)服务器响应HTTP请求,返回指定的资源。
5)浏览器渲染页面,解析接收到的HTML、CSS和JavaScript文件。
5.
在MySQL中,简述InnoDB和MyISAM的优劣。正确答案:MySQL中默认的引擎是MyISAM,如果数据库的基本操作主要是CRUD操作,那么使用MyISAM是最好的。MyISAM基于传统的ISAM类型,是IndexedSequentialAccessMethod(有索引的顺序访问方法)的缩写,它是存储记录和文件的标准方法。MyISAM的优点是拥有检查和修复表格的大多数工具,它的表格可以被压缩并支持全文搜索,如果只是执行大量的SELECT,那么MyISAM是最好的选择,其效率比InnoDB高。它的缺点是不支持外键和事务回滚,不具有原子性。
InnoDB的引擎类型是事务安全的。它和BDB类型引擎具有相同的特性,并且支持外键和事务回滚。它的优点是具有比BDB还丰富的特性,对于要求事务安全的存储使用它是最好的。当执行大量的INSEKT或UPDATE时,在性能上应该使用InnoDB表。它的缺点是因为AUTOCOMMIT默认设置是打开的,程序没有显式调用BEGIN开始事务,导致每插入一条数据都自动commit,严重影响了速度,所以可以在执行SQL前调用begin,使多条SQL形成一个事务。
四、编程题1.
以数组array(38,65,97,76,13,27,49)为例,请用插入排序算法,将它们从小到大排序。正确答案:插入排序的基本思想是,对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余的记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入其之前的有序序列中,直至最后一个记录插入有序序列中为止。
以数组array(38,65,97,76,13,27,49)为例,直接插入排序具体步骤如下:
第一步插入38以后:[38]659776132749
第二步插入65以后:[3865]9776132749
第三步插入97以后:[386597]76132749
第四步插入76以后:[38657697]132749
第五步插入13以后:[1338657697]2749
第六步插入27以后:[132738657697]49
第七步插入49以后:[13273849657697]
根据以上的实现原理,具体的实现代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
functioninsertSort($arr){
//已经间接将数组分成了2部分,下标小于当前的(左边的)是排序好的序列
for($i=t,$len=count($arr);$i<$len;$i++){
//获得当前需要比较的元素值
$tmp=$arr[$i];
//内层循环,控制比较并插入
for($j=$i-1;$j>=0;$j--){
if($tmp<$arr[$j]){
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
}else{
break;
}
}
}
return$arr;
}
$arr=array(38,65,97,76,13,27,49);
echo"排序前:";
foreach($arras$k=>$val){
echo$val.'';
}
echo"<br>排序后:";
$arr=insertSort($arr);
foreach($arras$k=>$val){
echo$val.'';
}
?>
程序的运行结果为
排序前:38659776132749
排序后:13273849657697
2.
己知两个链表head1和head2各自有序(例如升序排列),请把它们合并成一个链表,要求合并后的链表依然有序。正确答案:分别用指针head1、head2来遍历两个链表,如果当前head1指向的数据小于head2指向的数据,则将head1指向的结点归入合并后的链表中,否则,将head2指向的结点归入合并后的链表中。如果有一个链表遍历结束,则把未结束的链表连接到合并后的链表尾部。
下图以一个简单的示例来介绍合并的具体方法。
由于链表按升序排列,首先通过比较链表第一个结点中元素的大小来确定最终合并后链表的头结点;接下来每次都找两个链表中剩余结点的最小值链接到被合并的链表后面,如上图中的虚线所示。在实现的时候需要注意,要释放head2链表的头结点,具体实现代码如下:
<?php
//链表结点
classnode{
public$id;
//结点id
public$data;
//结点名称
public$next;
//下一结点
publicfunction__construct($id,$data){
$this->id=$id;
$this->data=$data;
$this->next=null;
}
}
//单链表
classlinkList{
public$header;
//链表头结点
//构造方法
publicfunction___construct($id=null,$data=null){
$this->header=newnode($id,$data,null);
}
//添加结点数据
publicfunctionaddLink($node){
$current=$this->header;
while($current->next!=null){
if($current->next->id>$node->id){
break;
}
$current=$current->next;
}
$node->next=$current->next;
$current->next=$node;
}
//删除链表结点
publicfunctionfree($id){
$current=$this->header;
$flag=false;
while($current->next!=null){
//echo$current->next->id."---".$id."<br>";
if($current->next->id==$id){
$flag=true;
break;
}
$current=$current->next;
}
if($flag){
$current->next=$current->next->next;
}else{
echo"未找到id=".$id."的结点!<br>";
}
}
//清空链表
publicfunctionclear(){
$this->header=null;
}
//获取链表
publicfunctiongetLinkList(){
$current=$this->header;
if($current->next==null){
echo("链表为空!");
return;
}
while($current->next!=null){
echo$current->next->data."";
if($current->next->next==null){
break;
}
$current=$current->next;
}
}
}
/*
*合并两个链表
*
*/
functionMerge($head1,$head2){
if($head1==NULL)
return$head2;
if($head2==NULL)
return$head1;
$cur1=$head1->next;
//用来遍历head1
$cur2=$head2->next;
//用来遍历head2
$head=NULL;
//合并后链表的头结点
$cur=NULL;
//合并后的链表在尾结点
//合并后链表的头结点为第一个结点元素最小的那个链表的头结点
if($cur1->data>$cur2->data){
$head=$head2;
$cur=$cur2;
$cur2=$cur2->next;
}else{
$head=$head1;
$cur=$cur1;
$cur1=$cur1->next;
}
//每次找链表剩余结点的最小值对应的结点链接到合并后链表的尾部
while($cur1&&$cur2){
if($cur1->data<$cur2->data){
$cur->next=$cur1;
$cur=$cur1;
$cur1=$cur1->next;
}else{
$cur->next=$cur2;
$cur=$cur2;
$cur2=$cur2->next;
}
}
//当遍历完一个链表后把另外一个链表剩余的结点链接到合并后的链表后面
if($cur1!=NULL){
$cur->next=$cur1;
}
if($cur2!=NULL){
$cur->next=$cur2;
}
return$head;
}
$head1=newlinkList();
$head2=newlinkList();
$num=0;
for($i=1;$i<7;){
$head1->addLink(newnode($i,$i));
$num++;
$i+=2;
}
$num=0;
for($i=2;$i<7;){
$head2->addLink(newnode($num,$i));
$num++;
$i+=2;
}
echo"head1:";
$head1->getLinkList();
echo"head2:";
$head2->getLinkList();
echo"合并后的链表:";
$heads=merge($head1->header,$head2->header);
for($cur=$heads->next;$cur!=NULL;){
echo$cur->data."";
$cur=$cur->next;
}
//释放链表所占的空间
$head1->clear();
$head2->clear();
?>
程序的运行结果为
head1:135
head2:246
合并后的链表:123456
算法性能分析:这种方法只需要对链表进行一次遍历,因此,时间复杂度为O(n)。另外由于只需要几个指针变量来保存结点的地址信息,因此,空间复杂度为O(1)。
3.
请写一段PHP代码,确保多个进程同时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四年级简便运算练习题(100道)
- 大学体育与健康 教案 武术散打15
- 实习证明模板下载版(样本)
- 下步工作计划怎么写(共13篇)
- 湖北汽车工业学院科技学院《机械制造技术基础》2023-2024学年第一学期期末试卷
- 湖北汽车工业学院《知识产权案例分析》2022-2023学年第一学期期末试卷
- 招聘广告模板(多篇)
- 开课课件教学课件
- 肾造瘘术后体位护理
- 未成年离异孩子改姓协议书范文(2篇)
- 2023年4月自考00808商法试题及答案含解析
- 2022信息系统安全运维报告模板
- 电解质紊乱-课件
- 银行物业服务环境卫生管理方案
- 文旅剧本杀项目策划方案
- 红军之父伟大的革命家朱德
- 给小学生科普人工智能
- 哥斯达黎加资料课件
- 退休兼职规定
- 6、电力建设工程概预算定额-热力设备安装工程课件
- 香港大公报电子版
评论
0/150
提交评论