面试题及答案

1的执行结果是?
 答案:1
讲解:count(var)是用来统计数组或对象的元素个数的。当var是null或者空数组时,结果为0。如果var是普通变量,则返回1。正常情况下返回var中的元素或属性个数。
 
2、使用list()函数需要注意什么?
 
答案:list()是一个语法结构。List($array)是用来快速把数组中的元素赋给一些变量。使用时要注意,$array必须为一个索引数组,并且索引值从0开始。

$my_array = array("Dog","Cat","Horse");
 
list($a, $b, $c) = $my_array;
echo "I have several animals, a $a, a $b and a $c.";
?>

 
3. 写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php
 

1.  2.  $a="http://www.test.com.cn:88/abc/de/fg.php?id=1";  
3.    
4.  $b=parse_url($a);//解析 URL,以数组的方式返回其组成部分  
5.    
6.  var_dump($b);  
7.    
8.  echo '
';  
9.    
10. // 方法一  
11. echo substr($b['path'],strpos($b['path'],'.'));  
12.   
13. echo '
';  
14.   
15. // 方法二  
16. $path_array = explode('.',$b['path']);  
17. echo end($path_array);  

parse_url  substr  strops  explode  end
 
4、请对POSIX风格和兼容Prel风格两种正则表达式的主要函数进行类比说明
答案:POSIX 风格 : 匹配正则表达式ereg  和替换 ereg_replace
Prel风格:匹配正则表达式 preg_match  和替换 preg_replacePreg_match 比ereg的执行效率更快,preg_replace 比ereg_replace的执行效率更快。
 
5、php5中魔术方法有哪几个?请举例说明各自的用法。
答案: 1、__construct() :实例化对象时自动调用。
2、__destruct() :销毁对象或脚本执行结束时自动调用。
       3、__call() :调用对象不存在得方法时执行此函数。
       4、__get() :获取对象不存在的属性时执行此函数。
       5、__set() :设置对象不存在的属性时执行此函数。
       6、__isset() : 检测对象的某个属性是否存在时执行此函数。
       7、__unset() :销毁对象的某个属性时执行此函数。
       8、__toString() :将对象当作字符串输出时执行此函数。
       9、__clone() :克隆对象时执行此函数。
       10、__autoload() :实例化对象时,当类不存在时,执行此函数自动加载类。
       11、__sleep() :serialize之前被调用,可以指定要序列化的对象属性。
       12、__wakeup :unserialize之前被调用,可以执行对象的初始化工作。
       13、__set_state() :调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
       14、__invoke() :将对象当作函数来使用时执行此方法,通常不推荐这样做。
 
 
6、简述php的垃圾收集机制。
答案:php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。
 
 
7、用php实现一个双向队列。
队列是一种线性表,按照先进先出的原则进行
 单向队列:只能从头进,从尾出
 双向队列:头尾都可以进出
 class DuiLie {
    private $array = array();//声明空数组
 public function setFirst($item){
       return array_unshift($this->array,$item);//头入列
}
 
public function delFirst(){
return array_shift($this->array);//头出列
}
 
public function setLast($item){
return array_push($this->array,$item);//尾入列 
}
 
public function delLast(){
     return array_pop($this->array,$item);//尾出列 
}
 
public function show(){
 var_dump($this->array);//打印数组 
}
 
public function Del(){
  unset($this->array);//清空数组
}
 
}
 
 
8、描述一下大流量高并发量网站的解决方案
1首先,确认服务器硬件是否足够支持当前的流量 
2其次,优化数据库访问
 前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站, 静态化往往不能满足某些功能。缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用 这些文件,而不必再访问数据库,WordPress和Z-Blog都大 量使用这种缓存技术      如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用 Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大,尽量做到"所查即所得" ,遵循以小表为主,附表为辅,查询条件先索引,先小后大的原则,提高查询效率.量SQL查询。
3禁止外部的盗链
4控制大文件的下载 
大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗 CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。 
5使用不同主机分流主要流量
 将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS 输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了。
6使用流量分析统计软件      
在网站上安装一个流量分析统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化,因此,解决流量问题还需要进行精确的统计分析才可以。 我推荐使用的流量分析统计软件是Google Analytics(Google分析)。若还有其他的流量分析软件,欢迎共享交流.
 
 

 
9、数据库引擎
Innodb引擎
Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
MyIASM引擎
MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
主要区别:
1、MyIASM是非事务安全的,而InnoDB是事务安全的
2、MyIASM锁的粒度是表级的,而InnoDB支持行级锁
3、MyIASM支持全文类型索引,而InnoDB不支持全文索引
4、MyIASM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyIASM
5、MyIASM表保存成文件形式,跨平台使用更加方便
应用场景:
1、MyIASM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyIASM
2、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB
 
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。