HTML中DTD意义和作用
DTD文档类型定义,是一种保证html文档格式正确的有效方法,在解析网页时,浏览器将使用DTD来检查页面的有效性(是否符合规范,元素和标签使用是否正确) 并且采取相应的措施.同时它还会影响浏览器的渲染模式(工作模式)
XHTML和HTML的区别
xhtml必须强制指定义文档类型
XHTML所有标签必须闭合,html比较随意
xhtml严格区别大小写,所有标签的元素和属性的名字都必须使用小写
xhtml要求所有标记都必须要有一个相应的结束标记
xhtml规定所有属性都必须有一个值,没有值就重复本身 比如checked="checked"
div和span标签的区别
语义化角度:div,span对于包含元素无意义,P是语义化标签,表示一个段落
显示角度: span行内元素前后不断行(内联元素)
div,p 是块级元素,要断行且P断两行
列举常用的meta元素
向搜索引擎说明你的网页的关键词
禁止浏览器从本地计算机的缓存中访问页面内容
用于告知浏览器以何种版本渲染当前页面
旧的 不推荐 html5推荐
让网页在一定的时间内刷新自己,或者在多长时间后跳转到其他网页
避免百度打开网页时可能会对其进行转码
指定网页的过期时间,过期后必须重新请求服务器
网站内容描述,用来告诉搜索引擎你网站的主要内容
标注网页的作者 比如 phpopenfather--
双核浏览器的渲染方式,用于指定双核浏览器默认以何种方式渲染页面
怪异模式和xhtml模式下IE的宽的区别
标准模式指浏览器按照w3c标准解析执行代码
怪异模式则是使用浏览器自己的方法解析执行代码,解析模式与网页中DTD声明直接相关,忽略DTD声明,将是网页进入怪异模式
如何添加html元素事件
直接视同元素的属性 如
使用DOM0级事件,简单,兼容性好
使用DOM2级事件,功能更强大 在非标准浏览器中使用addEventListener
strlen()和mb_strlen
都是用于获取字符串长度
strlen计算的是字符串的总字节数,只针对单字节编码字符
mb_stalen 获取字符数,要开启mbstring扩展并制定字符集
include与require
都是把另外一个文件包含到当前文件
include被包含的文件不存在的话,提示错误 代码继续执行
require包含文件不存在的话或无法打开 导致一个致命错误 中断代码执行
include_once和require_one被包含的文件只引入一次,可避免重复引入
预定义全局变量
$_SERVER['REMOTE_ADDR'] 浏览当前页面的用户的 IP 地址
$_SERVER['REMOTE_HOST'] 浏览当前页面的用户的主机名
$_SERVER['REMOTE_PORT'] 用户机器上连接到 Web 服务器所使用的端口号
$_SERVER['SERVER_ADDR'] 当前运行脚本所在的服务器的 IP 地址
$_SERVER['SERVER_NAME'] 当前运行脚本所在的服务器的主机名
$_SERVER['SERVER_PORT'] 当前运行脚本所在的服务器的端口号
$_SERVER['REQUERT_METHOD'] 访问页面使用的请求方法
$_SERVER['REQUERT_TIME'] 请求开始时的时间戳
$_SERVER['REQUEST_URI'] URI 用来指定要访问的页面
$_SERVER['QUERY_STRING'] query string(查询字符串),如果有的话,通过它进行页面访问。
$_SERVER['SCRIPT_FILENAME'] 当前执行脚本的绝对路径。
$_SERVER['HTTP_HOST'] 当前访问页面的域名
当前访问页面的地址 $_SERVER['HTTP_HOST']. $_SERVER['REQUEST_URI']
GET和POST
get发送请求HTTP协议通过url参数传递进行接收,而POST是实体数据,可以通过表单提交大量信息
get不安全,数据会显示在url地址栏 ,Post比较安全
get有限制255字符大小限制2KB post从理论上来数无限制 默认设置为8M 可通过php.ini中设置
get值分开传送,post把值集中传送
get非常灵活 , post必须依存表单
echo print print_r()
echo 是一个语言结构,输出一个或多个字符串
print 实际上不是一个函数 而是一个语言结构,因此可以不加括号 输出一个字符串
print_r()是一个函数,打印变量的信息,基本类型数组,对象
sort() asort() ksort()
sort 根据数组中元素的值以英文字母顺序排序,索引键会由0到n-1重新编号,主要是当数组索引键的值无关紧要时用来把数据排序
asort() 对数组进行排序 数组的索引保持和单元关联,主要用于对那些单元顺序很重要的结合数组进行排序
ksort() 根据数组中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的关联数组
PHP
php是超文本预处理器的字母缩写是一种被广泛应用的开放源代码的多用途脚本语言,可嵌入html,尤其适合web开发
php脚本有三个领域
1)服务器脚本
2)命令行脚本
3)编写桌面应用程序
数组涉及到的常用函数
array--声明一个数组
count -- 计算数组中单元数目或对象中的属性个数
foreach -- 遍历数组
list -- 遍历数组 可用于交换变量值
explode -- 将字符串转成数组
implode -- 将数组转成一个新字符串
array_merge -- 合并一个或多个数组
is_array -- 检查是否是数组
print_r -- 输出数组
sort -- 数组排序
array_keys -- 返回数组中所有的键
array_values -- 返回数组中所有的值
key --从关联数组中取得键名
字符串的常用函数
trim() -- 去除首尾空格
strlen() -- 字符串长度
strpos() --找字符串在另一字符串中第一次出现的位置
substr() -- 截取字符串
str_replace() -- 替换字符串函数
substr_replace() -- 对指定字符串中的部分字符串进行替换
strstr() -- 检索字符串函数
implode() -- 将数组合并成字符串
str_repent() -- 重复一个字符串
addslashes() -- 转义字符串
htmlspelialchars() HTML实体转义
sql安全性
防止sql注入 -- 对特殊字符进行转义,过滤或使用预编译的sql语句绑定变量
最小权限原则 -- 为不同类型的动作或组件使用不同的账户 特别不要使用root账户
当sql运行出错时不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息
索引 主键 唯一索引 联合索引
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针
普通索引(index) 的唯一任务是加快对数据的访问速度
唯一索引和 普通索引 允许被索引的数据列包含重复的值 ,如果能确定某个数据列将只包含彼此各不同的值就可以使用关键字unique定义为唯一索引 可保证数据记录的唯一性
主键:特殊的唯一索引,在一张表中只能有一个主键索引,用于唯一标识一条记录
联合索引:索引可以覆盖多个数据列
索引可以极大的提高数据的查询速度,但是会降低插入,删除,更新表的速度, 因为在执行这些操作时,还要操作索引文件
sql优化
尽量选择较小的列
将where中用的比较频繁的字段建立索引
select 字句避免使用'*'
避免在索引列上使用计算 .<> . not in 的操作
当只需要一行数据时 使用limit
保证表单数据不超过200w 适当分割表 - 分区 -分表
针对查询慢的sql语句使用explain分析语句具体的执行情况
mysql_fetch_row 和mysql_fetch_array
mysql_fetch_row() 是从指定的结果标识关联的结果集中取得一行数据并作为数据返回,每个结果的列储存在一个数组的单元中 偏移量(下标)从0开始
mysql_fetch_array 是fetch_row 的扩展版本,除了将数字索引方式存储存在数组之外,还可以将数据作为关联索引存储,用字段名作为键名
mysql_fetch_array 中可选的第二个参数 result_type 是一个常量可以接受以下值:mysql_assoc mysql_num和mysql_BOTH 其默认值为mysql_BOTH
PHP访问数据库的步骤
mysql_connect ('127.0.0.1','root','root','数据库名') 连接数据库
mysql_select_db('数据库名') 选择数据库
mysql_query('set names utf8') 设置字符集
mysql_query(sql) 执行sql语句
mysql_close($link) 关闭连接
mysql外连接 内连接,自连接?
交叉连接又称笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配
内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现的结果集中,即内连接只有连接匹配的行
外连接 其结果集不仅包含符合连接条件的行,而且还会包含左表和右表或两个表中的所有数据行,有一次称之为左外连接,右外连接
左连接 也称为左连接,左表为主表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右表也对应的那些字段值以NUll来填充
右外连接 也称右连接,右表为主,右表中的所有记录都会出现在结果集中
MySQL中MYISAM和InnoDB
a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
c. InnoDB不支持FULLTEXT类型的索引.
d. InnoDB 中不保存表的具体行数,也就是说,
执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可.
e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
f. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
g. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,
但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
h. MyISAM支持表锁,InnoDB支持行锁。
存储过程的适用情况
当需要处理复杂的查询和运算时,可以使用存储过程
从应用分层的原则,大量使用存储过程导致业务逻辑分散在DB和应用服务器层,不利于维护和更新
总体来说,存储程序可以用,但要慎用,最好只用来维护,不利于业务逻辑和支撑高并发性能的东西
MVC
MVC是一种架构设计模式是一种设计理念.是为了达到分层设计的目的,从而使代码解耦合,便于维护和代码的复用,通俗来说,MVC可以让你的代码结构更加清晰明了
它的实现是把代码分为模型,视图,控制器三个部分,model层负责提供数据,和数据库有关的操作都交给模型层来处理,view层则提供交互的界面,并输出数据,二controller层负责接收请求,并分发给相应的model来处理,然后给view层来显示
GD
GD库提供了一系列用于处理图片的API,使用GD库可以处理图片或者生成图片,在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表
SESSION和COOKIE
cookie 保存在客户端 而session保存在服务端
从保存内容的类型角度来讲,cookie只保存字符串和数字,而session可以保存除资源以外所有的数据类型
从保存内容的大小角度来讲,cookie保存的内容比较小,只有2K左右 而session从理论来说无限制
从性能上角度来说,session对服务器的压力更大
禁用cookie的话cookie失效,而session可以不基于cookie而是用get或SID 仍然生效
状态码
200 -OK 服务器成功处理请求
301 - 重定向错误
301 - 自从上一次未修改,浏览器读取缓存
403 - 禁止 请求被服务器拒绝
404 - 未找到资源
500 - 服务器错误
503 : 服务器临时维护或过载。这个状态时临时性的。
AJAX
ajax是javascript/xml/css/dom等多个技术的组合
工作原理是一个页面的指定位置可以加载另一个页面的所有输出的内容这样就实现了一个静态网页在不刷新整个页面的情况下也能获取数据库中的返回数据信息
核心技术:xml/httpRequest 它是javascript中的一个对象
优点:减轻了服务器端负担,将一部分以前有服务器负担的工作转移到客户端,利用客户端闲置的资源进行处理了再只局部刷新的情况下更新页面,减少了用户等待时间,同时也降低了网络流量,增强了客户体验度
缺点: 不利于SEO推广优化,因为搜索引擎无法直接访问到ajax请求的内容
大型项目优化的方向
代码优化
开启opcode缓存,减少额外CPU和内存开销,加快代码运行速度
重模型轻控制器,减少冗余
符合PHP-FIG规范和phpDoc规范,增强代码可读性&可扩展性有利于团队开发
类: 花括号独占一行
类中方法:华括号独占一行
类名:大驼峰
方法名:小驼峰
命名空间:后面空一行
常量名:大写,多个单词用下划线分割
数据库优化
架构:主从复制、读写分离
设计:存储引擎、字段类型、三范式
功能:缓存、分区、索引
缓存优化
好处:减少数据库查询,将数据缓存,加快查询数据
实现:
内存(memcache、redis)
文件(使用TP3.2的大S或大F方法 TP5中Cache类)
架构优化
负载均衡、集群、动静分离、读写分离、主从复制、CDN加速等
负载均衡:将用户的请求分配给多个服务器处理(轮着来,ip哈希)
集群:多个服务器实现相同的业务
分布式概念:多台服务器实现不同的业务
动静分离:将静态资源单独放一台服务器
主从复制:insert/update/delete到主服务器执行,所有从服务器检测主服务器有写入数据则自动同步
读写分离:通过PHP判断,如果是insert/update/delete交给主处理,如果是select交给从服务器
CDN加速:将静态资源缓存到用户所在城市,加快访问速度
memcache
就是一个数据库、但是数据存在内存中
用来做缓存服务器、将从数据库查询的数据缓存起来,减少数据库查询、加快查询速度
memcached 内部不会监视记录是否过期
检查记录是否过期.这种技术被称为惰性过期
好处 : 减少监控过期产生的开销
最近最少使用算法 (LRU:Least Recently Used)
缓存空间已满 采用LRU策略
将使用频率最低数据进行删除
单个key键名最大长度为多少?
最大长度是250个字符
单个键最大存储数据为 1M
最大存储时间为30天 (3600*24*30) 内都可以
0 为理论上永久 重启后数据会消失 数据满后 LRU也可以移除
事务
是作为一个单元的一组有序的数据库操作,如果组中的所有操作都成功,则为事务成功,即使只有一个操作失败,事务整个都不会成功,如果所有操作完成,事务则提交其修改将作用于所有其他数据库进程,如果一个操作失败,则事务回滚,改事务所有操作的响应都将取消
如何得到一个网页的内容
file_get_contents
fopen & stream_get_contents
实际开发,常量应用在哪里
连接数据库的信息
斩断部分路径
网站公告信息
memcached、redis 和MySQL
Redis 和 memcached :
1、Redis只使用单核,而Memcached可以使用多核。
2、Redis在存储小数据时比Memcached性能更高;而在100k以上的数据中,Memcached性能要高于Redis
3、简单的key-value存储,Memcached的内存利用率更高。而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached
4、如果对数据持久化和数据同步有所要求,那么Redis性能高于Memcached
5、Redis相比Memcached来说,拥有更多的数据结构,并支持更丰富的数据操作
6、在Redis中,复杂的操作通常和一般的GET/SET一样高效。需要缓存能够支持更复杂的结构和操作,所以Redis 在这方面的性能要更高
memcached和MySQL的query cache:
1、当修改表时,MySQL的query cache会立刻被刷新(flush)。存储一个memcached 数据只需要很少的时间,但是当写操作很频繁时,MySQL的query cache会经常让所有缓存数据都失效
2、在多核CPU上,MySQL的query cache会遇到扩展问题,同时query cache会增加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢
3、MySQL的query cache中,是不能存储任意的数据的,只能是SQL查询结果。而利用memcached,我们可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到memcached中。而query cache是SQL语句级别的,不可能做到这一点。在小的网站中,query cache会有所帮助,但随着网站规模的增加,query cache的弊将大于利。
4、query cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了memcached,只要有空闲的内存,都可以用来增加memcached集群的规模,然后就可以缓存更多的数据。
redis相比memcached有哪些优势
1) memcached所有的值均是简单的字符串,Redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据
适用memcached的业务场景
1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么memcached可以显著地减小数据库负载。
2)如果数据库服务器的负载比较低但CPU使用率很高,这时可以缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)。
3)利用memcached可以缓存 session数据 、临时数据以减少对他们的数据库写操作。
4)缓存一些很小但是被频繁访问的文件。
mongdb有哪些使用的场景
1网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
3大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
4高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
5用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。
redis的应用场景
缓存——热数据
计数器
消息队列
位操作(大数据处理)
分布式锁与单线程机制
最新列表
排行榜
秒杀
具体: https://www.cnblogs.com/NiceCui/p/7794659.html
mysql连接池
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
数据库连接池的机制:
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
Apache与ngin服务器区别
nginx相对apache的优点
轻量级,同样起web 服务,比apache 占用更少的内存及资源;
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单;
社区活跃,各种高性能模块出品迅速;
apache相对nginx的优点
rewrite ,比nginx 的rewrite 强大;
模块超多,基本想到的都可以找到;
少bug ,nginx 的bug 相对较多;
超稳定;
抽象类和接口联系与区别
从语法层面而言,接口和抽象类的区别
1.抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法(默认 public abstract)
2.抽象类中的成员变量可以是多种类型,而接口中的成员变量必须用public static final(常量)修饰
3.一个类只能继承一个抽象类(单继承),但可以实现多个接口(多继承)。
4.抽象类中允许含有静态代码块和静态方法,而接口类不能
从设计层面而言,接口和抽象类的区别
1.抽象类是对整一个类的属性,行为等方面进行抽象,而接口则是对行为抽象。。
2.抽象类是一个模板式的设计,当在开发过程中出现需求更改的情况,只需要更改抽象类而不需要更改它的子类。接口是一种辐射性设计,当接口的内容发生改变时,需要同时对实现它的子类进行相应的修改。
3.抽象类可以类比为模板,而接口可以类比为协议
线程与进程
进程:进程是指某个应用在处理机上的一次执行过程,是一个动态的概念,是一个活动的实体。
线程:线程是进程的一部分,一个进程包含多个线程在运行。
进程和线程都是一个时间段的描述,是CPU工作时间段的描述
定义方面: 进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径
角色方面: 在支持线程机制的系统中,进程是系统资源分配的单位,线程是系统调度的单位
资源共享方面:进程之间不能有共享资源,二线程共享所在进程的地址空间和其他资源,同时线程还有自己的栈和栈指针,程序计算器等寄存器
独立性方面: 进程有己自?独立的地址空间,而线程必须依赖进程而存在
索引覆盖
指如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回到磁盘在找数据,这样查询速度非常快,称为索引覆盖
PHP新特性
语言/断言 : 代码得不到预计结果则抛出异常
批量导出成员
标量类型的声明
返回类的限定
null合并运算符
太空船运算符
closure::call()方法 临时绑定到对象上
可为空的类型
新增void()函数
新增list支持键名
新增object类型