码迷,mamicode.com
首页 > Web开发 > 详细

php面试题与答案

时间:2016-06-29 11:27:28      阅读:1096      评论:0      收藏:0      [点我收藏+]

标签:

是什么 ,在什么地方用,注意什么,特点,如何配置(相关关联),出现的问题(缺点),引出解决办法或另一种方法

+-

PHPHypertext Preprocessor

 

一、getpost的区别

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端Request.QueryString获取变量的值,对于post方式,服务器端Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KBpost传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KBIIS5中为100KB
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

 

二、sessioncookie的区别

1cookie数据存放在客户的浏览器上,session数据放在服务器上。

2cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session

3session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20cookie

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE

6cookie5个参数(名,值,有效期,服务器路径,域名,规定是否通过安全的 HTTPS 连接来传输 cookie)

 

三、数据库中的事务是什么

事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。

隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,
       要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,
       并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

 

begin 开始一个事务

rollback事务回滚

commit事务确认

注:rollbackcommit不能并列使用,当同时使用时,只有前面一个生效

 

MYSQL默认是自动提交的

可以通过set autocommit=0 来设置 禁止自动提交

可以通过set autocommit=1 来设置 开启自动提交

 

四、PHP打印 日期

 

<?php
echo date(‘Y-m-d H:i:s‘, strtotime(‘-1 day‘)); //前一天
echo ‘<br>‘;
echo date(‘Y-m-d H:i:s‘, strtotime(‘-1 week‘));//前一周
echo ‘<br>‘;
echo date(‘Y-m-d H:i:s‘);//现在时间
echo ‘<br>‘;
echo date(‘Y-m-d H:i:s‘, strtotime(‘next Monday‘));//下一个星期一
echo ‘<br>‘;
echo date(‘Y-m-d H:i:s‘, strtotime(‘last Monday‘));//上一个星期一

echo “现在的时间是:” .date(h:i:sa);  //a - 小写的上午和午后(am pm

?>

/*  时间差  */

<?php
$startdate = strtotime("2012-01-01");
$enddate = strtotime("2012-02-14");
$days = round(($enddate-$startdate) / 86400)+1;
echo $days;
?>

先用5升的水壶装满水,倒入六升的水壶中.六升的水壶中还空出 一升水体积.

2.再用把盛五升水水壶装满水,倒入容积六升的水壶中,壶中还剩4升水.

3.把容积六升水中的水倒掉,再把容积五升的水壶倒满水,把这些水倒入容积六升的壶中,容积五升的水壶中这时刚好剩下三升水.

五、能够使HtmlPHP分离开的模板

 

smarty phptal templatePHPlib Template FastTemplate

 

Smarty , Dwoo , TinyButStrong , Template Lite , Savant , phemplate , XTemplate

 

六、$a=‘abcdef‘;请取出$a的值并打印出第一个字

echo $a[0];   echo $a{0};   echo chr(ord($a));

 

七、echo(),print(),print_r()的区别

echo
可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。

print()
函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false

printf()
printf()源于C语言中的printf()。该函数输出格式化的字符串。

print_r()var_dump()
print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头

有两个参数,第二个参数为true的时候,返回值,而不显示。

 

八、PHP可以和sql server/oracle等数据库连接吗

Oracle

<?php
$dbconn=oci_connect("你的账号","你的密码","你的数据库名称");//请把中文件设置为你的值;
$stmt=oci_parse($dbconn, "select * from scott.hallo");
oci_execute($stmt, OCI_DEFAULT);
echo $conn."----selecting\n\n"; 
while (oci_fetch($stmt))
{
echo ($conn."[".oci_result($stmt, "TEST")."]\n\n");
}
echo ($conn . "----done\n\n");
?>

 

 

 

九、php5权限控制修饰符

public(公共), private(私用), protected(继承)

 

九点一:魔术方法

__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __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 ) 当调用一个未定义的方法是调用此访求
这里的未定义的方法包括没有权限访问的方法

4__autoload
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
注意: __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。

5__construct__destruct
__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
析构函数允许你在使用一个对象之后执行任意代码来清除内存.
PHP决定你的脚本不再与对象相关时,析构函数将被调用.
在一个函数的命名空间内,这会发生在函数return的时候.
对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.

6__clone
PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法
如果在对象复制需要执行某些初始化操作,可以在__clone方法实现

7__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错误。

8__sleep__wakeup
__sleep 串行化的时候用
__wakeup 反串行化的时候调用
serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

9__set_state
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。

10__invoke
当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
PHP5.3.0以上版本有效
11__callStatic
它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,
PHP5.3.0以上版本有效
PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

  

 

十、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

 

例如: http://www.sina.com.cn/abc/de/fg.

public string GetExtended(string url)
{
    return url.Substring(url.LastIndexOf(‘.‘));
}

 

例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php

function getExt($url){
   $arr = parse_url($url);
  
   $file = basename($arr[‘path‘]);
   $ext = explode(".",$file);
   return $ext[1];
}

十一、php5的构造函数和析构函数是?

构造函数__construct()  在类实例化对象的同时执行该函数;析构函数:distruct() 在类实例化的对象销毁时执行。

 

十二、写一个函数,算出两个文件的相对路径
  如 $a = ‘/a/b/c/d/e.php‘;
  $b = ‘/a/b/12/34/c.php‘;
  计算出 $b 相对于 $a 的相对路径应该是 ../../c/d()添上

function getRelativePath($a, $b) {  
    $returnPath = array(dirname($b));  
    $arrA = explode(‘/‘, $a);  
    $arrB = explode(‘/‘, $returnPath[0]);  
    for ($n = 1, $len = count($arrB); $n < $len; $n++) {  
        if ($arrA[$n] != $arrB[$n]) {  
            break;  
        }   
    }  
    if ($len - $n > 0) {  
        $returnPath = array_merge($returnPath, array_fill(1, $len - $n, ‘..‘));  
    }  
      
    $returnPath = array_merge($returnPath, array_slice($arrA, $n));  
    return implode(‘/‘, $returnPath);  
   }  

 

遍历文件夹及文件

function show($dirs){

$dir = opendir($dirs);

echo "<ul>";

while($f=readdir($dir)){

if($f!=‘.‘ && $f!=‘..‘){

echo "<li>{$f}</li>";

if(is_dir("$dirs/{$f}")){

show("$dirs/{$f}");

}

}

}

echo "</ul>";

}

getFiles("C:\web\HTML5Upload");

//getFiles($_SERVER[‘DOCUMENT_ROOT‘]);

 

 

十三、如何 实现网站静态化

 

 

使用php的ob缓存实现页面静态化 引出ob缓存,一键生成时过期时间一致。

 

方法一:使用现成的插件,比如:ISAPI_RewriteIIS RewriteApache
HTTP服务器的mod_rewrite等,它们都是基于正则表达式解析器开发的重写引擎。它们的使用方法查看它们自带的帮助即可。

方法二:自己写的代码实现动态网页静态化,方法也有好几种:

1、创建FSO对象,利用此对象将所需的内容动态创建到文件中生成HTML页面;
2、利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值 生成HTML文件;
3、使用Server.Transfer转换技术,


方法三:使用HttpWebRequest请求客户端的方式,获取返回资源,生成静态页面。一般这样只需要获取网页内容即可,其它资源可放置在服务器上,自动加载。(注:此方法缺点明显,需要大量更改匹配URL,建议慎用)

方法四:在asp中有IhttpModule接口。Ihttpmodule可以简单理解为一个可以在执行像.aspx,或者mvccontrol/action前,添加我们自定义的操作的东西。

 

十四、大流量的网站如何解决访问量的问题

 

分类:服务器负载

确认服务器硬件是否足够支持当前的流量。

优化数据库访问。

禁止外部的盗链

控制大文件的下载

使用不同主机分流主要流量

使用流量分析统计软件。

 

十五、PHP获取客户端和服务器IP

客户端 $_SERVER[REMOTE_ADDR]
服务器 $_SERVER[SERVER_ADDR]

 

十六、includerequire 的区别

includerequire 都能把另外一个文件包含到当前文件中

include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。

require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。

 

十七、如何修改session的生存时间

一:在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间

二:代码实现
$lifeTime = 24 * 3600;  // 保存一天
session_set_cookie_params($lifeTime);
session_start();

 

十八、php根据URL获得网页内容

$html = file_get_contents(‘http://www.baidu.com/‘);  

使用URL获取内容

使用sinope

 

十九、在HTTP 1.0中,状态码401的含义是什么;如果返回“找不到文件”的提示,用header函数

 

状态码401的含义是:未授权(Unauthorized)

如果返回找不到文件的提示 用:Header("http/1.0 403 Forbidden");

(一)、1字开头:这一类型 的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,史包含状态行和某些可选 的响应头信息,并以空行结束。

100 发出请求

101 切换协议

(二)、2字开头的状态码,请求已 成功被 器 接收、理解

200 交易成功

201 已创建

202 已接受

203 非权威性信息

204 无内存

205 重置内容

206 部分内容

207 多状态

(三)、3字开头:需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址在本次响应的location域中指明

301 永久移除

302 临时移除

(四)、4字开头:

1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求

2、请求参数有误

 

400 错误请求

401访问被拒绝

402 【为将来可能的需求而预留的】

403禁止访问

404 没有发现文件

(五)、代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以的软硬件资源无法完成对请求的处理,除非这是一个HEAD请求,澡是服务器应当包含一个解释当前错误状态以及这个善是临时的还是永久的解释 信息实体。浏览器应当向用户展示任何在当前响应中被 包含的实体

500 内部服务器错误

501 页眉值指定了未实现的配置

502 无效响应

503 服务器不可用

504 网关超时

505 服务器不支持

 

二十、谈谈对MVC的认识

MVCModel-View-Controller),即把一个应用的输入、处理、输出流程按照ModelViewController的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

视图(View):代表用户交互界面,MVC设计模式对于视图的处理是限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。

模型(Model):业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。

控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求,但是它却不做任何的数据处理。

 

二十一、php设计模式

1、单例模式 2、工厂模式 3、观察者模式 4、命令链模式 5、策略模式

 

1、 单例模式

a) 一个类在整个应用中,只有一个对象实例的设计模式

b) 类必须自行创建这个实例

c) 必须自行向整个系统提供这个实例

 

三私:私有静态成员变量、构造函数、克隆函数

一公:公共的静态方法

2工厂模式

可以根据输入的参数或者应用程序配置的不同一创建一种专门用来实例化并返回其它类的实例的类

3、观察者模式

观察者模式提供了组件之间紧密耦合的另一种方法。

该模式:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)全本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。

 

二十二、HTTP & HTTPS

 

http ()超文本传输协议

https (Secure Hypertext Transfer Protocol)安全超文本传输协议

1、 效率更高

2、 使用端口80来和TCP/IP进行通信, 信息明文传输

 

1、 安全性更高

2、 端口443,使用SSL作为HTTP应用层的子层(SSL使用40位关键字作为RC4流的加密算法

SSL:安全保密协议,运行在TCP/IP层之上、应用层之下

3、 使用https需要到CA申请一个用于证明服务器用途类型的证书

 

 

1、 http的URL以http://开头,而https的URL以https://开头

2、 http是不安全的,而https是安全的

3、 http标准端口80,面https?的标准商品443

4、 在OSI网络模型中,http工作于应用层,https工作在传输层

5、 http无法加密,而https对传输的数据进行加密

6、 http无需证书,而https需要CA机构wosign颁发的SSL证书

 

二十三、MySql字符类型

 

二十四、《索引》

(1) 唯一索引:唯一的任务就是加快访问速度,唯一索引的目的是为了避免重复的数据。

(2) 普通索引:普通索引允许被索引的数据列包含重复的值。优点1、简化MySQL对这个索引的管理工作,使工作更有效率。2MySQL会对新插入的数据自动检测是否有重复的值。 大多时候创建唯一索引的目的往往是为了避免重复的数据,而不是提高访问速度。

(3) 主索引  :即主键索引,关键字PRIMARY

(4) 外键索引:外键约束

(5) 复合索引:索引可以覆盖多列数据。如 INDEXcolumnA,columnB)。这种索引的特点是MySQL可以有选择的使用这样的一个索引,比如:INDEXA,B,C)可以当做A或(AB )的索引来使用,但不能当做B或(BC)来使用。

(6) 索引的长度:在为CHARVARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数,这个数字必须小于这个字段所允许的最大字符个数。

(7) 全文索引:针对内容开头的字符进行检索操作,如果检索的内容是多个字段构成、数据量较大,全文索引是必要的。注解:InnoDB数据表不支持全文索引。

 

 

二十五、索引的优缺点

1、优点:

a)可以保证数据库表中每一行的数据的唯一性

b)可以大大加快数据的索引速度

c)加速表与表之间的连接,物别是在实现数据的参考完事性方面特别有意义

d)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

f)通过使用索引,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能

2、缺点:

a) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

b) 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果需要建立聚簇索引,那么需要占用的空间会更大

c) 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度

4、 建立索引的原则

a) 在经常需要搜索的列上,可以加快搜索的速度

b) 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构

c) 在经常用在连接的列上,这些列主要是一外键,可以加快连接的速度

d) 在经经常需要根据范围进行搜索的列上创建索引,国为索引已经排序,其指定的范围是连续的

e) 在经常需要排序的列上,国为索引已经排序,这样井底可以利用索引的排序,加快排序井底时间

f) 在经常使用在where子句中的列上,加快条件的判断速度

 

 

二十六、Myisam Innodb优缺点

 

 

MyISAM

InnoDB

构成上的区别:

 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。
  .frm文件存储表定义。

数据文件的扩展名为 .MYD(MYData)

索引文件的扩展名是 .MYI(MYIndex)

基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB

事务处理上方面:

 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持

 InnoDB提供事务支持事务,

外部键等高级数据库功能

SELECT   UPDATE,INSERTDelete操作

MyISAM表格可以被压缩,

而且它们支持全文搜索

 不支持热备,不支持事务

 

执行大量的SELECTMyISAM是更好的选择

1.如果你的数据执行大量的INSERTUPDATE,出于性能方面的考虑,应该使用InnoDB
 2. DELETE  FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

  3. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用

AUTO_INCREMENT的操作

每表一个AUTO_INCREMEN列的内部处理。
  MyISAMINSERTUPDATE操作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。
  AUTO_INCREMENT值可用ALTER TABLEmyisamch来重置
  对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引
  更好和更快的auto_increment处理

如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。

  自动增长计数器仅被存储在主内存中,而不是存在磁盘上

  关于该计算器的算法实现,请参考

  AUTO_INCREMENT列在InnoDB里如何工作

表的具体行数

 select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含   where条件时,两种表的操作是一样的

InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行

InnoDB不支持full text类型的索引。

 

 

表锁

提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in
   SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

存储

MyISAM 中,表被存放在单独的文件中

InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同InnoDB 表的大小只受限于操作系统文件的大小

备份

扩展

MyISAM不支持热备

MyIASMIASM表的新版本,有如下扩展: 

1) 二进制层次的可移植性。

2)  NULL列索引

3) 对变长行比ISAM表有更少的碎片

4) 支持大文件

5) 更好的索引压缩

6) 更好的键吗统计分

7) 更好和更快的auto_increment处理

InnoDB支持热备,但是需要专门的工具

 

 

二十七、Mysql备份

(一)备份的目的

a)做灾难恢复:对损坏的数据进行恢复和还原

b)需求改变:  因需求改变而需要把数据还原到改变以前

c)测试:   测试新功能是否可用

(二) 备份需要考虑的问题

a)可以容忍多长时间的数据

b)恢复数据要在多长时间内完成

c)恢复的时候是否需要持续提供服务

d)恢复的对像,是整个库,多个表,还是单个库,单个表

 

(三)备份的类型

1、根据是否需要数据库离线

a) 冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行

b) 温备(warm backup):服务在线,但只支持读请求,不允许写请求

c) 热备(hot backup):备份的同时,业务不受影响

 

注:

1) 这种类型的数据取决于业务的需求,而不是备份工具

2) MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具

 

2、根据要备份的数据集合的范围

a)完全备份:full backup,备份全部字符集

b)增量备份:incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份

c)差异备份:differential backup 上次完全备份以来改变了的数据

 

建议恢复策略:

1) 完全 + 增量 + 二进制日志

2) 完全 + 差异 + 二进制日志

3、根据备份数据或文件

a)物理备份:直接备份数据文件

优点:备份和恢复都比较简单,能够跨myslq的版本,恢复速度快,属于文件系统级别的

建议:不要假设备份一定可用,要测试

Mysql>check talbes; 检测表是否可用

b)逻辑备份:备份表中的数据和代码

优点:恢复简单、备份的结果为ASCII文件,可以编辑。与存储引擎无关,可以通过网络备份和恢复

缺点:备份或恢复都需要mysql 服务器进程参与,备份结果占据更多的空间,浮点数可能会丢失精度,还原后,缩影需要重建

 

(四)、备份的对象

1、数据

2、配置文件

3、代码:存储过程、存储函数、触发器

4os相关的配置文件

5、复制相关的配置

6、二进制日志

 

(五)、备份和恢复的实现

参阅:http://www.jb51.net/article/41570.htm

二十八、Redis五种常用数据类型

1、 String

2、 Hash

3、 List

4、 Set

5、 Sort Set

6、 Pub/Sub

7、 transation

 

 

二十九、序列化和反序列化

1、 序列化:serialize()

2、 反序列化:unserialize()

 

三十、PHP 五种视觉的设计模式

· 工厂模式:

1、 是一种类,具有创建对象的某些方法

· 单元素模式:

2、 资源是独占的,有且只有一个此类型的资源。

· 观察者模式:

3、 观察者模式提供了避免组件之间耦合的另一种方法,该模式非常简单:一个对象通过添加方法(该方法允许另一个对象,即观察者自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。

· 命令链模式:

4、 以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求,如果可以,该请求被处理,进程停止。

· 策略模式:

5、 此算法是从复杂类提取的,因而可以方便地替换。

 

三十一、mb_substr

1$str = "中文截取无乱码";

/*中文截取

mb_substr($str,$start,$lenth,$encoding);

$str :需要截取的字符串

$start :开始截取的位置

$length :要截取的字数

$encoding :字符编码,utf-8,GB2312,GBK

*/

echo mb_substr($str,2,3,‘utf8‘);

 

/*获取中文长度

$str :要计算长度的字符串

$encoding :字符编码,utf-8GB2312GBK

*/

echo mb_strlen($str,‘utf-8‘);

 

此外可参考  http://blog.sina.com.cn/s/blog_8edc37a801016l7r.html

substr($str,int start[,int length]):$strstrat位置开始提取[length长度的字符串]

str_replace(search,replace,$str):$str中查找searchreplace来替换

str_split($str,len):$strlen长度进行分割返回数组

strtolower($str) 字符串转换为小写
strtoupper($str) 字符串转换为大写
ucfirst($str) 将函数的第一个字符转换为大写
ucwords($str) 将每个单词的首字母转换为大写

 

2、实现字符串反转:strrev($str);

3php中将utf8转换成bgk iconv(“utf8”,”gbk”,$str)

4、截取.

strstr()函数的作用是:返回一个字符串在另一个字符串中首次出现的位置到后者末尾的子字符串(大小写敏感)。

 

 

三十二、支付宝支付的三种方式

 

1、担保交易  2、即时到账  3、担保交易和即时到账

 

负载均衡配置:1、权重 2、轮循(或加权轮循) 3hash(分部IP段) 4、随机

 

 

 

三十三、冒泡排序

 

 

三十四、PHP版本差别

 

PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束  、JSON 支持
PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定Heredoc 和 Nowdoc, const, 三元运算符,Phar
PHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改
PHP5.5:yield, list() 用于 foreach, 细节修改
PHP5.6: 常量增强,可变函数参数,命名空间增强

 

三十五、ApacheNginx的优缺点

 

 

nginx

apache

资源、性能

占用更少的内存和资源、抗并发

安装、配置都比较简单

静态处理性能比Apache3倍以上

负载均衡能国比apache

rewrite功能强大,相对稳定

处理请求

异步非阻塞

阻塞型

进程

异步

同步多进程模型,一个连接对应一个进程

 

 

 

 

三十六、对称加密 与 非对称加密

 

1、 对称加密与解密使用的是同样的密钥,但由于需要将密钥在网络传输,所以安全性不高

2、 非对称加密使用了一对密钥,公钥与私钥,把以安全性高,但加密与解密速度慢

3、 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通

 

(一)对称加密(Symmetric Cryptography)

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法。

 

(二)非对称加密(Asymmetric Cryptography)

允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。相对于“对称加密算法”这种方法也叫做“非对称加密算法”。

 

 

三十七、数据库三大范式

 

1、 第一范式指:数据库表的每一列都是不可分割的基本数据项

2、 第二范式指:要求数据库表中的每个实例或行必须可以被唯一区分

3、 第三范式指:要求一个数据表中不包含已存在的非主关键字的信息

 

三十八、ob系列函数

1ob_start() //打开缓冲区,所有输出的信息不直接发送到浏览器,而是保存在缓冲区里面

2ob_clean() //删除内部缓冲区的内容,不关闭缓冲区(不输出)

3ob_end_clean() //删除内部缓冲区的内容,关闭缓冲区(不输出)

4ob_get_clean() //返回内部缓冲区的内容,关闭缓冲区。【相当于执行 ob_get_contents() and ob_end_clean()

5ob_flush() //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。

6ob_end_flush() //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区

7ob_get_flush() //返回内部缓冲区的内容,并关闭缓冲区的内容

8ob_get_contents()//返回缓冲区的内容,不输出

9ob_get_length() //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回 false

 

三十九、验证email

/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i

^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$

 

四十、接口安全

签名(随机数)

其它一些常规的: 对称加密、非对称加密(公钥与私钥),md5

四十一、redis 与 memcache

1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别

memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小

redis有部份存在硬盘上,这样能保证数据的持久性。

灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复

2.Redis不仅仅支持简单的k/v类型的数据,同时还提供listsethash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

 

四十二、php传值与传引用的区别:

 

传值:将实参赋值给形参,形参的改变,不会影响到实参的值。

传引用:真正以地址的方式传递参数,传递以后,实参与形参都是同一个对象,只是名字不同而已,形参的改变,会影响到实参的值。

 

四十三、Nginx 负载均衡

TCP/IP

1) 链路层

2) 网络层

3) 运输层:两台主机上的应用程序提供 端 到 端 的通信

4) 应用层:处理特定的应用程序细节

Telnet 运程登录

FTP 文件传输协议

SMTP 简单的邮件传送协议

SNMP 简单网络管理协议

 

  

 

四十四、Linux基本命令,目录结构

arch 显示机器的处理器架构(1) 
uname -m 显示机器的处理器架构(2) 
uname -r 显示正在使用的内核版本 
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) 
hdparm -i /dev/hda 罗列一个磁盘的架构特性 
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 
cat /proc/cpuinfo 显示CPU info的信息 
cat /proc/interrupts 显示中断 
cat /proc/meminfo 校验内存使用 
cat /proc/swaps 显示哪些swap被使用 
cat /proc/version 显示内核的版本 
cat /proc/net/dev 显示网络适配器及统计 
cat /proc/mounts 显示已加载的文件系统 

date 显示系统日期 
cal 2007 显示2007年的日历表 
date 041217002007.00 设置日期和时间 - 月日时分年. 
clock -w 将时间修改保存到 BIOS 

文件搜索 
find / -name file1 ‘/‘ 开始进入根文件系统搜索文件和目录 

locate \*.ps 寻找以 ‘.ps‘ 结尾的文件 - 先运行 ‘updatedb‘ 命令 
whereis halt 显示一个二进制文件、源码或man的位置 
which halt 显示一个二进制文件或可执行文件的完整路径 

 

挂载一个文件系统 
mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 ‘/ mnt/hda2‘ 已经存在 
umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 ‘/ mnt/hda2‘ 退出 


追加命令

1,linux里把文件/etc/aaa中的内容追加到/usr/bbb中的内容的后面
  sudo cat /etc/aaa >>/usr/bbb
2,更改/etc/index.html的文件所有者为apache,文件群组为apache
  sudo chmod apache:apache  /etc/index.html
3,更改/etc/index.html的所有者权限为读取、写入、执行。群组权限为读取。其他权限为读取
  sudo chmod 744 /etc/index.html
4,删除/etc下名为hello的文件
  sudo rm /etc/index.html

当然,如果你是以root用户执行以上操作,可以去掉前边的sudo

 

df -hl 查看磁盘剩余空间

df -h 查看每个根路径的分区大小

du -sh [目录名返回该目录的大小

du -sm [文件夹返回该文件夹总M

关机 (系统的关机、重启以及登出 ) 
shutdown -h now 关闭系统(1) 
init 0 关闭系统(2) 
telinit 0 关闭系统(3) 
shutdown -h hours:minutes & 按预定时间关闭系统 
shutdown -c 取消按预定时间关闭系统 
shutdown -r now 重启(1) 
reboot 重启(2) 
logout 注销

文件和目录 
pwd 显示工作路径 
ls 查看目录中的文件 
ls -F 查看目录中的文件 
ls -l 显示文件和目录的详细资料 
ls -a 显示隐藏文件 
ls *[0-9]* 显示包含数字的文件名和目录名 
tree 显示文件和目录由根目录开始的树形结构(1) 
lstree 显示文件和目录由根目录开始的树形结构(2) 
mkdir dir1 创建一个叫做 ‘dir1‘ 的目录 

磁盘空间 
df -h 显示已经挂载的分区列表 
ls -lSr |more 以尺寸大小排列文件和目录 
du -sh dir1 估算目录 ‘dir1‘ 已经使用的磁盘空间 

下载、解压

1)对于.tar结尾的文件 
  tar -xf all.tar 

2)对于.gz结尾的文件 
  gzip -d all.gz 
  gunzip all.gz 

# zip all.zip *.jpg 
  这条命令是将所有.jpg的文件压缩成一个zip 
# unzip all.zip 
  这条命令是将all.zip中的所有文件解压出来

下载命令

wget + 空格 + 下载文件的url路径

=====================================

Shell 脚本:

必须以  #!/bin/sh  开头

简单例子:判断这个目录下有没有文件(File

#!/bin/bash
Num=`ls -al /opt |grep "^-"|wc -l `
if [ $Num != 0 ]
 then echo "/opt has $Num files"
else
 echo "/opt has none file"
fi

ls -al /opt |grep "^-"|wc -l  这个命令能够统计文件个数 为0就是没有文件 非零就是有文件

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1、桌面共享:使用 Trim view

2、不清楚的东西先不要反问(反问要看准时机)

3、不以技术 论 技术

4、以本身的优势平衡不足

5、挂羊头卖狗肉(如果问到想法)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

四十五、

1、 TCP/IP,YII/TP 执行原理

TCP (传输控制协议) - 应用程序之间通信

IP (网际协议) -计算机之间的通信

 

YII可参考(MVC)  http://blog.csdn.net/wzllai/article/details/7658802

 

2、负载均衡和http(几层协议配置)【lvs四层,nginx七层,web一般四台】

 

3、数据怎么优化

索引优化

1、 索引优化原则

数据类型越小越好,越简单越好,避免空值

2、 索引顺序:最左原则

例如:index(a,b) where 中有 a ab 时索引会被使用,只有 b 时不会被使用。(不同的数据库或不同的版本可能会有不同)

3、 聚集索引、B+树、主键

一个表只能有一个聚集索引,聚集索引以B+树形式存储,所以,聚集索引的规则决定了索引存放的物理顺序(聚集索引对需要最快速缩小查询访问及最快速进行字段排序时,非常有用),需要特别注意

查询优化

1、 尽量避免表扫描,首先应考虑在  where order by 涉及的列上建立索引

2、 尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

3、尽量避免在 where 子句中使用 != <> or 操作符,否则将放弃引擎而进行全表扫描

 

4、页面空值,输出php,404,是什么原因,解决办法是什么

空值:错误被屏蔽、可查看log日志

404 :rewrite规则

输出php:apache未开启

开启apache的错误级别

【 error_reporting(0)//禁用错误报告;

error_reporting(E_ALL)//报告所有错误;

error_reporting(E_ERROR | E_WARNING | E_PARSE);//报告运行时错误;

error_reporting(2047):
E_ALL能从不良编码实践到无害提示到出错的所有信息.E_ALL 对于开发过程来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出
所以不建议使用2047,最好把默认值改为:error_reporting = E_ALL & E_NOTICE

 

 

5、单点登录原理、路由规则

 

6、memcache缓存什么数据

一、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。

二、经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。

三、统计类缓存,比如文章浏览数、网站PV

四、活跃用户的基本信息或者某篇热门文章。

五、session数据

 

四十六、PHP 全局变量 - 超全局变量

$GLOBALS

$_SERVER

$_REQUEST

$_POST

$_GET

$_FILES

$_ENV

$_COOKIE

$_SESSION

 

四十七、数组相关

 

1、向数组中插入一个值用什么函数

如果用 array_push() 来给数组增加一个单元,还不如用 $array[] = ,因为这样没有调用函数的额外负担

如果第一个参数不是数组,array_push() 将发出一条警告。这和 $var[] 的行为不同,后者会新建一个数组

例如:

<?php
$stack = array("orange""banana");
array_push($stack"apple""raspberry");
print_r($stack);

?>
结果:Array( [0] => orange  [1] => banana  [2] => apple  [3] => raspberry )

array_pop() - 将数组最后一个单元弹出(出栈)

array_shift() - 将数组开头的单元移出数组

array_unshift() - 在数组开头插入一个或多个单元

字符串分割为数组explode(在哪里分割字符串要分割的字符串返回的数组元素的最大数目《可选》)

array_merge_recursive()函数与array_merge()相同

· array_merge()会覆盖前面存在的键/值对

· array_merge_recursive()将把两个值合并在一起

array_combine()函数会得到一个新数组,它由一组提交的键和对应的值组成

两个输入数组必须大小相同,不能为空

array_slice()  拆分数组

offset 为正值时,拆分将从距数组开头的offset 位置开始;

如果offset 为负值,则拆分从距数组末尾的offset 位置开始。

如果省略了可选参数length,则拆分将从offset 开始,一直到数组的最后一个元素

果给出了length 且为正数,则会在距数组开头的offset+length 位置结束

负数相反

array_splice()函数会删除数组中从offset开始到offset+length 结束的所有元素

array_intersect()函数返回一个保留了键的数组,这个数组只由第一个数组中出现的且在其他每个输入数组中都出现的值组成(取交集)

array_intersect_assoc()array_intersect()基本相同,只不过他在比较中还考虑了数组的键

array_diff()返回出现在第一个数组中但其他输入数组中没有的值。这个功能与array_intersect()相反(差集)

array_diff_assoc()array_diff()基本相同,只是它在比较时还考虑了数组的键

array_key_exists()查找指定的键值,成功返回 true 失败 返回 false

l shuffle() 函数

<?php

$my_array = array("red","green","blue","yellow","purple");

shuffle($my_array);

print_r($my_array);

?>

Array ( [0] => purple [1] => yellow [2] => red [3] => green [4] => blue )

 

2、 将一个数组打散

str_split(string $string,[, int $split_length = 1 ])该函数将一个字符串转化为一个数组 ,第一个参数为需要转换的字符串,第二个可选参数为数组每个元素的长度,缺省值为1  如下例

<?php
$str = "Hello Friend";
$arr1 = str_split($str);
$arr2 = str_split($str, 3);
print_r($arr1);
print_r($arr2);
?>

Array  ( [0] => H  [1] => e  [2] => l  [3] => l   [4] => o   [5] =>  [6] => F   [7] => r  [8] => I 

 [9] => e   [10]=> n  [11] => d )

Array  (  [0] => Hel  [1] => lo  [2] => Fri  [3] => end )


3一个sql中有两个索引字段,运行时会先执行哪个。如何查看索引?

显示一个表所有索引的SQL语句是:
show index from 数据库名.表名

看某表某一列上的索引使用下面的SQL语句
show index from 数据库名.表名 where column_name like ‘列名


敏感词过滤:如果有一个六千字的词库,怎么去匹配一个 100字的短语,并把其中的敏感词替换成xx

 

Mysql主从配置用的是内网还是公网

 

存储、堆存储,REST接口

 

四十八、Mysql 每天 1亿条数据的增量如何优化、分页。 主从同步原理,不同步的解决方案?

 

四十九、魔术方法

1__construct()
实例化对象时被调用,当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

2__destruct()

当删除一个对象或对象操作终止时被调用。

3__call()
对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。

4__get()
读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。

5__set()
设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。

6__toString()

打印一个对象的时被调用。如echo $obj;print $obj;

7__clone()

克隆对象时被调用。如:$t=new Test();$t1=clone $t;

8__sleep()

serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。

9__wakeup()

unserialize时被调用,做些对象的初始化工作。

10__isset()
检测一个对象的属性是否存在时被调用。如:isset($c->name)

11__unset()
unset一个对象的属性时被调用。如:unset($c->name)

12__set_state()
调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

13__autoload()
实例化一个对象时,如果对应的类不存在,则该方法被调用。

魔术常量:

1__LINE__
返回文件中的当前行号。

2__FILE__
返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

3__FUNCTION__
返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

4__CLASS__
返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

5__METHOD__
返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

 

五十、JQuery

$.ajax({

   type: "POST",

   url: "some.php",

   data: "name=John&location=Boston",

   success: function(msg){

     alert( "Data Saved: " + msg );

   }

});

 

php面试题与答案

标签:

原文地址:http://blog.csdn.net/zhangjunguo0320/article/details/51776900

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!