PHP高级面试题

 

在网上看到一些高级php 的面试题目。。javascript

最近接连面试了几家公司,有些重要问题记录一下,督促本身学习提升,同时但愿给朋友们一些帮助。
内容不少,一点点完善,一步步学习。。
有些是面试被问,有些是招聘要求,有些是本身整理加的。

php

1、mysql相关知识
    一、 mysql优化方式
            MYSQL 优化经常使用方法
            mysql 性能优化方案
  
    二、如何分库分表
           参考:
   http://blog.sina.com.cn/s/blog_6e322ce70100zs9a.html
           http://www.jb51.net/article/29771.htm

   三、 Mysql+如何作双机热备和负载均衡
http://www.dewen.org/q/51/Mysql+如何作双机热备和负载均衡
    
   四、数据表类型有哪些
       MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等
       MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。
       InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。

       myisam和Innodb引擎的主要特色
       MySQL的存储引擎MyISAM与InnoDB有什么区别?

   五、防sql注入方法
      mysql_escape_string(strip_tags($arr["$val"]));
css

  1. /**
  2. * 函数名称:post_check() 
  3. * 函数做用:对提交的编辑内容进行处理 
  4. * 参  数:$post: 要提交的内容 
  5. * 返 回 值:$post: 返回过滤后的内容 
  6. */
  7. function post_check($post){
  8. if(!get_magic_quotes_gpc()){// 判断magic_quotes_gpc是否为打开 
  9. $post = addslashes($post);// 进行magic_quotes_gpc没有打开的状况对提交数据的过滤 
  10. }
  11. $post = str_replace("_","\_",$post);// 把 '_'过滤掉
  12. $post = str_replace("%","\%",$post);// 把 '%'过滤掉
  13. $post = nl2br($post);// 回车转换 
  14. $post =htmlspecialchars($post);// html标记转换 
  15.  
  16. return $post;
  17. }

 

   六、mysql把一个大表拆分多个表后,如何解决跨表查询效率问题
   七、索引应用
         什么状况下考虑索引
         什么状况不适合索引
         一个语句是否用到索引如何判断
        常常发生的用不到索引的场景:
                like '%.....'
                数据类型隐式转换
                or 关键字加其它条件约束
       全文索引:
                只能用于MYIsAM表,在CHAR,VARCHAR,TEXT类型的列上建立。
       html

   八、mysql对于大表(千万级),要怎么优化呢?
        参考http://www.zhihu.com/question/19719997

   九、mysql的慢查询问题
  其实经过慢查询日志来分析是一种比较简单的方式,若是不想看日志,能够借助工具来完成,前端

如mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter等,感受本身来分析一个须要丰富的经验,一个浪费时间。java

十、关于用户登陆状态存session,cookie仍是数据库或者memcache的优劣 http://www.dewen.org/q/11504/mysql

关于用户登陆状态存session%2Ccookie仍是数据库或者memcache的优劣linux

  十一、事务应用极端状况处理
  十二、sql语言分4大类请列举
        DDL--CREATE,DROP,ALTER
        DML--INSERT,UPDATE,DELETE
        DQL-SELECT
        DCL--GRANT,REVOKE,COMMIT,ROLLBACK
         nginx

 

2、php基础web

  •   session的跨域共享


3、php高级

  • 长链接和短链接的使用
  • socket的使用
  • 支付安全问题

  • 面向对象
    三大特性:封装、继承、多态(方法重写)。
    抽象类:abstract,至少有一个方法是抽象方法,不能被实例化,为子类定义公共接口。
    接口:interface,解决php的单继承问题,全部方法都是public访问权限的抽象方法,不能声明变量只能声明常量。
    继承一个类的同时实现多个接口
    class A  extends B implements 接口1,接口2...,接口n(){
          //实现全部接口中的方法
    }
  • lamp 和 lnmp 网站架构性能差别的缘由分析
  • 解释性语言和编译性语言的性能分析,举例。

4、正则

      email,html,js等匹配

5、开发基础

  •       进程和线程定义,区别和联系。
           进程的状态:运行run、就绪ready、等待wait

6、Nosql数据库
       memcached、redis、mongodb的区别联系
       3个场景彻底不一样的东西。1.memcached:单一键值对内存缓存的,作对象缓存无可替代的分布式缓存;2.redis:是算法和数据结构的集合,快速的数据结构操做是他最大的特色,支持数据持久化;3.mongodb是bson结构、介于rdb和nosql之间的,更松散更灵活的,可是不支持事务,只用做非重要数据存储。

     参考 MongoDB 或者 redis 能够替代 memcached 吗?

7、经常使用linux命令
      好比软连接

8、架构相关

  •        项目上线前的压力测试,单台服务器支持的并发数,pv数。

 

  •        服务器资源合理分配问题

             CPU:Apache
                   MySQL处在高负载环境下,磁盘IO读写过多,确定会占用不少资源,必然会CPU占用太高。
             内存:内存库,数据库软件
                
             硬盘:文件

  •        web2.0架构选择

              MongoDB+redis 或者 MySQL+Memcached 比较好的组合,逻辑简单的就用NOSQL

  •        当前流行主要网站架构
    LAMP、LNMP、LLMP
    如今网络上还有一种LNAMP构架,也就是综合了nginx和Apache的优势,使用Apache负载PHP,nginx负责解析其余Web请求,使用nginx的rewrite模块,可是Apache端口不对外开放,Apache的许多模块均可以不加载减小资源。


其它:
数据挖掘经验、熟悉hadoop/lucene/mahout;

 

 

闲来无事,搞了一些答案。。。可能不是很全面,留这之后备用吧。

一. 基本知识点
1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。
200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求须要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。通常服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。

1.2 Include require include_once require_once 的区别.
处理失败方式不一样:
require 失败时会产生一个致命级别错误,并中止程序运行。
include 失败时只产生一个警告级别错误,程序继续运行。

include_once/require_once和include/require 处理错误方式同样,
惟一区别在于当所包含的文件代码已经存在时候,不在包含。

1.3 PHP/Mysql中几个版本的进化史,好比mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。


1.4 HEREDOC介绍
一种定义字符串的方法。
结构:
<<<。在该提示符后面,要定义个标识符(单独一行),
而后是一个新行。接下来是字符串 自己,
最后要用前面定义的标识符做为结束标志(单独一行)
注意:
标识符的命名也要像其它标签同样遵照PHP的规则:
只能包含字母、数字和下划线,而且必须以字母和下划线做为开头


1.5 写出一些php魔幻(术)方法;
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。好比 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

1.6 一些编译php时的configure 参数
–prefix=/usr/local/php php安装目录
–with-config-file-path=/usr/local/php/etc 指定php.ini位置
–with-mysql=/usr/local/mysql mysql安装目录,对mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持

更多可使用 ./configure help 查看

 

1.7 向php传入参数的三种方法。

方法一 使用$argc $argv

方法二 使用getopt函数()

方法三 提示用户输入,而后获取输入的参数。有点像C语言


1.8 (mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
int : 数值类型
char : 固定长度字符串类型
varchar : 可变长度字符串类型
datetime : 时期时间类型
text : 文本类型

varchar和char有什么区别:
a. char 长度是固定的,无论你存储的数据是多少他都会都固定的长度。
而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。

b. char 固定长度,因此在处理速度上要比varchar快速不少,可是浪费存储空间,
因此对存储不大,但在速度上有要求的可使用char类型,反之能够用varchar类型来实例。


1.9 error_reporting 等调试函数使用
error_reporting() 函数可以在运行时设置php.ini中 error_reporting 指令。
因此能够再程序中随时调节显示的错误级别。
使用此函数时 display_errors必须是打开状态。

1.10 您是否用过版本控制软件? 若是有您用的版本控制软件的名字是?

 

1.11 posix和perl标准的正则表达式区别;

 

1.12 Safe_mode 打开后哪些地方受限.
启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数.
全部操做文件的函数将只能操做与脚本UID相同的文件.


1.13 写代码来解决多进程/线程同时读写一个文件的问题。
PHP是不支持多线程的,可使用php的flock加锁函数实现。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);


1.14 写一段上传文件的代码。
upload.html
<form enctype="multipart/form-data" method="POST" action="upload.php">
Send this file: <input name="name" type="file" />
<input type="submit" value="Send File" />
</form>

upload.php
$uploads_dir = '/uploads';
foreach ($_FILES["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["tmp_name"][$key];
$name = $_FILES["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}

 


1.15 Mysql 的存储引擎,myisam和innodb的区别。
a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
c. InnoDB不支持FULLTEXT类型的索引.
d. InnoDB 中不保存表的具体行数,也就是说,
执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,
可是MyISAM只要简单的读出保存好的行数便可.
e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中,能够和其余字段一块儿创建联合索引。
f. DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除。
g. LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,
可是对于使用的额外的InnoDB特性(例如外键)的表不适用.
h. MyISAM支持表锁,InnoDB支持行锁。


二. web 架构,安全,项目经验
2.1 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。


2.2 使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
首先,打开mod_rewrite模块。

其次,http.conf找到如下代码段:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
将其中的:AllowOverride None 改成 AllowOverride All ,重启httpd服务便可。

而后,在项目根目录下简历 .htaccess 文件,填写规则。

2.3 MySQL数据库做发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
a. 设计良好的数据库结构,容许部分数据冗余,尽可能避免join查询,提升效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql库主从读写分离。
d. 找规律分表,减小单表中的数据量提升查询速度。
e。添加缓存机制,好比memcached,apc等。
f. 不常常改动的页面,生成静态页面。
g. 书写高效率的SQL。好比 SELECT * FROM TABEL 改成 SELECT field_1, field_2, field_3 FROM TABLE.


2.4 写出一种排序算法(原理),并说出优化它的方法。


2.5 请简单阐述您最得意的开发之做


2.6 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
a. 确认服务器是否能支撑当前访问量。
b. 优化数据库访问。参考2.3
c. 禁止外部访问连接(盗链), 好比图片盗链。
d. 控制文件下载。
e. 使用不一样主机分流。
f. 使用浏览统计软件,了解访问量,有针对性的进行优化。


2.7 您是否用过模板引擎? 若是有您用的模板引擎的名字是?
Smarty

2.8 请介绍Session的原理,大型网站中Session方面应注意什么?

 


2.9 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。


2.10 正则提出一个网页中的全部连接.


2.11 介绍一下常见的SSO(单点登录)方案(好比dedecms整合discuz的passport)的原理。


2.12 您写过的PHP框架的特色,主要解决什么问题,与其余框架的不一样点。


2.13 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?


2.14 相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程当中有进度条显示。每一个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各种开源软件和简单用途。
一群猴子排成一圈,按1,2,…,n依次编号。而后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫作大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。


三. unix/linux 基本使用
3.1 linux下查看当前系统负载信息的一些方法。


3.2 vim的基本快捷键。


3.3 ssh 安全加强方法;密码方式和rsa key 方式的配置。


3.4 rpm/apt/yum/ports 装包,查询,删除的基本命令。


3.5 Makefile的基本格式,gcc 编译,链接的命令,-O0 和-O3区别。


3.6 gdb,strace,valgrind的基本使用.


四. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this对象的做用域。
IE和firefox事件冒泡的不一样。
什么是怪异模式,标准模式,近标准模式。
DTD的定义
IE/firefox经常使用hack.
firefox,IE下的前端js/css调试工具。

 

 

五.如何理解 ThinkPHP 3.0 架构三(核心 + 行为 + 驱动)中的行为?
核心 + 行为 + 驱动  
TP官方简称为:CBD
这个问题,在TP手册中已经有委详细地阐述了。。
核心(Core):就是框架的核心代码,不可缺乏的东西,TP自己是基于MVC思想开发的框架。
行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的做用,在系统核心之上,设置了不少标签扩展位,而每一个标签位置能够依次执行各自的独立行为。行为扩展就所以而诞生了,并且不少系统功能也是经过内置的行为扩展完成的,全部行为扩展都是可替换和增长的,由此造成了底层框架可组装的基础。
驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。
最好就是下载一份文档下来看,基本上TP里面全部的功能,都会有很详细的描述和范例讲解。

 

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你本身的系统。简单说就是使用别人搭好的舞台,你来作表演。并且,框架通常是成熟的,不断升级的软件。
为何要用框架?

由于软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就至关于让别人帮你完成一些基础工做,你只须要集中精力完成系统的业务逻辑设计。并且框架通常是成熟,稳健的,他能够处理系统不少细节问题,好比,事物处理,安全性,数据流控制等问题。还有框架通常都通过不少人使用,因此结构很好,因此扩展性也很好,并且它是不断升级的,你能够直接享受别人升级代码带来的好处。

框架通常处在低层应用平台(如java 里的 J2EE)和高层业务逻辑之间的中间层。

ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的

原名FCS,2007年元旦正式改名为ThinkPHP,而且遵循Apache2开源协议发布。早期的思想架构来源于Struts,后来通过不断改进和完善,同时也借鉴了国外不少优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(标签库)、RoR的ORM映射和 ActiveRecord模式,封装了CURD和一些经常使用操做,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现

使用ThinkPHP,你能够更方便和快捷的开发和部署应用,固然不只仅是企业级应用,任何PHP应用开发均可以从ThinkPHP的简单、兼容和快速的特性中受益。简洁、快速和实用是ThinkPHP发展秉承的宗旨,为此ThinkPHP会不断吸取和融入更好的技术以保证其新鲜和活力,提供WEB应用开发的最佳实践!
做为一个总体开发解决方案,ThinkPHP可以解决应用开发中的大多数须要,由于其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等经常使用的组件,而且对于跨版本、跨平台和跨数据库移植都比较方便。而且每一个组件都是精心设计和完善的,应用开发过程仅仅须要关注您的业务逻辑。

相关文章
相关标签/搜索