php面试题

 

1. 用PHP打印出前一天的时间格式是2010-7-3 12:28:21?

#strtotime — 将任何英文文本的日期时间描述解析为 Unix 时间戳

#int strtotime ( string $time [, int $now = time() ] )

echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’)); 

 

2. 下面哪个方式不能取出$a = ‘obodol’;的第一个字母()

A:$a{0}  B:left{$a,1}   C:substr($a,0-strlen($a),1);    D:$a[0]

 

3. 实现中文字符串截取无乱码的方法?

1) mbstring扩展库的mb_substr截取

2)自定义函数

 

 

4. 在PHP中error_reporting函数有什么作用?PHP的错误类型都有哪些?

1) error_reporting() 设置 PHP 的报错级别并返回当前级别。

2) 1 E_ERROR 致命的运行错误。错误无法恢复,暂停执行脚本。

3) 2 E_WARNING 运行时警告(非致命性错误)。非致命的运行错误,脚本执行不会停止。

4) 4 E_PARSE 编译时解析错误。解析错误只由分析器产生。

5) 8 E_NOTICE 运行时提醒(这些经常是你代码中的bug引起的,也可能是有意的行为造成的。)

6) 8191 E_ALL 所有的错误和警告(不包括 E_STRICT) (E_STRICT will be part of E_ALL as of PHP 6.0)

 

5. PHP如何实现页面跳转

1) 方法一:使用PHP自带函数跳转,缺点: 1, location和“:”号间不能有空格,否则会出错2, header头之前不能有输出,3,header后的PHP代码还会被执行 ,跳转后的程序继续执行,可用exit中断执行后面的程序。

2) header("Location:网址");//直接跳转

3) header("refresh:3;url=http://www.baidu.com");//三秒后跳转

4) 方法二:利用meta标签

5) echo "<meta http-equiv=refresh content='3; url=网址 '>"

6) 方法三:利用JavaScript语言

echo "<script language='javascript'>";

echo " location='http://www.baidu.com';";

echo "</script>";

 

6. session与cookie的区别?

1)session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放(优缺点:1、cookie数据存放在客户的浏览器上,session数据放在服务器上。2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。所以个人建议:将登陆信息等重要信息存放为SESSION其他信息如果需要保留,可以放在COOKIE中)

2)cookie:用来存储连续访问一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。

3)两者都可通过时间来设置时间长短。

 

7. 如何获取通过setcookie设置的cookie中键名带点(.)的值?

1) 点换为下划线获取。

2) 如:setcookie('user.name', 'zhangsan');

3)  setcookie('user.age', '18');

4) 则需要通过$_COOKIE[‘user_name’]和$_COOKIE[‘user_age’]获取,通过var_dump($_COOKIE)可确认。

 

8. 如何合并数组?

1) 操作符+,如果两个数组存在相同的key,前面的一个会覆盖后面的。前覆盖后

2) array_merge 是在前一个参数基础上插入后一个参数,如果两个数组存在相同的key,后面的一个会覆盖前面的;后覆盖前

 

9. 合并数组array_merge([1,2,3], [3,4,5])的结果是什么?

[1,2,3,3,4,5]

 

10. 下列哪个选项没有将john添加到users数组中()

A. $user=array[“john”] 新建数组

B. array_unshift[$users,”john”] 在数组开头插入一个或多个单元

C. array_push[$users,”john”]将一个或多个单元压入数组的末尾(入栈)

D. $users  || = john

 

11. "$array[‘anykey’]" 和 "$array[anykey]" 有什么区别?

索引数组和关联数组的区别

索引数组:用数字作为键名的数组一般叫做索引数组。用字符串表示键的数组就是下面要介绍的关联数组。索引数组的键是整数,而且从0开始以此类推。

关联数组:其实关联数组和索引数组的差别只是在键值上,关联数组的键值是字符串,并且是人为的规定

 

12. 数组arsort的作用?

1) 根据值 对数组进行逆向排序并保持索引关系。

2) 类似的函数还有:

i. sort — 对数组排序

ii. asort — 对数组进行排序并保持索引关系

iii. rsort — 对数组逆向排序

iv. arsort — 对数组进行逆向排序并保持索引关系

v. usort — 使用用户自定义的比较函数对数组中的值进行排序

vi. uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联

vii. uksort — 使用用户自定义的比较函数对数组中的键名进行排序

13. 下面功能PHP无法实现的是()

A. 服务器脚本运行

B. 命令行脚本运行

C. 客户端图形界面(GUI) 程序

D. 浏览器执行DOM操作

 

1. DOM 是 W3C 的标准; [所有浏览器公共遵守的标准]
2. BOM 是 各个浏览器厂商根据 DOM
在各自浏览器上的实现;[表现为不同浏览器定义有差别,实现方式不同]
3. window 是 BOM 对象,而非 js 对象;

 

14. 下面哪个方法不能读取网址”http://www.qq.com “的内容(B)

A. file_get_contents()   将整个文件读入一个字符串

B. read_exif_data()别名exif_read_data — 从 JPEG 或 TIFF 文件中读取 EXIF 头信息

C. socket_read()读取最大长度字节       

D. curl_exec() 执行一个cURL会话

 

15. 抓取远程图片到本地,你会用什么函数?

file_get_contents或者curl

http://www.jb51.net/article/57238.htm

16. PHP的位运算符不包括()

A.&    B.|  C. ~   D.!

常见四个位运算符:&(按位与),|(按位或),^(按位异或),~(按位取反)

http://www.runoob.com/php/php-operators.html

17. 要检查PHP常量是否定义,可以使用函数(A)

A. defined()       B. indefin()        C. indefined()        D. 无

 

18. 以下说法不正确的是( )

A. php有四种标量类型:布尔类型(boolean),整型(integer),浮点型(float),字符串(string)

B. 浮点型(float)与双精度型(double)是同一种类型

C.复合类型包括:数组(array),对象(object),资源(resource)

D.伪类型:混合型(mixed),数字型(number),回调(callback)

 

19. 表单中的 GET 与 POST 提交方法有什么区别?

1) GET请求的数据会附在URL之后,POST把提交的数据则放置在是HTTP包的包体中。

2) GET方式提交的数据最多只能是1024字节, POST是没有大小限制的,HTTP协议规范也没有进行大小限制。

3) POST的安全性要比GET的安全性高。通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。

 

20. GD库是做什么用的?

1) GD库提供了一系列用来处理图片的功能,使用GD库可以处理图片,或者生成图片。

2) 在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。

 

21. PHP魔术方法都有哪些?PHP中把以两个下划线__开头的方法称为魔术方法http://www.oschina.net/translate/9-magic-methods-in-php?print

1) __construct(),类的构造函数,当对象被实例化时它会被调用

2) __destruct(),类的析构函数,对象的销毁

3) __call(),在对象中调用一个不可访问方法时调用

4) __callStatic(),用静态方式中调用一个不可访问方法时调用

5) __get(),获得一个类的成员变量时调用

6) __set(),设置一个类的成员变量时调用

7) __isset(),当对不可访问属性调用isset()或empty()时调用

8) __unset(),当对不可访问属性调用unset()时被调用。

9) __sleep(),执行serialize()时,先会调用这个函数

10) __wakeup(),执行unserialize()时,先会调用这个函数

11) __toString(),类被当成字符串时的回应方法

12) __invoke(),调用函数的方式调用一个对象时的回应方法

13) __set_state(),调用var_export()导出类时,此静态方法会被调用。

14) __clone(),当对象复制完成时调用

15) __autoload(),尝试加载未定义的类

16) __debugInfo(),打印所需调试信息

http://php.net/manual/en/language.oop5.magic.php

22. 怎么认识PHP的异常处理?

http://www.w3school.com.cn/php/php_exception.asp

1) 可以使用检测(try)、抛出(throw)和捕获(catch)异常。即使用try检测有没有抛出(throw)异常,若有异常抛出(throw),使用catch捕获异常。

2) 一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。PHP 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。

1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。

2. Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"

3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象

 

23. 解释下PHP的垃圾回收机制?http://php.net/manual/zh/features.gc.php

1) php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器 1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。

2) “引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;

3) php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

 

24. 打开php.ini中的safe_mode,会影响哪些函数?至少说出6个。(新浪)http://www.cnblogs.com/gengyi/p/6371769.html

1) safe_mode,PHP安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。

2) 注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。

 

25. 在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?http://php.net/manual/zh/function.urlencode.php

Urlencode编码Urldecord解码

 

26. 以下代码执行后”$matches[1 ]”的值是什么()preg_match — 执行一个正则表达式匹配http://www.cnblogs.com/dawnruby/articles/2048763.html

<?php

$a=“<H>some</H><b>html</b>“;

Preg_match(“/<\w?>(\w*?)<\/\w?>/”, $a, $matches);//Preg_match括号里面的内容

/<\w?>匹配一个字母(\w*?)匹配多个字母但只能匹配一次

?>

 

 

A.some   B.html  C.<H>some</H><b>html</b>   D.</H><b>

27. 一下哪个正则表达式能够抓取”//x”风格的注释并且不会误抓取如”http://x”()http://www.jb51.net/article/96367.htm

A:@(?<!:)//.*?$@    B: /(^:)\/\/.*?$/     C: /\/\/.*$/         D: @(?<=:)//.*?@

 

 

匹配图片src if(preg_match_all("/(src)=([\"|']?)([^ \"'>]+\.(gif|jpg|jpeg|bmp|png))\\2/i", $content, $matches)) {
$systeminfo['thumb'] = $matches[3][$auto_thumb_no];
}

 

28. 写一个匹配IP的正则表达式:https://c.runoob.com/front-end/854

^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$

 

 

29. 写一个匹配邮箱的正则表达式:

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

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

 

30. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)

preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

 

31. 什么是MVC?

MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。

Model:数据信息存取层。

View:view层负责将应用的数据以特定的方式展现在界面上。

Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

 

32. 你怎么理解命名空间?

PHP 命名空间(namespace)是在PHP 5.3中加入的.

PHP 命名空间可以解决以下两类问题:

a) 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

b) 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

 

33. PHP如何实现缓存?

1) 数据缓存——普遍的一种缓存技术

i. 非常直观的字面意思,就是把数据先存放好,减少对数据库的访问。第一次访问时,把要用到的数据保存到一个文件里,然后用户再次访问页面时,就先检测要查询的数据是否在缓存文件里,若存在,则直接取出,不需再次访问数据库。

ii. 一般这些数据以数组的形式保存。

2) 页面缓存

i. 和数据缓存差不多,每次访问页面时,就检测相应的页面缓存是否存在,若不存在,则查询数据库得到相应的数据,同时生成缓存页面,这样,在下次访问就可以直接取出缓存页面,不必再次查询数据库。

3) 内存缓存

i. 不作过多分析,一般熟借助第三方软件进行优化,比如Memcached、Redis。

ii. 以上方法能够解决频繁访问数据库的问题,但是缺乏时效性,在数据库改变后,他们默认的数据还是修改之前的。所以就要在规定时间内清除缓存,以更新数 据。比如在每次更新缓存后设定一个时间戳t1,当前的时间戳t2,规定缓存时间为T,那么,在t1与t2相差在T之内时,就不更新缓存,否则,超过了T, 就重新查询数据库,清除之前的缓存,又得到一个新的时间戳,依次循环下去。

 

34. 以下哪一项不属于PHP的OPCode()操作码

A.Eaccelerafor

B.HCache

C.APC

D.Zend Framework

 

35. 写出以下状态码含义:http://tool.oschina.net/commons?type=5

1) 301 临时重定向

2) 302 重定向

3) 404 页面未找到

4) 500 服务器内部错误一般来说,这个问题都会在服务器的程序码出错时出现

100-199 用于指定客户端应相应的某些动作。 
200-299 用于表示请求成功 理解和接受。 
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 
400-499 用于指出客户端的错误。 
500-599 用于支持服务器错误。

 

36. 请解释php.ini中以下配置的含义:

http://blog.csdn.net/onlyanyz/article/details/8879428

1) register_globals=Off   register_globals是PHP.ini里的一个配置,这个配置影响到php 如何接收传递过来的参数比如:GET,POST,Cookie

i. 当register_globals=Off

接收数据的程序应该用根据表单form传值的方法来决定。GET:用$_GET['name']、$HTTP_GET_VARS['name']来接收值;POST:当form用POST提交数据$_POST['name']、$HTTP_POST_VARS['name']来接收值;推荐为off

ii. 当register_globals=On

接收数据的程序可以直接使用$user_name和$user_pass的这种类似访问变量的方式得到值。

2) magic_quotes_gpc=On

i. 对于PHP magic_quotes_gpc=on的情况, 我们可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。(addslashes — 使用反斜线引用字符串)(stripcslashes — 反引用一个使用 addcslashes() 转义的字符串)

如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

ii. 对于PHP magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

3) allw_url_include=Off  http://blog.sina.com.cn/s/blog_4c9ba2850100rmue.html

i. 不允许include远程文件,否则会引起安全问题。

4) sssion.auto_start=0

http://www.360doc.com/content/13/0824/21/13275031_309641865.shtml

http://www.tuicool.com/articles/VBRB7n

i. 不自动开启session,需要用session_start()开启。

 

37. 对于大流量的网站,您采用什么样的方法来解决访问量问题?

http://blog.sina.com.cn/s/blog_62c62b920102eiod.html

答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,

程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量。

 

38. 你了解RESTFUL吗?http://www.ruanyifeng.com/blog/2011/09/restful.html

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。

自己增加: 如何设置一个严格30分钟过期的Session?

 

 

39. 做过APP接口没?怎么做的?

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

用框架写接口,普通POST,GET接口,有时候用RESTFUL接口。写控制器从模型调用数据,返回XML或者JSON数据就行了。

APP接口主要解决两个问题,一个SESSION问题,一个是TOKEN问题。客户端第一次请求,服务端生成SESSION_ID,返回给客户端。之后的请求中,客户端把SESSION_ID传给服务端,服务端用SESSION_ID函数可以确保多次请求用的同一个SESSION。TOKEN需要加密和服务端验证。

 

40. smarty没有?用过什么模板引擎?

Smarty是很老的技术了。常用的框架如ThinkPHP,Yii都自带模板引擎。最常用的方法是3个:assign赋值,display显示页面,fetch获取页面内容而非显示。

 

41. 设计模式有哪些?

单例模式,简单工厂模式,策略模式,观察者模式,注册(树)模式,迭代模式, IOC, Mixin。

http://www.cnblogs.com/siqi/archive/2012/09/09/2667562.html

http://www.cnblogs.com/timelesszhuang/p/4851715.html对钩子的理解

 

 

http://www.runoob.com/design-pattern/design-pattern-intro.html

42. 请写一段PHP代码,确保多个进程同时写入同一个文件成功

核心思路:加锁

 

<?php

    $fp = fopen("lock.txt","w+");

    if (flock($fp,LOCK_EX)) {

        //获得写锁,写数据

        fwrite($fp, "write something");

 

        // 解除锁定

        flock($fp, LOCK_UN);

    } else {

        echo "file is locking...";

    }

    fclose($fp);

?>

 

43. 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

http://www.oschina.net/code/snippet_592534_13186

<?php

    function my_scandir($dir){

        $files = array();

        if(is_dir($dir)){

            if ($handle = opendir($dir)) {

                while (($flie = readdir($handle))!== false) {

                    if ($flie!="." && $file!="..") {

                        if (is_dir($dir."/".$file)) {

                            $files[$file] = my_scandir($dir."/".$file);

                        } else {

                            $files[] = $dir."/".$file;

                        }

                    }

                }

                closedir($handle);

                return $files;

            }

        }

    }

?>

 

44. 写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):

过滤JavaScript脚本参考:

http://www.codeweblog.com/php%E5%B8%B8%E7%94%A8%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%8A%E7%AD%94%E6%A1%88/

<?php

    header("content-type:text/html;charset=utf-8");

 

    $script = "以下内容不显示:<script type='text/javascript'>alert('cc');</script>";

    $pattern = '/<[^>].?>.?<\/>/si';

 

    echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容

?>

 

 

45. 请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?

首先进入php安装目录

php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件(解析执行文件)

php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记

 

46. PHP中,如何获得一个数组的键值?

使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。

使用array_keys()则可以得到数组中部分的或所有的键名。

使用foreach结构foreach($arr as key=>value)可以通过key和value分别获取键名和值。

 

47. 如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方?

从以下几个方面考虑:

 

数据库中库和表都用utf-8编码

php连接mysql,指定数据库编码为utf-8 mysql_query(“set names utf8”);//query查询

php文件指定头部编码为utf-8 header(“content-type:text/html;charset=utf-8”);

网站下所有文件的编码为utf8

html文件指定编码为utf-8<meta http-equiv="Content-Type"content="text/html;charset=utf-8"/>

 

 

48. 写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)

mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

XML 指可扩展标记语言(eXtensible Markup Language)常用于简化数据的存储和共享XML 被设计用来传输和存储数据。HTML 被设计用来显示数据。

 

49. 请描述如下URL重写规则的用意。

!-f不是一个文件  !-d不是一个目录  [L] 这是最后一个匹配项,不再往下匹配

[R]相当与redirect [NC]不区分大小写。

http://429006.com/article/technology/3333.htm

<IfModulemod_rewrite.c>

RewriteEngineon

RewriteCond%{REQUEST_FILENAME}!-f//如果文件存在,就直接访问文件,不进行下面的RewriteRule

 

RewriteCond%{REQUEST_FILENAME}!-d//如果目录存在就直接访问目录不进行RewriteRule

//%{REQUEST_FILENAME}表示请求的文件名

RewriteBase/

RewriteRule./index.php[L]

</IfModule>

如果REQUEST_FILENAME文件存在,就直接访问文件,不进行下面的rewrite规则,

如果REQUEST_FILENAME目录存在,就直接访问目录,不进行下面的rewrite规则,

RewriteRule./index.php[L]的意思是把所有的请求都给index.php处理。

http://www.imooc.com/learn/811 API

 

50. Warning:Cannot modify header information-headers already sent by(output started at D:\src\init.php:7)in D:\src\init.php on line10通常什么情况下php会报该警告信息?

一般是在header、set_cookie以及session_start函数前面有输出(包括空格)的情况下,会报该警告信息

 

 

51. 什么是ORM?

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

 

52. 什么是RBAC

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

 

53. 如何防止SQL注入?pdo

转义引号。

addslashes() 是强行加\;

PDO的预处理与参数绑定。

 

54. 如何避免跨站攻击?

要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。

2.在不登出A的情况下,访问危险网站B。

 

服务端进行CSRF防御

1. Cookie Hashing(所有表单都包含同一个伪随机值)。因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了

2. 验证码。每次的用户提交都需要用户在表单中填写一个图片上的随机字符串。

3. One-Time Tokens(不同的表单包含一个不同的伪随机值)

 

55. 你都做过什么项目,做的那几个模块?担任的什么职责?

 

 

56. 如何认识PHP框架的路由机制?

主要是通过伪静态来实现单一入口,mvc框架都是这样。将所有请求通过apache伪静态解析转给某个指定文件,然后通过php的$_SERVER[]这个全局变量来去的请求的路径字符串,对其进行解析再分配给指定的类去处理,基本就是这样。

最简单的方法是建立一个.htaccess文件。文件内容贴给你

<IfModule !mod_rewrite.c>

    ErrorDocument 500 'mod_rewrite must be enabled'

</IfModule>

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php

 

将这个文件放在根目录下即可。文件作用很明显:将所有的请求路径转给index.php,然后在index.php里做请求字符串的判断即可打到路由解析功能。

 

57. PHP有几种运行方式?

1、CGI

CGI即通用网关接口(common gatewag interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

2、FastCGI

fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

3、APACHE2HANDLER

PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

4、CLI

cli是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;

 

 

 

 

 

MySQL数据库问题:

 

http://www.360doc.com/content/15/1202/10/18389284_517338379.shtml

http://www.open-open.com/lib/view/open1452046967245.html

1. 第二范式和第一范式的区别是什么?

1. 第一范式

确保数据表中每列(字段)的原子性。

 

2. 第二范式(依赖性)

在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关。

 

3. 第三范式(唯一性)

 

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

 

2. 数据库事务的四个特征及含义?

数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。

 

数据库事务的四大特性(简称ACID)是:

(1) 原子性(Atomicity)

 

事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。

 

例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折减款,却没有提取现金。2个步骤必须同时完成或者都不完成。

(2)一致性(Consistency)   

 

事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。

 

例如完整性约束a+b=10,一个事务改变了a,那么b也应随之改变。

(3)分离性(亦称独立性Isolation)

 

分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。

(4)持久性(Durability)

 

持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。

 

3. 如何设计或配置Mysql,才能达到高效使用的目的。

a) 数据库设计方面,设计结构良好的数据库,允许部分数据冗余。 选取最适用的字段属性,尽可能把字段设置为NOT NULL,这样在查询的时候,数据库不用去比较NULL值。

b) 系统架构设计方面,表散列,把海量数据散列到几个不同的表里面,集群,数据库查询和写入分开。 写高效sql语句,以提高效率。使用连接(join)来代替子查询使用联合(union)来代替手动创建的临时表所得皆必须,只从数据库取必须的数据。必 要的时候用不同的存储引擎,比如Innodb可以减少死锁,HEAP可以提高一个数量级的查询速度。

 

4. 请说出mysql常用存储引擎?memory存储引擎的特点?:

a) MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

b) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。

c) InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。

d) MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。

e) NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。

f) 比较常用的是MyISAM和InnoDB

 

5. MySQL LEFT JOIN联查问题,不再举例。

 

6. 如何MySQL性能优化?

a) 通过Show命令,慢查询日志,profiling分析查询确定瓶颈。

b) 使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。

c) 当只要一行数据时使用 LIMIT 1

d) 为搜索字段建索引

e) 在Join表的时候使用相当类型的例,并将其索引

f) 尽可能的使用 NOT NULL

g) 水平分表

h) 垂直分表

i) 选择正确的存储引擎

j) 避免长连接

 

 

 

 

 

 

 

 

 

算法问题

1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组

//冒泡排序(数组排序)

 

function bubble_sort($array){

    $count = count($array);

    if ($count <= 0) return false;

    for($i=0; $i<$count; $i++){

        for($j=$i; $j<$count-1; $j++){

            if ($array[$i] > $array[$j]){

                $tmp = $array[$i];

                $array[$i] = $array[$j];

                $array[$j] = $tmp;

            }

        }

    }

    return $array;

}

//快速排序(数组排序)

 

function quick_sort($array) {

    if (count($array) <= 1) return $array;

    $key = $array[0];

    $left_arr = array();

    $right_arr = array();

    for ($i=1; $i<count($array); $i++){

        if ($array[$i] <= $key)

            $left_arr[] = $array[$i];

        else

            $right_arr[] = $array[$i];

    }

    $left_arr = quick_sort($left_arr);

    $right_arr = quick_sort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);

}

2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

//二分查找(数组里查找某个元素)

 

function bin_sch($array, $low, $high, $k){

    if ($low <= $high){

    $mid = intval(($low+$high)/2);

    if ($array[$mid] == $k){

    return $mid;

    }elseif ($k < $array[$mid]){

    return bin_sch($array, $low, $mid-1, $k);

    }else{

    return bin_sch($array, $mid+1, $high, $k);

    }

    }

    return -1;

}

//顺序查找(数组里查找某个元素)

 

function seq_sch($array, $n, $k){

    $array[$n] = $k;

    for($i=0; $i<$n; $i++){

        if($array[$i]==$k){

            break;

        }

    }

    if ($i<$n){

        return $i;

    }else{

        return -1;

    }

}

3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序

 

function array_sort($arr, $keys, $order=0) {

    if (!is_array($arr)) {

        return false;

    }

    $keysvalue = array();

    foreach($arr as $key => $val) {

        $keysvalue[$key] = $val[$keys];

    }

    if($order == 0){

        asort($keysvalue);

    }else {

        arsort($keysvalue);

    }

    reset($keysvalue);

    foreach($keysvalue as $key => $vals) {

        $keysort[$key] = $key;

    }

    $new_array = array();

    foreach($keysort as $key => $val) {

        $new_array[$key] = $arr[$val];

    }

    return $new_array;

}

 

 

 

 

 

 

 

 

PHP周边问题

1. 说出你常用的版本控制器?

SVN , GIT。

具体命令不在一一列举,需熟记。

 

2. Linux常用的命令,知道哪些?

a) ls, pwd, cd, cat, vi, service, chmod 权限设定字串, chown, tar, su等。

http://www.cnblogs.com/chengJAVA/p/4319420.html

http://blog.csdn.net/doupei2006/article/details/8015986

http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html

3. Linux的定时任务如何执行?

使用crontab执行。http://www.jb51.net/LINUXjishu/19905.html

在Linux中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出。

在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。

每个域之间使用空格或者制表符分隔。格式如下:

minute hour day-of-month month-of-year day-of-week commands

合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)

除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

每天早上6点

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时

0 */2 * * * echo "Have a break now." >> /tmp/test.txt  

 

4. Linux如何安装Apache,PHP,MySQL,Nginx?

a) 用的CentOS,Yum安装。生产环境有专门的运维工程师负责。

 

5. Linux下如何杀掉一个进程?

a) Kill 杀掉单个进程

b) Pkill 可以按照进程名杀死进程

http://man.linuxde.net/pkill

 

6. 在两台Linux服务器之间复制数据,你常用什么命令?

a) Scp

b) ftp

7. 在Linux下用什么方法可以查看当前系统的负载信息(CPU,内存,IO)?

a) Top

b) w

c) Uptime

 

 

 

 

 

前端问题

1. 都用过哪些JavaScript框架?

a) jQuery和扩展。

 

2. JavaScript的this指向问题?

javascript 中的 this 有 五种情况:

1.全局范围:

它 会指向 全局对象( 浏览器下指window)

2.全局函数调用:

它 还是指向全局对象。

3.对象函数调用:

调用某个对象的函数, 它指向 当前对象。

4.使用 new 实例化对象时:

它指向 新创建的 对象。

5.调用某些方法时:

如: Function.prototype 上的 call 或者 apply 方法 以及 with等

它指向 传入的对象。

 

3. 说出Array对象的5个方法:

concat, join, pop, push, shift, unshift, sort

 

4. 谈谈你对prototype的理解?

a) 每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。

b) prototype 属性使您有能力向对象添加属性和方法。

 

5. 如何处理ajax的跨域问题?

a) Window.domain;

b) JSONP

 

6. 谈谈你对Bootstrap的理解。

(略)

 

 

 

2017年6月7号

1.

//栏目下商品的总数
        $count = (new Query())->from(Yii::$app->db->tablePrefix . "goods")->where([
            'cat_id' => $id,
            'is_delete' => 0
        ])->count();
        $query = (new Query())
//         ->select("g.*, c.cat_name")
            ->from(Yii::$app->db->tablePrefix . "goods g")
            ->leftJoin(Yii::$app->db->tablePrefix . "category c", "g.cat_id = c.cat_id")
            ->where([
            'g.cat_id' => $id,
            'is_delete' => 0
        ]);
        $pages = new Pagination(['totalCount' =>$count, 'pageSize' => '4']);
        $list = $query->offset($pages->offset)->limit($pages->limit)->all();

        return $this->render("index", [
            'catInfo' =>$catInfo,
            'list' =>$list,
            'pages' => $pages
        ]);

 

2.+++++++++++++++++++++++++++++++

var name = 'zhangsan';

 

function foo(){

 

console.log(name);

name = 'lisi';

console.log(name);

}

foo();

console.log(name);

 

-------------------------------------------

$a  = 100;

 

function foo() {

global $a;

$a = 200;

}

 

foo();

echo $a;

 

3.++++++++++++++++++++++++++++++

var Person = {
name: 'zhangsan',
age: 16,
setAge: function(){
this.age = this.age + 1;
}

}

console.log(Person.age);
Person.setAge();
console.log(Person.age);

 

4.++++++++++++++++++++++++++++++++

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

var Person = function(){
this.name = 'zhangsan';
this.age = 16;
this.setAge = function(n){
this.age = this.age + n;
}
}

var pman = new Person();
console.log(pman.age);
pman.setAge(16);
console.log(pman.age);

-----------------------------------

var Person = function(){
this.name = 'zhangsan';
this.age = 16;

}

Person.prototype.setAge =  function(n){
this.age = this.age + n;
}


var pman = new Person();
console.log(pman.age);
pman.setAge(16);
console.log(pman.age);

 

5.++++++++++++++++++++++++++++++++++++++

function foo(a) {

function add(s) {
return s + 100;
}
return add(a);
}

console.log(foo(5));

-------------------------------

function foo(a) {

return (function(s) {
return s + 100;
})(a);
}

console.log(foo(5));

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值