php运行原理是什么?
- 当用户访问静态文件时
服务区接收到指令后直接返回,因为静态页不需要后端语言处理,直接由浏览器本身解析 - 当用户访问动态脚本时
服务器接收到指令后传递给php解释器,然后经过程序处理后,在返回给apache,apache将处理后的页面返回个i客户端,从而完成整个响应过程 - 当用户访问动态脚本时
此时这个脚本的数据来源与数据库时,服务器接收到指令后传递给php解释器,经过程序梳理,到达数据库,读取数据,然后层层返回,最终到达客户端,从而完成整个响应过程
PHP响应慢
- 用Xdebug,Webgrind等调试工具调试源码
- 检查webserver日志中的响应时间
- 如果服务器整体负载不高,但PHP的数据返回时间过长,在PHP代码中分段输出处理时间
- 如果是高访问量的在线调试,一般选取一定比例记录日志,防止日志过多带来的额外系统开销
- 调试指导思想:逐步缩小范围,定位、优化
用php打印出前一天的时间,格式是2018-5-10 22:21:21
方式一、echo date('Y-m-d H:i:s',strtotime('-1 day',time()));
方式二、echo date("Y-m-d H:i:s",time()-24*3600);
php脚本报错信息怎样控制
1.error_reporting(E_ALL^E_NOTICE^E_WARNING);
2.打开PHP安装目录下的php.ini文件找到
display_errors = On 修改为 display_errors = off
php 防止sql注入一般用什么函数 有哪些操作数据库可以防止注入
- PDO扩展 预定义
- mysql_real_escape_string 防止sql注入
列举工作使用设计模式
- 单例模式 单例模式,使某个类的对象仅允许创建一个。构造函数private修饰,
- 申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接
- 工厂模式 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。
- 使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数
- 观察者模式 当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新
创建文件text.txt 并写入hello world
$myFile=fopen("text.txt","a") or die("unable to open file!bai");
$txt="Hello World!";
fwrite($myFile,$txt);
fclose($myFile)
将后面jquery选择符翻译成中文描述
$("#d div.cls input[type=text][name^text=text]")
webscoket 定义
- WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。WebSocket
的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。 - WebSocket 的其他特点:
- 建立在 TCP 协议之上,服务器端的实现比较容易。
- 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP
代理服务器。 - 数据格式比较轻量,性能开销小,通信高效。
- 可以发送文本,也可以发送二进制数据。
- 没有同源限制,客户端可以与任意服务器通信。
- 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
MYSQL
什么是索引?
索引是一种数据结构,可以帮助我们快速的进行数据的查找
索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引
在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?
- 使用不等于查询列参与了数学运算或者函数
- 在字符串like时左边是通配符.类似于’%aaa’
- 当mysql分析全表扫描比使用索引快的时候不使用索引
- 当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使 用索引
- 以上情况,MySQL无法使用索引
什么是事务?
理解什么是事务最经典的就是转账的栗子,相信大家也都了解,这里就不再说一边了.
事务是一系列的操作,他们要符合ACID特性.最常见的理解就是:事务中的操作要么全部成功,要么全部失败.但是只是这样还不够的
ACID是什么?
- A=Atomicity 原子性,就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作
- C=Consistency 系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态
- I=Isolation 隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面的通常来说加了红色,意味着有例外情况
- D=Durability 持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果
同时有多个事务在进行会怎么样呢?
多事务的并发进行一般会造成以下几个问题:
- 脏读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚
- 不可重复读: 当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作
- 幻读: A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据.造成幻觉
为什么要尽量设定一个主键
主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全
主键使用自增ID还是UUID?
推荐使用自增ID,不要使用UUID
- 因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子
- 节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断
向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入
数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降 - 总之,在数据量大一些的情况下,用自增主键性能会好一些
MySQL支持哪些存储引擎?
- MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多数的情况下
- 直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎
InnoDB和MyISAM有什么区别?
- InnoDB支持事务,而MyISAM不支持事物,崩溃后无法安全恢复,表锁非常影响性能
- InnoDB支持行级锁,而MyISAM支持表级锁
- InnoDB支持MVCC,实现了四个标准的隔离级别 而MyISAM不支持
- InnoDB 表是基于聚族索引建立的,聚族索引对主键查询有很高的性能
- InnoDB支持外键,而MyISAM不支持
- InnoDB不支持全文索引,而MyISAM支持,可以支持复杂的查询(注意:5.6版本之 后InnoDB存储引擎开始支持全文索引,5.7版本之后通过使用ngram插件开始支持中文)
平常开发原则:
- 编写代码注重效率,尽可能占用更少的资源
- 缓存复杂和耗时运算的结果
- 用apc或者xcache等缓存PHP的opcode
- 能异步处理的任务不要马上处理,如发邮件
- 依据资源情况对FastCGI配置合适的参数
- 负载均衡器设好阀值,不要无限制的给后端压力 接口api设置过期时间,1秒内等
网站访问速度慢的排查方法?
- 首先查看本地的网络是否通畅
- 检查:ping, mtr,dig,dig+trace 等命令,检查网络状况,DNS等
- 浏览器太烂,页面设计不佳
检查:浏览器解析时间,是否DOM节点过多,JS有问题等
解决:优化页面代码 - 服务器状态
检查:负载,CPU, 网络,内存,磁盘空间等使用情况,日志切割
如果单台服务器性能受限,考虑调整为分布式架构,如nginx转发,DB分库分表等
DB响应慢
-
读取慢
检查:慢查询日志; show processlist 查看当前DB状态,看哪些请求停留较多 top查看mysql进程的开销代码中记录SQL和执行时间(php可以使用microtime记录) 解决: 手动执行可疑SQL(注意排除querycache的影响),用explain,profile等工具分析SQL性能 再考虑是否优化索引,或者分库分表,或者增加缓存
-
写入慢
检查:除读取慢的检查方法外,还有iostat 检查磁盘IO
查看mysql binlog的写入速率
解决:增加缓存,分库分表,优化索引,从业务逻辑上考虑减少DB操作,合并写入
内部网络消耗太大 -
其他
被攻击,webserver进程数受限,甚至内网流量过高等原因,都有可能导致访问缓慢,具体情况具体分析
简述php面向对象中接口和抽象类的区别
- 1、接口的关键字是 interface ,抽象类的关键字是 abstract。
- 2、接口没有构造函数,抽象类可以有构造函数。
- 3、对接口的使用时通过关键字 implements. 对抽象类的使用是通过关键字extends,当然接口也可通过关键字extends继承(可以继承多个父类,用逗号隔开)。
- 4、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。说白了, 接口中只能声明类方法(不带方法体{})和常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
- 5、接口中的方法都是public类型,这是接口的特性。而抽象类中的方法可以使用 private、protected、public来修饰。
什么是跨站点请求伪造(csrf)如何预防
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
- CSRF的常见特性:
- 依靠用户标识危害网站
- 利用网站对用户标识的信任
- 欺骗用户的浏览器发送HTTP请求给目标站点
- 另外可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击。
- CSRF攻击依赖下面的假定:
攻击者了解受害者所在的站点
攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie
目标站点没有对用户在网站行为的第二授权
什么是跨站脚本攻击(XSS)?如何预防?
-
概念:
XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏 洞.XSS通过在用户端注入恶意的可运行脚本,若服务器端对用户输入不进行处理,直接将用户输入输 出到浏览器,然后浏览器将会执行用户注入的脚本。
-
举例:
有一个input输入框,需要用户输入名字,用户却输入一个恶意脚本,,
或者用户输入一个HTML,在标签中嵌入恶意脚本,如src,href,css style等。
如:
<IMG SRC="javascript:alert('XSS');">;
<BODY BACKGROUND="javascript:alert('XSS')">
- 防御
其恶意脚本都是来自用户的输入。因此,可以使用过滤用户输入的方法对恶意脚本进行过滤。
1、获取用户输入,不用.innerHTML,用innerText。
2、对用户输入进行过滤,如 HTMLEncode 函数实现应该至少进行 & < > " ’ / 等符号转义成 & < > " ' /;