一份php高级工程师的面试题,我天天看一点点
1. 基本知识点
- HTTP协议中几个状态码的含义:1xx(临时响应)
- 表示临时响应并须要请求者继续执行操做的状态代码。
-
- 代码 说明
- 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其他部分。
- 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
-
- 2xx (成功)
- 表示成功处理了请求的状态代码。
- 代码 说明
- 200 (成功) 服务器已成功处理了请求。 一般,这表示服务器提供了请求的网页。
- 201 (已建立) 请求成功而且服务器建立了新的资源。
- 202 (已接受) 服务器已接受请求,但还没有处理。
- 203 (非受权信息) 服务器已成功处理了请求,但返回的信息可能来自另外一来源。
- 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
- 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
- 206 (部份内容) 服务器成功处理了部分 GET 请求。
-
- 3xx (重定向)
- 表示要完成请求,须要进一步操做。 一般,这些状态代码用来重定向。
-
- 代码 说明
- 300 (多种选择) 针对请求,服务器可执行多种操做。 服务器可根据请求者 (user agent) 选择一项操做,或提供操做列表供请求者选择。
- 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
- 302 (临时移动) 服务器目前从不一样位置的网页响应请求,但请求者应继续使用原有位置来进行之后的请求。
- 303 (查看其余位置) 请求者应当对不一样的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
- 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
- 305 (使用代理) 请求者只能使用代理访问请求的网页。 若是服务器返回此响应,还表示请求者应使用代理。
- 307 (临时重定向) 服务器目前从不一样位置的网页响应请求,但请求者应继续使用原有位置来进行之后的请求。
-
- 4xx(请求错误)
- 这些状态代码表示请求可能出错,妨碍了服务器的处理。
-
- 代码 说明
- 400 (错误请求) 服务器不理解请求的语法。
- 401 (未受权) 请求要求身份验证。 对于须要登陆的网页,服务器可能返回此响应。
- 403 (禁止) 服务器拒绝请求。
- 404 (未找到) 服务器找不到请求的网页。
- 405 (方法禁用) 禁用请求中指定的方法。
- 406 (不接受) 没法使用请求的内容特性响应请求的网页。
- 407 (须要代理受权) 此状态代码与 401(未受权)相似,但指定请求者应当受权使用代理。
- 408 (请求超时) 服务器等候请求时发生超时。
- 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
- 410 (已删除) 若是请求的资源已永久删除,服务器就会返回此响应。
- 411 (须要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
- 412 (未知足前提条件) 服务器未知足请求者在请求中设置的其中一个前提条件。
- 413 (请求实体过大) 服务器没法处理请求,由于请求实体过大,超出服务器的处理能力。
- 414 (请求的 URI 过长) 请求的 URI(一般为网址)过长,服务器没法处理。
- 415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
- 416 (请求范围不符合要求) 若是页面没法提供请求的范围,则服务器会返回此状态代码。
- 417 (未知足指望值) 服务器未知足"指望"请求标头字段的要求。
-
- 5xx(服务器错误)
- 这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误多是服务器自己的错误,而不是请求出错。
-
- 代码 说明
- 500 (服务器内部错误) 服务器遇到错误,没法完成请求。
- 501 (还没有实施) 服务器不具有完成请求的功能。 例如,服务器没法识别请求方法时可能会返回此代码。
- 502 (错误网关) 服务器做为网关或代理,从上游服务器收到无效响应。
- 503 (服务不可用) 服务器目前没法使用(因为超载或停机维护)。 一般,这只是暂时状态。
- 504 (网关超时) 服务器做为网关或代理,可是没有及时从上游服务器收到请求。
- 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
。。。
- Include require include_once require_once 的区别. 答案(总结出两点:1.include()是运行是进行加载require是不管在哪儿都要加载到当前脚本2.include()出现错误脚本不终止而require出现错误脚本终止再也不继续执行)
- PHP/Mysql中几个版本的进化史,好比mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
- MySQL:
-
- 1、从 4.0 到 4.1 的主要变化
-
- 若是在4.1.0到4.1.3版本的MySQL中建立了包含 TIMESTAMP 字段的 InnoDB表。则在升级到4.1.4及更高时须要重建表,由于存储格式发生变化了。
-
- 字符串根据标准SQL来比较:比较以前不删除末尾的空格,之前用末尾空格扩展了比较短的字符串。如今的结果是
-
- 'a' > 'a\t',之前则不这样。能够用 mysqlcheck 来检查一下数据表。
-
- TIMESTAMP 返回 'YYYY-MM-DD HH:MM:SS' 格式的字符串。在MySQL 4.0中,能够增长选项 --new 来得到ySQL 4.1中这方面的特性。
-
- 在MySQL4.1.1前,语句解析器不是那么严格,它在处理字符串转时间转换时会忽略第一个数字前的其余字符。在4.1.1以后,就比较严格了,返回结果是 DATE, DATETIME, 或 TIME 类型的函数的结果会被转换成时间型
-
- 2、再看从 4.1 到 5.0 的主要变化
-
- ◆InnoDB 和 MyISAM 表中空格结尾的 TEXT 字段索引顺序改变了。所以须要运行"CHECK TABLE" 语句修复数据表,若是出现错误,就运行 "OPTIMIZE TABLE" 或 "REPAIR TABLE" 语句修复,甚至从新转储(用mysqldump)。
-
- ◆MySQL 5.0.15开始,如何处理 BINARY 字段中填充的值已经改变了。填充的值如今是0x00 而非空格了,而且在取值的时候不会去除末尾的空格。
-
- ◆从MySQL 5.0.3开始,DECIMAL 的实现方式已经改变了,5.0对 DECIMAL的格式限制严格多了。在MySQL 5.0.3到5.0.5之间版本的 MyISAM 和 InnoDB 表中建立的 DECIMAL字段升级到5.0.6以后会发生崩溃。从5.0.3开始,DECIMAL 用更有效的格式来存储。5.0.3开始,在计算 DECIMAL 值和舍入精确值的时候采用精确数学。
-
- ◆在之前,等待超时的锁会致使 InnoDB回滚当前所有事务,从5.0.13开始,就只回滚最近的SQL语句了。
-
- ◆在4.1.13/5.0.8之前,DATETIME 的加0后就转换成 YYYYMMDDHHMMSS 格式,如今变为YYYYMMDDHHMMSS.000000 格式了
-
- ◆4.1中,FLOAT 或 DOUBLE 之间的比较碰巧没问题,但在5.0中可能就不行了
-
- ◆从5.0.3开始,VARCHAR 和 VARBINARY 字段中末尾的空格再也不删除
-
- ◆增长了一个新的启动选项 innodb_table_locks,它致使 LOCK TABLE 时也能够请求InnoDB 表锁。这个选项默认打开,不过可能在 AUTOCOMMIT=1 和 LOCK TABLES应用中会致使死锁。看来,我只需主要关注 时间(TIMESTAMP, DATETIME< DATE, TIME) 和数值型(FLOAD, DOUBLE, DECIMAL) 这两种类型的变化;另外,我升级过程当中暂时还不须要涉及到字符集问题,所以相对轻松一些。
-
- 升级步骤以下:
-
- 执行
-
- FLUSH TABLES WITH READ LOCK;
-
- 直接拷贝 MyISAM 表文件
-
- 用 mysqldump 导出 Innodb 类型的表
-
- 整个过程都很顺利,新系统启动以后,发现以下2个问题:
-
- 新增了关键字 INOUT,所以须要检查表结构中还有其余什么字段使用关键字了
-
- DATE_FORMAT 函数要求严谨多了,
-
- DATE_FORMAT('2006/11/24 09:14:00', '%Y-%m-%d %T')
- 和DATE_FORMAT('2006/11/2409:14:00', '%Y-%m-%d %T')
-
- 的结果彻底不同,在 4.0 中,能兼容这两种格式,而在 5.0 中,只能正确的使用前者了,后者则会有问题。这也应该是上面提到的时间类型发生的变化所致。
PHP:
- PHP5如下几个改进值得关注:
- 一、极大地提升了面向对象能力;
- 二、支持try/catch异常处理;
- 三、改进了字符串地处理;
- 四、改经了xml和web服务支持;
- 五、对SQlite内置支持。
- HEREDOC介绍
- Heredoc技术,在正规的PHP文档中和技术书籍中通常没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。可是如今的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind模板就是一个典型的例子。
-
- 1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。开始标记和开始标记相同,好比经常使用大写的EOT、EOD、EOF来表示,可是不仅限于那几个,只要保证开始标记和结束标记不在正文中出现便可。
-
- 2.位于开始标记和结束标记之间的变量能够被正常解析,可是函数则不能够。在heredoc中,变量不须要用链接符.或,来拼接,以下:
-
- $v=2;
- $a= <<<EOF
- "abc"$v
- "123"
- EOF;
- echo $a;
-
- 3.heredoc经常使用在输出包含大量HTML语法d文档的时候。好比:函数outputhtml()要输出HTML的主页。能够有两种写法。很明显第二种写法比较简单和易于阅读。
-
- function outputhtml(){
- echo "<html>";
- echo "<head><title>主页</title></head>";
- echo "<body>主页内容</body>";
- echo "</html>;
- }
-
- function outputhtml()
- {
- echo <<<EOT
- <html>
- <head><title>主页</title></head>
- <body>主页内容</body>
- </html>
- EOT;
- }
-
- outputhtml();
-
- 在heredoc中会自动替换其中的$变量,将命令和输入放在一块,方便
- 写出一些php魔幻方法;
- php规定以两个下划线(__)开头的方法都保留为魔术方法,因此建议你们函数名最好不用__开头,除非是为了重载已有的魔术方法。
- PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload
- 一、__get、__set
- 这两个方法是为在类和他们的父类中没有声明的属性而设计的
- __get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
- __set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
- 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
- 二、__isset、__unset
- __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
- __unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
- 与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
- 三、__call
- __call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法
- 这里的未定义的方法包括没有权限访问的方法;若是方法不存在就去父类中找这个方法,若是父类中也不存在就去调用本类的__call()方法,若是本类中不存在__call()方法就去找父类中的__call()方法
-
- 四、__autoload
- __autoload 函数,它会在试图使用还没有被定义的类时自动调用。经过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
- 若是要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:
- view plaincopy to clipboardprint?
- <?php
- class Loader
- {
- static function autoload_class($class_name)
- {
- }
- }
-
- spl_autoload_register(array('Loader', 'autoload_class'));
-
- $a = new Test();
-
- ?>
- 注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并致使致命错误,因此应该在函数自己作捕获。
- 五、__construct、__destruct
- __construct 构造方法,当一个对象建立时调用此方法,相对于PHP4使用此方法的好处是:可使构造方法有一个独一无二的名称,不管它所在的类的名称是什么.这样你在改变类的名称时,就不须要改变构造方法的名称
- __destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认状况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数容许你在使用一个对象以后执行任意代码来清除内存。当PHP决定你的脚本再也不与对象相关时,析构函数将被调用。
- 在一个函数的命名空间内,这会发生在函数return的时候。
- 对于全局变量,这发生于脚本结束的时候。
- 若是你想明确地销毁一个对象,你能够给指向该对象的变量分配任何其它值.一般将变量赋值勤为NULL或者调用unset.
- 六、__clone
- PHP5中的对象赋值是使用的引用赋值,若是想复制一个对象则须要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法,若是在对象复制须要执行某些初始化操做,能够在__clone方法实现。
- 七、__toString
- __toString方法在将一个对象转化成字符串时自动调用,好比使用echo打印对象时。
- 若是类没有实现此方法,则没法经过echo打印对象,不然会显示:Catchable fatal error: Object of class test could not be converted to string in
- 此方法必须返回一个字符串。
- 在PHP 5.2.0以前,__toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0以后,则能够在任何字符串环境生效(例如经过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,若是将一个未定义__toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。
- 八、__sleep、__wakeup
- __sleep 串行化的时候用
- __wakeup 反串行化的时候调用
- serialize() 检查类中是否有魔术名称 __sleep 的函数。若是这样,该函数将在任何序列化以前运行。它能够清除对象并应该返回一个包含有该对象中应被序列化的全部变量名的数组。
- 使用 __sleep 的目的是关闭对象可能具备的任何数据库链接,提交等待中的数据或进行相似的清除任务。此外,若是有很是大的对象而并不须要彻底储存下来时此函数也颇有用。
- 相反地,unserialize() 检查具备魔术名称 __wakeup 的函数的存在。若是存在,此函数能够重建对象可能具备的任何资源。
- 使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库链接以及处理其它从新初始化的任务。
- 九、__set_state
- 当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
- 本方法的惟一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
- 十、__invoke
- 当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
- PHP5.3.0以上版本有效
- 十一、__callStatic
- 它的工做方式相似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,
- PHP5.3.0以上版本有效
- PHP 确实增强了对 __callStatic() 方法的定义;它必须是公共的,而且必须被声明为静态的。一样,__call() 魔术方法必须被定义为公共的,全部其余魔术方法都必须如此
- 一些编译php时的configure 参数
- 向php传入参数的两种方法。
- (mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
- char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
-
- char(M)类型的数据列里,每一个值都占用M个字节,若是某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操做中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每一个值只占用恰好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
-
- 在MySQL中用来判断是否须要进行对据列类型转换的规则
-
- 一、在一个数据表里,若是每个数据列的长度都是固定的,那么每个数据行的长度也将是固定的.
- 二、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
- 三、若是某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.
- 例外:长度小于4个字符的char数据列不会被转换为varchar类型
-
- 一个定长
- 一个不定长
- a char(10)
- b varchar(10)
- 都存入'abc'
- a 10字节
- b 3字节
- error_reporting 等调试函数使用
- 您是否用过版本控制软件? 若是有您用的版本控制软件的名字是?
- posix和perl标准的正则表达式区别;
- Safe_mode 打开后哪些地方受限.
- 写代码来解决多进程/线程同时读写一个文件的问题。
- 你们都知道,PHP是没有多线程概念的,尽管如此咱们仍然能够用“不完美”的方法来模拟多线程。简单的说,就是队列处理。经过对文件进行加锁和解锁,来实现。当一个文件被一个用户操做时,该文件是被锁定的,其余用户只能等待,确实不够完美,可是也能够知足一些要求不高的应用。
- function T_put($filename,$string){
- $fp = fopen($filename,’a');
- if (flock($fp, LOCK_EX)){
- fputs($fp,$string);
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- }
- function T_get($filename,$length){
- $fp = fopen($filename,’r');
- if (flock($fp, LOCK_SH)){
- $result = fgets($fp,$length);
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- return $result;
- }
- 写一段上传文件的代码。
- Mysql 的存储引擎,myisam和innodb的区别。
- 简单的表达。
- MyISAM 是非事务的存储引擎。
- innodb是支持事务的存储引擎。
-
- innodb的引擎比较适合于插入和更新操做比较多的应用
- 而MyISAM 则适合用于频繁查询的应用
-
- MyISAM
- innodb
- MyISAM 不会出现死锁。
-
- 最大的区别就是MYISAM适合小数据,小并发;INNODB 适合大数据,大并发。最大的区别就是在锁的级别上。
-
- MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。综述,就能够根据数据表不一样的用处是用不一样的存储类型。并且MyISAM是文件存储的,能够进行直接在不一样操做系统间拷贝使用。
-
- InnoDB:
- InnoDB 给 MySQL 提供了具备事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提升了多用户并发操做的性能表现。在InnoDB表中不须要扩大锁定(lock escalation),由于 InnoDB 的列锁定(row level locks)适宜很是小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中创建其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不同,举例来讲,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操做系统的文件大小,通常为 2 GB。InnoDB全部的表都保存在同一个数据文件 ibdata1 中(也多是多个文件,或者是独立的表空间文件),相对来讲比较很差备份,能够拷贝文件或用navicat for mysql。
-
- MyISAM
- 每张MyISAM 表被存放在三个文件 :frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引申。
- 由于MyISAM相对简单因此在效率上要优于InnoDB,小型应用使用MyISAM是不错的选择。
- MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去很多的麻烦
2. web 架构,安全,项目经验
- 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。
- 使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
- MySQL数据库做发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
- 写出一种排序算法(原理),并说出优化它的方法。
- 请简单阐述您最得意的开发之做
- 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
- 您是否用过模板引擎? 若是有您用的模板引擎的名字是?
- 请介绍Session的原理,大型网站中Session方面应注意什么?
- 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。
- 正则提出一个网页中的全部连接.
- 介绍一下常见的SSO(单点登录)方案(好比dedecms整合discuz的passport)的原理。
- 您写过的PHP框架的特色,主要解决什么问题,与其余框架的不一样点。
- 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?
- 相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程当中有进度条显示。每一个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各种开源软件和简单用途。
- 一 群猴子排成一圈,按1,2,…,n依次编号。而后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的 进行下去,直到最后只剩下一只猴子为止,那只猴子就叫作大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。
3. unix/linux 基本使用
- linux下查看当前系统负载信息的一些方法。
- vim的基本快捷键。
- ssh 安全加强方法;密码方式和rsa key 方式的配置。
- rpm/apt/yum/ports 装包,查询,删除的基本命令。
- Makefile的基本格式,gcc 编译,链接的命令,-O0 和-O3区别。
- gdb,strace,valgrind的基本使用.
4. 前端,HTML,JS
- css盒模型。
- javascript中的prototype。
- javascript中this对象的做用域。
- IE和firefox事件冒泡的不一样。
- 什么是怪异模式,标准模式,近标准模式。
- DTD的定义
- IE/firefox经常使用hack.
- firefox,IE下的前端js/css调试工具。
欢迎关注本站公众号,获取更多信息