PHP高级工程师的面试题
- HTTP协议中几个状态码的含义:1xx(临时响应)
Php代码
- 表示临时响应并需要请求者继续执行操作的状态代码。
- 代码 说明
- 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 的区别.
- PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
Php代码- MySQL:
- 一、从 4.0 到 4.1 的主要变化
- 如果在4.1.0到4.1.3版本的MySQL中创建了包含 TIMESTAMP 字段的 InnoDB表。则在升级到4.1.4及更高时需要重建表,因为存储格式发生变化了。
- 字符串根据标准SQL来比较:比较之前不删除末尾的空格,以前用末尾空格扩展了比较短的字符串。现在的结果是
- "a" > "a ",以前则不这样。可以用 mysqlcheck 来检查一下数据表。
- TIMESTAMP 返回 "YYYY-MM-DD HH:MM:SS" 格式的字符串。在MySQL 4.0中,可以增加选项 --new 来获得ySQL 4.1中这方面的特性。
- 在MySQL4.1.1前,语句解析器不是那么严格,它在处理字符串转时间转换时会忽略第一个数字前的其他字符。在4.1.1之后,就比较严格了,返回结果是 DATE, DATETIME, 或 TIME 类型的函数的结果会被转换成时间型
- 二、再看从 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 中,只能正确的使用前者了,后者则会有问题。这也应该是上面提到的时间类型发生的变化所致。
- PHP5以下几个改进值得关注:
- 1、极大地提高了面向对象能力;
- 2、支持try/catch异常处理;
- 3、改进了字符串地处理;
- 4、改经了xml和web服务支持;
- 5、对SQlite内置支持。
- HEREDOC介绍
Php代码- Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind模板就是一个典型的例子。
- 1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。
- 2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接,如下:
- $v=2;
- $a= <<<EOF
- "abc"$v
- "123"
- EOF;
- echo $a; //结果连同双引号一起输出:"abc"2 "123"
- 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规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
- PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload
- 1、__get、__set
- 这两个方法是为在类和他们的父类中没有声明的属性而设计的
- __get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
- __set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
- 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
- 2、__isset、__unset
- __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
- __unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
- 与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
- 3、__call
- __call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法
- 这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方法,如果本类中不存在__call()方法就去找父类中的__call()方法
- 4、__autoload
- __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
- 如果要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:
- view plaincopy to clipboardprint?
- <?php
- class Loader
- {
- static function autoload_class($class_name)
- {
- //寻找正确的$class_name类,并引入,没有则抛出异常
- }
- }
- /**
- * 设置对象的自动载入
- * spl_autoload_register — Register given function as __autoload() implementation
- */
- spl_autoload_register(array("Loader", "autoload_class"));
- $a = new Test();//Test没用require就实例化,实现自动加载,很多框架就用这种方法自动加载类
- ?>
- 注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。
- 5、__construct、__destruct
- __construct 构造方法,当一个对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
- __destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存。当PHP决定你的脚本不再与对象相关时,析构函数将被调用。
- 在一个函数的命名空间内,这会发生在函数return的时候。
- 对于全局变量,这发生于脚本结束的时候。
- 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
- 6、__clone
- PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
- 7、__toString
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: 构建高性能的web站点学习笔记六------反向代理缓存
- 下一篇:没有了