在网上看到一些高级php 的面试题目。。
最近接连面试了几家公司,有些重要问题记录一下,督促自己学习提高,同时希望给朋友们一些帮助。
内容很多,一点点完善,一步步学习。。有些是面试被问,有些是招聘要求,有些是自己整理加的。一、mysql相关知识
1、 mysql优化方式 2、如何分库分表 参考: 3、 Mysql+如何做双机热备和负载均衡http://www.dewen.org/q/51/Mysql+如何做双机热备和负载均衡 4、数据表类型有哪些 MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等 MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。 InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。 myisam和Innodb引擎的主要特点 5、防sql注入方法 mysql_escape_string(strip_tags($arr["$val"]));- /**
- * 函数名称:post_check()
- * 函数作用:对提交的编辑内容进行处理
- * 参 数:$post: 要提交的内容
- * 返 回 值:$post: 返回过滤后的内容
- */
- function post_check($post){
- if(!get_magic_quotes_gpc()){ // 判断magic_quotes_gpc是否为打开
- $post = addslashes($post);// 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
- }
- $post = str_replace("_","\_",$post);// 把 '_'过滤掉
- $post = str_replace("%","\%",$post);// 把 '%'过滤掉
- $post = nl2br($post);// 回车转换
- $post =htmlspecialchars($post);// html标记转换
- return $post;
- }
6、mysql把一个大表拆分多个表后,如何解决跨表查询效率问题
7、索引应用 什么情况下考虑索引 什么情况不适合索引 一个语句是否用到索引如何判断 经常发生的用不到索引的场景: like '%.....' 数据类型隐式转换 or 关键字加其它条件约束 全文索引: 只能用于MYIsAM表,在CHAR,VARCHAR,TEXT类型的列上创建。8、mysql对于大表(千万级),要怎么优化呢?
参考http://www.zhihu.com/question/19719997 9、mysql的慢查询问题 其实通过慢查询日志来分析是一种比较简单的方式,如果不想看日志,可以借助工具来完成,如mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter等,感觉自己来分析一个需要丰富的经验,一个浪费时间。
10、关于用户登录状态存session,cookie还是数据库或者memcache的优劣 http://www.dewen.org/q/11504/
关于用户登录状态存session%2Ccookie还是数据库或者memcache的优劣
11、事务应用极端情况处理
12、sql语言分4大类请列举 DDL--CREATE,DROP,ALTER DML--INSERT,UPDATE,DELETE DQL-SELECT DCL--GRANT,REVOKE,COMMIT,ROLLBACK
二、php基础
- session的跨域共享
- php连接mysql数据库的几种方式及区别mysql:面向过程mysqli:面向对象pdo:可移植性高 请参考:
- 长连接和短连接的使用
- socket的使用
- 支付安全问题
- 面向对象三大特性:封装、继承、多态(方法重写)。抽象类:abstract,至少有一个方法是抽象方法,不能被实例化,为子类定义公共接口。接口:interface,解决php的单继承问题,所有方法都是public访问权限的抽象方法,不能声明变量只能声明常量。继承一个类的同时实现多个接口class A extends B implements 接口1,接口2...,接口n(){ //实现所有接口中的方法}
- lamp 和 lnmp 网站架构性能差异的原因分析
- 解释性语言和编译性语言的性能分析,举例。
四、正则
email,html,js等匹配
五、开发基础
- 进程和线程定义,区别和联系。 进程的状态:运行run、就绪ready、等待wait
六、Nosql数据库
memcached、redis、mongodb的区别联系 3个场景完全不同的东西。1.memcached:单一键值对内存缓存的,做对象缓存无可替代的分布式缓存;2.redis:是算法和数据结构的集合,快速的数据结构操作是他最大的特点,支持数据持久化;3.mongodb是bson结构、介于rdb和nosql之间的,更松散更灵活的,但是不支持事务,只用作非重要数据存储。 七、常用linux命令 比如软链接八、架构相关- 项目上线前的压力测试,单台服务器支持的并发数,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的许多模块都可以不加载减少资源。
闲来无事,搞了一些答案。。。可能不是很全面,留这以后备用吧。
一. 基本知识点
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 FollowSymLinksAllowOverride 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.3c. 禁止外部访问链接(盗链), 比如图片盗链。d. 控制文件下载。e. 使用不同主机分流。f. 使用浏览统计软件,了解访问量,有针对性的进行优化。 2.7 您是否用过模板引擎? 如果有您用的模板引擎的名字是?Smarty2.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,JScss盒模型。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能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。