PHP 面试总结(持续更新) --小丑

Session与cookie的区别?
cookie数据存放在客户的浏览器上,session数据放在服务器上,以文件的形式存放,可以从php.ini里面的session.save_path找到存放位置 cookie不是很安全 ,cookie可以进行cookie欺骗,别人可以获取cookie中的session id考虑到安全应当使用session。 session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器,性能方面,应当使用COOKIE。 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。 所以个人建议:将登陆信息等重要信息存放为SESSION其他信息如果需要保留,可以放在COOKIE中

什么是Session?
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

.什么是Cookie?
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。
目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。
怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。
这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。
客户端浏览器会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。
服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Session的优缺点?
优点

如果要在诸多Web页间传递一个变量,那么用Session变量要比通过QueryString传递变量可使问题简化。
要使WEb站点具有用户化,可以考虑使用Session变量。
你的站点的每位访问者都有用户化的经验,基于此,随着LDAP和诸如MS Site Server等的使用,已不必再将所有用户化过程置入Session变量了,而这个用户化是取决于用户喜好的。
你可以在任何想要使用的时候直接使用session变量,而不必事先声明它,这种方式接近于在VB中变量的使用。
使用完毕后,也不必考虑将其释放,因为它将自动释放。
缺点
Session变量和cookies是同一类型的。
如果某用户将浏览器设置为不兼容任何cookie,那么该用户就无法使用这个Session变量!
当一个用户访问某页面时,每个Session变量的运行环境便自动生成,这些Session变量可在用户离开该页面后仍保留20分钟!(事实上,这些变量一直可保留至“timeout”。“timeout”的时间长短由Web服务器管理员设定。一些站点上的变量仅维持了3分钟,一些则为10分钟,还有一些则保留至默认值20分钟。)所以,如果在Session中置入了较大的对象(如ADO recordsets,connections, 等等),那就有麻烦了!随着站点访问量的增大,服务器将会因此而无法正常运行!
因为创建Session变量有很大的随意性,可随时调用,不需要开发者做精确地处理,所以,过度使用session变量将会导致代码不可读而且不好维护。

Cookie的优缺点?
优点

极高的扩展性和可用性
通过良好的编程,控制保存在cookie中的session对象的大小。
通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
只在cookie中存放不敏感数据,即使被盗也不会有重大损失。
控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。

缺点
Cookie数量和长度的限制。
每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。
安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。
使用场景
cookie用于存放前台临时内容,比如sessionid,购物车业务中的商品信息,使用容易被窃取。
Session用于存放后台的用户信息跟cookie进行会话机制,用于系统登录业务逻辑
作用
cookie的作用是解决HTTP协议中缺少无状态缺陷的问题
由于cookie是在客户端,并不安全,另外如果浏览器禁用了cookie也会导致会话记录失败.
而session存储在服务器,是相对安全的.由服务端很方便控制存储到各种介质中.
php的php.ini配置文件里可以设置session的路径和回收空置率的.
Cookie被禁用session能否使用?

Cookie被禁用时并不影响session的使用,只不过coookie不能存放sessionid而已,可以使用hidden隐藏区域存放

Token的作用?
Token学名就是令牌,就是定于验证码,比如网站后台使用时间戳md5加密每20加密一次存放在cookie,或者前端中,当前端与后台进行通信时在验证这个自定义的验证码是否于后。 台的验证码一致,如果一致为正常,如果不一致则为恶意攻击

什么是Xss攻击?怎么防止?
什么是Xss攻击

Xss又称css,全称:跨站式脚本攻击,问题出现的原因:用户在输入内容时故意输入css或者js代码使网站在加载内容时运行恶意程序造成网站无法正常运行或者恶意盗取信息
防止

正则过滤特殊字符,比如< > = ‘’
去除html标签 strp_tags()
利用php函数特殊字符转义 htmlentities() addslashes()

Php数据类型有那些?
4种标量 int 整型 float浮点型 boolean布尔型 string字符串型
2种复合 object对象 array数组
2种资源 null空 resource资源

Php运行模式?如何运行?
Nignx+php fast cgi
命令行模式 cli
Apache+php web模式
Iss+php ISAPI模式
老版本的nginx+php cgi

Fastcgi运行机制
cgi的升级版,多进程,说明cgi每次运行都需要加载php.ini等配置文件,所以速度慢,而fastcgi父进程加载一次,子进程不需要加载,所以速度快。

Web模块运行机制
是以php的扩展形式安装在apache下当需要解析php代码时,则直接调用php扩展功能。

cLi命令行模式
就是直接运行在命令行,linux和windos都支持

ISAPI模式
是IIS微软操作系统自带的web服务器把php源码发给php进行解析

Php-fpm是什么?php-fpm与ningx如何交互?
Php-fpm是php的进程管理器,f代表fast-cgi,p代表process,m代表manager
Php-fpm是fast –cgI进程管理器,他是对于fast ci协议的具体实现他负责管理一个进程池,来处理web服务器的请求,在php5.3版本以后,php-fpm是内置与php中。
如何交互
fpm默认通过监听9000端口,当请求到nginx web服务器时,nginx打开相应地址下的php文件把源码通过9000端口发送到php-fpm,php-fpm再把源码通过php进程进行解析源码,把结果返回到ningx在返回客户端。
php是单继承还是多继承?如何实现多继承?
PHP类不支持多继承,也就是子类只能继承一个父类,但是接口可以实现多继承, 可以继承一个或者多个接口。当然接口的继承也是和类的继承一样使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可。
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。Trait是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 和 Class 相似,Trait可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化.

Git merge与git rebsae的区别?,git pull与git fetch的区别?
Git merge是多分支合并,按时间顺序排序,比如主分支有历史版本是前天,今天,二从分支只有昨天,则合并后历史版本是前天,昨天,今天
Git rebase 多分支合并时,时间有的时候会缺失,并且把当前的分支历史版本放在别合并的历史版本后面座位最新版本,则合并后的历史版本是,前天,今天,昨天。
git pull是把拉下的分支内容与当前分支进行权柄,
git fetch只把数据拉下来并不合并。Git pull = git fetch+git merge

原生php如何动态获取函数参数个数,参数列表与参数值?
func_num_args — 返回传入函数的参数总个数
func_get_args — 返回传入函数的参数列表
func_get_arg — 根据参数索引从参数列表返回参数值

mysql数据库怎么备份?
备份数据库 mysqldump 数据库名> sql
备份数据表 mysqldump -uroot -p -B 数据库名 –table 表名
导入数据库 mysqldump –uroot -p 数据库,名 < sql

常见的魔术类方法?分别是什么时候触发?
__construct 构造函数 初始化赋值 实例化对象的时候自己调用
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
_call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
clone 复制一个对象时自动调用clone方法,如果在对象复制需要执行某些初始化操作,可以在clone方法实现。
__toString 方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时。
__sleep 串行化的时候用
__wakeup 反串行化的时候调用 _invoke
invoke当尝试以调用函数的方式调用一个对象时,invoke 方法会被自动调用。
callStatic 它的工作方式类似于 call() 魔术方法,__callStatic() 是为了处理静态方法调用

什么是rest api?
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
它主要用于客户端和服务器交互类的软件。
基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。每一个URI代表一种资源;

什么是josn?josn支持那些数据类型?
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 具有自我描述性,更易理解
JSON 比 XML 更小、更快,更易解析。
数据格式
数字(整数或浮点数)
字符串(在双引号中)
布尔(true 或 false )
数组(在方括号中)
对象(在花括号中)
null

简述php的垃圾回收机制是如何实现的?
简称gc,PHP使用了引用计数机制来回收。每个对象都内含一个引用计数器,每个reference链接到对象,计数器加1,当reference离开对象被设为null,计数器减1,当某个引用计数器的对象为0时,PHP知道你将不再需要使用这个对象,释放其所占有的内存空间
简单来说就是:在PHP中,没有任何变量指向一个对象的时侯,这个对象就成为垃圾。

写出构造方法的两种表现形式和析构函数的作用?
构造方法的两种表现形式:__construct(){}类名(){}
析构函数的作用:是对象被销毁时被调用,作用是释放内存(__destruct())

请分别写出定义常量和静态常量的区别?

定义常量:使用 define() 函数 - 它使用三个参数: 首个参数定义常量的名称 第二个参数定义常量的值 可选的第三个参数规定常量名是否对大小写不敏感。默认是 false
静态常量:静态常量,一般用const修饰

请简述http和https的区别?
http 的URL 以http:// 开头,https以https:// 开头。
http 标准端口是80 ,https是443。
https 协议需要到ca申请证书,http不需要。
http 是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http 的连接很简单,是无状态的,https协议是由SSL+http协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。
优点
通过证书可以更信任服务器。
更安全,防篡改。
缺点:
https 需要证书。
因为对传输进行加密,会一定程度增加cpu消耗。
由于https 要还密钥和确认加密算法的需要,所以首次建立连接会慢一些。
带宽消耗会增加。

简述composer的原理?以及composer include composer install composer require的区别?
composer 是 PHP5.3以上 的一个依赖管理工具。它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们。Composer 不是一个包管理器。
是的,它涉及 “packages” 和 “libraries”,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。
默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理
composer install命令从当前目录读取 composer.json 文件,处理了依赖关系,并把其安装到 vendor 目录下
composer update为了获取依赖的最新版本,并且升级 composer.lock 文件
composer require 指定下载的版本

数组实现队列用那些函数?
PHP的数组处理函数还可以将数组实现队列,堆栈是“先进后出”。在堆栈中,最后压入的数据(进栈),将会被最先弹出(出栈)。而队列是先进先出,就如同银行的排号机
而PHP中,将数组当作是队列则主要是用array_push()和array_shift()实现
出栈主要是利用array_shift()函数将数组的第一个元素弹出,并将数组的长度减1

Php的工作原理?
PHP的所有应用程序都是通过WEB服务器(如IIS,Nginx或Apache)和PHP引擎程序解释执行完成的
工作过程

(1)当用户在浏览器地址中输入要访问的PHP页面文件名,然后触发一个web请求,并将请求传送到WEB服务器。
(2)WEB服务器接受这个请求,并根据其后缀进行判断是一个PHP请求,WEB服务器从硬盘或内存中调出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。
(3)PHP引擎程序将会对WEB服务器传送过来的文件从头到尾进行扫描并根据命令从后台读取,处理数据,并动态地生成相应的HTML页面。
(4)PHP引擎将生成HTML页面返回给WEB服务器。WEB服务器再将HTML页面返回给客户端浏览器。

什么是类,什么是抽象类,什么是接口,什么是继承?
类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。
举例:类就好比人类,类有各种属性和各种方法,就像每个人类有姓名,年龄,身高,体重等属性,也有吃饭,睡觉,走路等,具有相同的行为, 所以,人构成一个类,即人类。
使用的关键词是class。
抽象类

抽象就是不具体,不能实例化成具体的实例,可以理解成类的模板,定义为抽象的类不能被实例化。
在任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象类,否则会报错。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。使用“abstract”修饰
接口
我们可以通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口中定义的所有方法都必须是public,这是接口的特性。
实现接口
要实现一个接口,可以使用implements操作符。类中必须实现接口中定义的所有方法,否则 会报一个fatal错误。如果要实现多个接口,可以用逗号来分隔多个接口的名称。
实现多个接口时,接口中的方法不能有重名。
接口也可以继承,通过使用extends操作符。
接口中也可以定义常量。接口常量和类常量的使用完全相同。 它们都是定值,不能被子类或子接口修改。
继承
Php单继承 ,PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承。
概念 关键词
父类只是一个平常的类,要想有后代你只需要在平常类后加一个extends关键字就可以继承,这样子类只拥有了父类所有的属性和方法。
继承权限问题

父类private方法不可被继承,父类私有化
父类protected方法可以被继承,但不能被实例化对象调用,父类对此方法置于保护模式下
父类public方法可以被继承、可以被实例化对象调用,属于公开方法
子类可重写父类public或者protected的方法,不能重写private的方法,如果同名只是在本类重新声明

Include,require,include_once,require_once 的区别?
include与require的区别
include与require除了在处理引入文件的方式不同外,
最大的区别就是:include 在引入不存文件时产生一个警告且脚本还会继续执行, require在引入不存文件则会导致一个致命性错误且脚本停止执行。
include_once与require_once的区别

include_once,require_once函数的作用与include相同,不过它会首先验证是否已包含该文件。如果已经包含,则不再执行include_once。其他同include一样。

ajax的优点
最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。
使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,
基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
ajax的缺点
ajax干掉了back按钮,即对浏览器后退机制的破坏
安全问题因为ajax技术就像是直接建立一个通道,会暴露比以前数据和服务器逻辑
对搜索引擎的支持比较弱
一些手机设备现在还不能更好的支持ajax

简述DOM加载顺序和常用的事件
DOM加载顺序
1.解析HTML结构。
2.加载外部脚本和样式表文件。
3.解析并执行脚本代码。
4.构造HTML DOM模型。
5.加载图片等外部文件。
6.页面加载完毕
焦点事件:当元素获得焦点或失去焦点时触发

blur:失去焦点时触发,这个事件不会冒泡
focus:获得焦点时触发,不冒泡
focusin:在获得焦点时触发,但他冒泡,DOM3新增
focusout:在失去焦点时触发,冒泡
鼠标事件:当用户通过鼠标在页面上执行操作时触发

click:单击事件,用户单机鼠标按钮(一般是左键)或按下回车键时触发
dbclick:双击事件,当双击鼠标时触发(一般是左键)
mousedown:当用户在按下任意鼠标按钮时触发
mouseup:当用户释放鼠标按钮时触发
键盘事件

keydown:当用户在按下任意键盘按钮时触发
keyup:当用户释放键盘按钮时触发
Change: 当内容发生变动时

简述MySQL的引擎,myisam和innodb的区别?

(1)[事务]MyISAM是非事务安全型的,而InnoDB是事务安全型的,
(2)[锁]MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
(3)[全文索引]MyISAM支持全文类型索引,而InnoDB不支持全文索引(5.7之前)。
(4)[查询效率]MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
(5)[外健]MyISAM不支持外健,InnoDB支持。
(6) MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

简述session存储原理和实现session共享的方式
存储原理
当用户第一次访问站点时,PHP会用session_start()函数为用户创建一个session ID,这就是针对这个用户的唯一标识
每一个访问的用户都会得到一个自己独有的session ID,这个session ID会存放在响应头里的cookie中,之后发送给客户端。这样客户端就会拥有一个该站点给他的session ID。
当用户第二次访问该站点时,浏览器会带着本地存放的cookie(里面存有上次得到的session ID)随着请求一起发送到服务器,服务端接到请求后会检测是否有session ID,如果有就会找到响应的session文件,把其中的信息读取出来;如果没有就跟第一次一样再创建个新的。
通常站点的退出功能,实际上就是调用一下session_destroy()函数(也有可能更复杂些),把该用户的session文件删除,再把用户的cookie清除。这样客户端和服务端就算没有联系了。
因为HTTP是无状态的,所以一次请求完成后客户端和服务端就不再有任何关系了,谁也不认识谁。但由于一些需要(如保持登录状态等),必须让服务端和客户端保持联系,session ID就成了这种联系的媒介了。
客户端的工作

通过上面的分析我们可以知道session实际上是依赖与cookie的,当用户访问某一站点时,浏览器会根据用户访问的站点自动搜索可用的cookie,如果有可用的就随着请求一起发送到了服务端。每次接收到服务端的响应时又会更新本地的cookie信息。
当然也可以用GET方式来传递session ID,但不推荐用GET,这样不安全。
服务端的工作

由上面的流程图可以看到,服务端实际上是把产生的一些数据存放在了session文件中,该文件的名字就是”sess“加上session ID,这些文件的存放位置就是phpinfo()查到的session.savepath值。
Session共享:

php支持把session数据存储到memcache/redis内存服务器,手动把seesion的文件改为nfs网络系统文件,从而实现文件的跨机器共享。

什么是mvc?
Mvc是程序分为 模型 model-视图 view-控制器 controller
模型(m) 是指数据库层操作,比如数据库操作。
视图(v) 是展示给用户的图形化界面,试图还需要护理用户的操作
控制器(c)
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
优点
耦合性低、重用性高、生命周期成本低、部署快、可维护性高、有利软件工程化管理
缺点
没有明确的定义、不适合小型,中等规模的应用程序、增加系统结构和实现的复杂性、视图与控制器间的过于紧密的连接、视图对模型数据的低效率访问、一般高级的界面工具或构造器不支持模式

Js 中网页前进和后退的代码
前进: history.forward();或者history.go(1);
后退: history.back()或者history.go(-1);
刷新:window.location.reload();

列举你常见的设计模式,并说明在什么场景下使用?
单例模式
单例模式是一种常用的软件设计模式。
在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
工厂模式
工厂模式主要是为创建对象提供了接口。
应用场景如下:
a、 在编码时不能预见需要创建哪种类的实例。
b、 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
应用场景如下。
a、 一件事情,有很多方案可以实现。
b、我可以在任何时候,决定采用哪一种实现。
c.、未来可能增加更多的方案。
d、 策略模式让方案的变化不会影响到使用方案的客户。
举例业务场景如下。
系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。
观察者模式
观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
应用场景如下:
a、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
b、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
应用场景如下:
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
模板方法模式
模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
应用场景如下:
对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。

请写出php5权限控制修饰符?
Private私有的
protected受保护的
public 共有的

如何实例化一个名为myclass的对象?
$myclass=new 对象()

如何我的网站使用的utf8编码,为防止乱码出现,需要注意那些问题?
数据库中库和表字段中都用utf8_general_ci编码
php连接mysql,指定数据库编码为utf8 mysql_query(“set namesutf8”);
php文件指定头部编码为utf-8 header(“content-type:text/html;charset=utf-8”);
网站下所有文件的编码为utf8
html文件指定编码为utf-8 < content=“text/html;charset=utf-8” />

请解析如下错误提示可能是什么问题?Catchable fatal error:Argument 1 passed to dok() must be an array,integer given ,called in /www/html/test.php on line 2
问题是参数1传递时不是数组

请问PHP中 echo 和 print print_r var_dump有什么区别?
Echo 不是一个函数,可以一次输出多个值,多个值之间用逗号分隔,echo只能打印出普通变量的值。
print是一个语法结构(language constructs), 他并不是一个函数
Print_r作用是输出一个数组结构
Var_dump函数输出数组结构,但并不格式化

请问 GET和POST方法有什么区别?
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被注入,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET参数通过URL传递,POST放在请求体中。

如何使用php实现多继承?
PHP类不支持多继承,也就是子类只能继承一个父类,但是接口可以实现多继承, 可以继承一个或者多个接口。当然接口的继承也是和类的继承一样使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可。
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 和 Class 相似,Trait可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化.

如何解决ajax请求缓存的问题?
url参数添加随机数或时间戳 , 后缀的方式解决问题,这样就会多了一个一直在变的参数

写出一下服务默认使用的端口号 FTP ssh https redis smtp Php-fpm mysql mongo
FTP的端口是 21
SSH服务使用tcp 22 端口
HTTPS服务器,默认的端口号为 443/tcp 443/udp
SMTP默认的端口号为25/tcp
mysql默认端口是3306
redis默认端口号6379
Php-fpm默认端口号9000
Mongo默认端口号27017

如何防止sql 注入?简要说明常用的方法以及和其优缺点?
什么是sql注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句
如何防止
1:对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等
2:检查输入的数据是否具有所期望的数据格式,严格限制变量的类型
3 : 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息
4:使用pdo过滤传入的参数
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6::永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取

简要说明以下PHP扩展的用途 APC iconv curl sockets reflection
APC PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。
iconv字符集转换 可以转换文件或者数据的字符集编码格式
curl curl是一个非常强大的开源库,支持很多协议,包括HTTP、FTP等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支:持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
Socket:又称之为“套接字”,是系统提供的用于网络通信的方法。比如使用php搭建web服务器,长链接使用
reflection:这个功能使得程序员可以通过PHP代码,就可以得到某object的所有信息,并且可以和它交互

PHP获取远程的内容有哪些方法?
1.用file_get_contents方法 以get方式获取远程内容:
2.使用curl库,使用curl库之前,可能需要查看一下php.ini扩展是否已经打开了,curl扩展可实现不通过浏览器 从本服务器直接请求另一个服务器的作用

Memache和memcached的区别?
memcached 支持 Binary Protocol,而 memcache 不支持,意味着 memcached 会有更高的性能。不过,还需要注意的是,memcached 目前还不支持长连接。memcached 比 memcache 支持更多的 memcache 协议,大概也就是说 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函数非常有用,但是 memcache 并不支持。

防止session_id泄露的方法?
1:在登录验证成功后,通过重置session,使之前的匿名sessionId失效,这样可以避免使用伪造的sessionId进行攻击。request.getSession().invalidate();这样登录前与登录后的sessionID就不会相同
2设置httpOnly属性
httponly是微软对cookie做的扩展,该值指定 Cookie 是否可通过客户端脚本访问, 解决用户的cookie可能被盗用的问题,减少跨站脚本攻击
主流的大多数浏览器已经支持此属性。httpOnly是cookie的扩展属性,并不包含在servlet2.x的规范里,因此一些javaee应用服务器并不支持httpOnly,针对tomcat,>6.0.19或者>5.5.28的版本才支持httpOnly属性,具体方法是在conf/context.xml添加httpOnly属性设置。

3:另一种设置httpOnly的方式是使用Tomcat的servlet扩展直接写header
response.setHeader( “Set-Cookie”, “name=value; HttpOnly”);
Ning日志怎么统计每个ip的访问量?

日志文件所在地方:
/var/log/nginx/access_iqueendress.com.log
/var/log/nginx/access_m.iqueendress.com.log
cd /var/log/nginx/
1.根据访问IP统计UV

awk ‘{print $1}’ access_iqueendress.com.log|sort | uniq -c |wc -l
awk ‘{print $1}’ access_m.iqueendress.com.log|sort | uniq -c |wc -l
awk ‘{print $1}’ access*.log|sort | uniq -c |wc -l

4.查询访问最频繁的IP 倒序排序列表
awk ‘{print $1}’ access*.log|sort | uniq -c |sort -n -k 1 -r|more

1.根据访问IP统计UV
awk ‘{print $1}’ access.log|sort | uniq -c |wc -l
2.统计访问URL统计PV
awk ‘{print $7}’ access.log|wc -l
3.查询访问最频繁的URL
awk ‘{print $7}’ access.log|sort | uniq -c |sort -n -k 1 -r|more
4.查询访问最频繁的IP
awk ‘{print $1}’ access.log|sort | uniq -c |sort -n -k 1 -r|more
5.根据时间段统计查看日志
cat access.log| sed -n ‘/14/Mar/2015:21/,/14/Mar/2015:22/p’|more

Laravel框架的中间件如何实现?
中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制。例如,Laravel 内置了一个中间件来验证用户是否经过认证(如登录),如果用户没有经过认证,中间件会将用户重定向到登录页面,而如果用户已经经过认证,中间件就会允许请求继续往前进入下一步操作。
当然,除了认证之外,中间件还可以被用来处理很多其它任务。比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求,从而方便我们构建系统日志系统。

Php框架中单入口功能的实现原理以及必要性?
大部分php框架都是单一入口模式,竟来的所有http请求都会指向一个文件,从这个入口文件进去,进去再去访问别的文件进行相应的操作,而这个原理就是php与服务器的配合,讲所有请求的路径转换给index。Php做字符串请求的判断即可达到路由解析功能,由于所有的http请求都由index。Php接受,所以可以集中的安全性检查

请分别写出避免sql注入和xss攻击的方法?
xss防止
1: 正则过滤特殊字符,比如< > = ‘’
2去除html标签 strp_tags()
3 利用php函数特殊字符转义 htmlentities() addslashes()
sql如何防止
1对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等
2:检查输入的数据是否具有所期望的数据格式,严格限制变量的类型
3 : 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息
4:使用pdo过滤传入的参数
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6::永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取

Apache和ningx的区别以及用法?优缺点?
Apache:Web服务器端软件,由于其跨平台和安全性被广泛使用,是最流行的web服务器端软件之一,特点是:简单、速度快、性能稳定,并可做代理服务器来使用。
Apache优点:
Apache的rewrite比nginx强大,在rewrite频繁的情况下,用apache。
Apache超稳定。
Apache对php支持比较简单,nginx需要配合其他后端使用。
apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区。
apache 更为成熟,少 bug ,nginx 的 bug 相对较多
Nginx:轻量级的web服务器/反向代理服务器及电子邮件代理服务器,其特点是:占用内存少,并发能力强,国内向百度、京东、淘宝等都在使用。
ningx优点:
轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源。
抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
nginx 的设计高度模块化,编写模块相对简单。
nginx 作为负载均衡服务器,支持 7 层负载均衡。
nginx 处理静态文件好,静态处理性能比 apache 高三倍以上。
nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃。

对于框架中路由实现的大致方法?
通过伪静态来实现单一入口,将所有请求通过apache伪静态解析转给某个指定文件,然后通过php的$_SERVER[]这个全局变量来去的请求的路径字符串,对其进行解析再分配指定的类去处理。
基本思路

浏览器端通过URL字符串提供控制器类的名字和方法的名字,PHP据此找到对应得类和方法。
几种编程模式,在什么时候使用?

初级模式:初级模式就是前台界面和业务处理代码混合在一起,在哪里显示,就在哪里处理。这种模式是php编程最初级的模式,也是最原始的。如果一个程序比较小,不需要太复杂的处理,就可以使用这种模式。
分层模式:分层模式就是把界面和业务分开,放在不同文件中,是一种面向对象编程模式,形成多个层次,责任分工。
MVC模式:一种面向对象编程模式,把软件系统 分为三个基本部分:模型 (Model)、视图(View)和控制器(Controller)。MVC模式用一种业务逻辑、数据、界面显示分离的方法组织代码,可有效提升代码的重用性。
控制器有两个作用:
1.调取视图进行页面显示
2.调取模型实现具体逻辑代码的执行程序,最终将结果返回给控制器

Echo count(’www.baidu.com’)输出什么?
Count() 函数用来计算取值范围内的数字项的个数。
www.baidu.com是一个字符串所以输出的是1

http协议中的几个状态码以及含义?
100:客户必须继续发送请求
200:请求成功
203:返回信息不确定或者不完整
205:服务器完成了请求,用户代理必须复位当前已经浏览过的文件
301:删除请求数据
302:在其他地址发现了请求数据
400:错误请求
403:请求不允许
404:找不到文件
500:服务器产生内部错误
501:服务器不支持请求的函数
503:服务器所在或暂停维修

单点登录的实现原理?
简介
单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源,若用户在某个应用系统中进行注销登录,所有的应用系统都不能再直接访问保护资源,
像一些知名的大型网站,如:淘宝与天猫、新浪微博与新浪博客等都用到了这个技术。
原理
单点登录 有一个独立的认证中心,只有认证中心才能接受用户的用户名和密码等信息进行认证,其他系统不提供登录入口,只接受认证中心的间接授权。
间接授权通过令牌实现,当用户提供的用户名和密码通过认证中心认证后,认证中心会创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌即得到了授权,然后创建局部会话。

对命名空间的理解?
一般情况向,在一个php程序源代码文件或同一个请求中是不允许有两个

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值