阅读量: 9
trait的出现就是一种解决需要多继承场景的方式。 使用场景是如果多个类都要用到同样的属性或者方法,这个时候使用Traits可以方便的给类增加这些属性或方法,而不用每个类都去继承一个类,如果说继承类是竖向扩展一个类,那么Traits是横向扩展一个类,从而实现代码复用。
四种标量类型:boolean(布尔型)、integer(整型)、float(浮点型,也称作double)、string(字符串)
两种复合类型:array(数组)、object(对象)
两种特殊类型:resource(资源)、NULL(NULL)
<?php
function read_all($dir){
if(!is_dir($dir)) return false;
$handle = opendir($dir);
if($handle){
while(($fl = readdir($handle)) !== false){
$temp = $dir.$fl;
//$fl !='.' && $fl != '..' 排除当前目录及父级目录
if(is_dir($temp) && $fl!='.' && $fl != '..'){
echo '目录:'.$temp.'<br>';
read_all($temp);
}else{
if($fl !='.' && $fl != '..'){
echo '文件:'.$temp.'<br>';
}
}
}
}
}
read_all("./dir/");
?>
文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)
Smarty优点
1. 速度快:相对其他模板引擎。
2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件
3 缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页
4. 插件技术:smarty可以自定义插件。
不适合使用smarty的地方
1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新 2.小项目。小项目因为项目简单而美工与程序员兼于一人的项目
一:在php.ini中设置
session.gc_maxlifetime = 1440 //默认时间
二:代码实现
$lifeTime = 24 * 3600; //保存一天
session_set_cookie_params($lifeTime);
在session_start();
双引号解释变量,单引号不解释变量
双引号里插入单引号,其中单引号里如果有变量的话,变量解释
双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
双引号解释转义字符,单引号不解释转义字符,但是解释’\和\\
能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)
第三方登陆主要是基于Oauth协议来实现,下面简单说下实现流程:
1、首先我们需要以开发者的身份向第三方登陆平台申请接入应用,申请成功后,我们会获得一个appID和一个secrectID.
2、当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,此时把之前申请的appID和secrectID带给登陆授权页面。
3、用户登陆成功后即得到授权,第三方会返回一个临时的code给我们的网站。
4、我们的网站接受到code后,再次向我们的第三方发起请求,并携带接收的code,从第三方获取access_token.
5、第三方处理请求后,会返回一个access_token给我们的网站,我们的网站获取到access_token后就可以调用第三方提供的接口了,比如获取用户信息等。最后把该用户信息存入到我们站点的数据库,并把信息保存到session中,实现用户的第三方登陆。
php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。
进程
计算机中已执行程序的实体。比如,一个启动了的php-fpm,就是一个进程。
线程
操作系统能够进行运算调度的最小单元。它被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。比如,mysql运行时,mysql启动后,该mysql服务就是一个进程,而mysql的连接、查询的操作,就是线程。
进程与线程的区别
资源(如打开文件):进程间的资源相互独立,同一进程的各线程间共享资源。某进程的线程在其他进程不可见。
通信:
进程间通信:消息传递、同步、共享内存、远程过程调用、管道。
线程间通信:直接读写进程数据段(需要进程同步和互斥手段的辅助,以保证数据的一致性)。
调度和切换:线程上下文切换比进程上下文切换要快得多。
线程,是操作系统最小的执行单元,在单线程程序中,任务一个一个地做,必须做完一个任务后,才会去做另一个任务。
$_GET ——>get传送方式
$_POST —–>post传送方式
$_REQUEST –>可以接收到get和post两种方式的值
$GLOBALS —>所有的变量都放在里面
$_FILE —–>上传文件使用
$_SERVER —>系统环境变量
$_SESSION –>会话控制的时候会用到
$_COOKIE —>会话控制的时候会用到
1、SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止:
使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量
参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。
2、XSS攻击:跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。
3、CSRF:跨站点请求伪造,是指一个页面发出的请求,看起来就像是网站的信任用户,但是是伪造的
防止:一般来说,确保用户来自你的表单,并且匹配每一个你发送出去的表单。有两点一定要记住:
对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。
生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。 如laravel中的 _token
4、代码注入:代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名。
防止:
过滤用户输入
在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件
1、静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。
实现方式主要有两种:
一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。
一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。
2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机制。
主要有两种方式:
一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。
另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,是一种对网站的恶意攻击。
目前防御 CSRF 攻击主要有三种策略:
(1)验证HTTP Referer 字段
(2)在请求地址中添加 token并验证
(3)在HTTP头中自定义属性并验证
用例子说明,以 Laravel 框架中的控制器作为说明
①final修饰的类方法不可被子类重写;
②PHP是否重写父类方法只会根据方法名是否一致判断(5.3以后重写父类方法参数个数必须一致);
③重写时访问级别只可以等于或者宽松于父类,不可提升访问级别。
IoC(Inversion of Control)译为 「控制反转」,也被叫做「依赖注入」(DI)。什么是「控制反转」?对象 A 功能依赖于对象 B,但是控制权由对象 A 来控制,控制权被颠倒,所以叫做「控制反转」,而「依赖注入」是实现 IoC 的方法,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。
其作用简单来讲就是利用依赖关系注入的方式,把复杂的应用程序分解为互相合作的对象,从而降低解决问题的复杂度,实现应用程序代码的低耦合、高扩展。
Laravel 中的服务容器是用于管理类的依赖和执行依赖注入的工具。
<?php
//冒泡排序
function maopao_sort($a){
$count = count($a);
if($count <= 0) return false;
for($i=0;$i<$count;$i++){
for($j=0;$j<$count-$i-1;$j++){
if($a[$j] > $a[$j+1]){
$num = $a[$j];
$a[$j] = $a[$j+1];
$a[$j+1] = $num;
}
}
}
return $a;
}
//快速排序(数组排序)
function kuaisu_sort($a){
$count = count($a);
if($count <= 1) return $a;//此处不能返回false
$k = $a[0];
$left_a = array();
$right_a = array();
for($i=1;$i<$count;$i++){
if($a[$i] <= $k){
$left_a[] = $a[$i];
}else{
$right_a[] = $a[$i];
}
}
$left_a = kuaisu_sort($left_a);
$right_a = kuaisu_sort($right_a);
return array_merge($left_a,array($k),$right_a);
}
$a = array(21,3,4,55,42,15,23,67);
print_r(maopao_sort($a));
echo "<br/>";
print_r(kuaisu_sort($a));
?>
抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:
1、高并发对数据库产生的压力
2、竞争状态下如何解决库存的正确减少(”超卖”问题)
对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。第二个问题,我们可以使用redis队列来完成,把要秒杀的商品放入到队列中,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,文件锁和事务在高并发下性能下降很快,当然还要考虑其他方面的东西,比如抢购页面做成静态的,通过ajax调用接口,其中也可能会出现一个用户抢多次的情况,这时候需要再加上一个排队队列和抢购结果队列及库存队列。高并发情况下,将用户进入排队队列,用一个线程循环处理从排队队列取出一个用户,判断用户是否已在抢购结果队列,如果在,则已抢购,否则未抢购,库存减1,写数据库,将用户入结果队列。
1. 按照目的分,目前常见的设计模式主要有23种,根据使用目标的不同可以分为以下三大类:
(1)创建设计模式(Creational Patterns)(5种):用于创建对象时的设计模式。更具体一点,初始化对象流程的设计模式。当程序日益复杂时,需要更加灵活地创建对象,同时减少创建时的依赖。而创建设计模式就是解决此问题的一类设计模式。
单例模式【Singleton】
工厂模式【Factory】
抽象工厂模式【AbstractFactory】
建造者模式【Builder】
原型模式【Prototype】
(2)结构设计模式(Structural Patterns)(7种):用于继承和接口时的设计模式。结构设计模式用于新类的函数方法设计,减少不必要的类定义,减少代码的冗余。
适配器模式【Adapter】
桥接模式【Bridge】
合成模式【Composite】
装饰器模式【Decorator】
门面模式【Facade】
代理模式【Proxy】
享元模式【Flyweight】
(3)行为模式(Behavioral Patterns)(11种):用于方法实现以及对应算法的设计模式,同时也是最复杂的设计模式。行为设计模式不仅仅用于定义类的函数行为,同时也用于不同类之间的协议、通信。
策略模式【Strategy】
模板方法模式【TemplateMethod】
观察者模式【Observer】
迭代器模式【Iterator】
责任链模式【ResponsibilityChain】
命令模式【Command】
备忘录模式【Memento】
状态模式【State】
访问者模式【Visitor】
中介者模式【Mediator】
解释器模式【Interpreter】
2.按照范围分为:类的设计模式,以及对象设计模式
(1)类的设计模式(Class patterns):用于类的具体实现的设计模式。包含了如何设计和定义类,以及父类和子类的设计模式。
(2)对象设计模式(Object patterns): 用于对象的设计模式。与类的设计模式不同,对象设计模式主要用于运行期对象的状态改变、动态行为变更等。
A、PHP脚本的执行效率
a、代码脚本里计时;
b、xdebug统计函数执行次数和具体时间进行分析,最好使用工具winCacheGrind分析;
c、在线系统用strace跟踪相关进程的具体系统调用。
B、数据库SQL的效率
a、sql的explain(mysql),启用slow query log记录慢查询;
b、通常还要看数据库设计是否合理,需求是否合理等。
在php的配置文件(php.ini)中有一个short_open_tag的值,开启以后可以使用PHP的段标签:(<? ?>)。
同时,只有开启这个才可以使用<?=以代替<? echo。
但是这个短标签是不推荐的,使用<?php ?>才是规范的方法。只是因为这种短标签使用的时间比较长,这种特性才被保存了下来。
$pattern = '/<script.*>\.+<\/script>/';
preg_replace($pattern,'',$str);
list()是一个语法结构。List(array)是用来快速把数组中的元素赋给一些变量。使用时要注意,array必须为一个索引数组,并且索引值从0开始。
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假;
empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。
MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示。
优点是:
①可以实现代码的重用性,避免产生代码冗余;
②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递。PHP中处理json格式的函数为json_decode( string json [, bool assoc ] ) ,接受一个 JSON格式的字符串并且把它转换为PHP变量,参数json待解码的json string格式的字符串。assoc当该参数为TRUE时,将返回array而非object;Json_encode:将PHP变量转换成json格式。
200 : 请求成功,请求的数据随之返回。 301 : 永久性重定向。 302 : 暂时性重定向。 401 : 当前请求需要用户验证。 403 : 服务器拒绝执行请求,即没有权限。 404 : 请求失败,请求的数据在服务器上未发现。 500 : 服务器错误。一般服务器端程序执行错误。 503 : 服务器临时维护或过载。这个状态时临时性的。
Get与post两种方式 区别: (1)url可见性:get 方式url参数可见,post 不可见
(2)可缓存性:get 方式是可以缓存的,post 方式不可以缓存。
(3)传输数据大小:get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post 请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
(4)数据传输上:get 方式通过url地址栏拼接参数进行传输,post 方式通过body体进行传输。
建议: 1、get式安全性较Post式要差些包含机密信息建议用Post数据提交式; 2、做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式; 百度使用的get方式,因为可以从它的URL中看出
mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller),也就是控制器,负责业务逻辑;客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,再将获取到的数据通过视图显示出来。
(1) 确认服务器是否能支撑当前访问量。
(2) 优化数据库访问。
(3)禁止外部访问链接(盗链), 比如图片盗链。
(4)控制文件下载。
(5)做负载均衡,使用不同主机分流。
(6)使用浏览统计软件,了解访问量,有针对性的进行优化。
1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作
2.融合了smarty模板,使前后台分离
3.支持多种缓存技术,尤其对memcache技术支持非常好
4.命名规范,模型,视图,控制器严格遵循命名规则,通过命名一一对应
5.支持多种url模式
6.内置ajax返回方法,包括xml,json,html等
7.支持应用扩展,类库扩展,驱动扩展等
1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
3、数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
class Singleton{
//存放实例
private static $_instance = null;
//私有化构造方法、
private function __construct(){
echo "单例模式的实例被构造了";
}
//私有化克隆方法
private function __clone(){
}
//公有化获取实例方法
public static function getInstance(){
if (!(self::$_instance instanceof Singleton)){
self::$_instance = new Singleton();
}
return self::$_instance;
}
}
$singleton=Singleton::getInstance();
1、使用缓存
2、优化数据库,提升数据库使用效率
3、负载均衡
①array()创建数组;
②count()返回数组中元素的数目;
③array_push()将一个或多个元素插入数组的末尾(入栈);
④array_column()返回输入数组中某个单一列的值;
⑤array_combine()通过合并两个数组来创建一个新数组;
⑥array_reverse()以相反的顺序返回数组;
⑦array_unique()删除数组中的重复值;
⑧in_array()检查数组中是否存在指定的值;
缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
设置 PHP 的报错级别并返回当前级别。
在计算机中,常用编码有 ASCLL、 Unicode 等。假如我们要比较:”happen” 和 “happy” 哪个串比较大的话,那么就会先将每个串的字符拿出来进行比较,其中 h、a、p、p 这几个字符都是相等的,就看 e 和 y 字符了,由于 e 字符的 ASCLL 码是 101,而 y 字符的 ASCLL 码则是 121,于是 “happen” < “happy”。
使用redis队列来实现。将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖。这个操作起来很方便,而且效率极高。
1 讲解:count(var)是用来统计数组或对象的元素个数的。当var是null或者空数组时,结果为0。如果var是普通变量,则返回1。正常情况下返回var中的元素或属性个数。
设置PHP的报错级别并返回当前级别。
require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行。
include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去。
1.强大的rest router:用简单的回调函数就可以调用,快速绑定controller和router
2.artisan:命令行工具,很多手动的工作都自动化
3.可继承的模板,简化view的开发和管理
4.blade模板:渲染速度更快
5.ORM操作数据库
6.migration:管理数据库和版本控制
7.测试功能也很强大
8.composer也是亮点
(1)开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
(2)里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。
(3)依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
(4)单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
(5)接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
(6)迪米特法则:一个对象应该对其他对象保持最少的了解。
HTTP定义了与服务器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post、get、put、delegate就是对这个资源进行增、删、改、查的操作!
(1)打开文件 fopen()
(2)读取文件 fgets() ; 注:file_get_contents()也是读取文件
(3)写入文件fwrite() ; 注:file_put_contents()同样可以写入文件
(4)关闭文件句柄 fclose()
(5)移动 / 重命名文件 rename()
(6)复制文件 copy()
(7)创建文件 vim 或 touch
(8)删除文件 unlink()
(9)获取文件上次访问的时间 fileatime()
(10)获取文件上次修改的时间 filemtime()
(11)获取文件大小 filesize()
(12)获取文件类型 filetype()
(13)获取文件详细信息 state()
(14)判断是否是目录 is_dir()
第一种方式:先进入php安装目录,执行 php 路径/文件名.php。
例:php my_script.php
php -f “my_script.php”
第二种方式:php -r “php脚本”;(不需要加php的开始符和结束符)。
例:php -r “print_r(get_defined_constants());”
向php脚本传递参数:
第一种方式:php -r “var_dump($argv);” — -h (注意:如果要传递的参数开头为-,那么得使用参数列表分隔符 — 才能正确传参。)
第二种方式:test.php文件代码:#!/usr/bin/php <?phpvar_dump($argv);?>
./test.php -h — foo(在php文件开头加入#!/usr/bin/php,即可直接传递以-为开头得参数)
U:对url的组装
A:内部实例化控制器
S:缓存处理
R:调用某个控制器的操作方法
D:实例化自定义模型类
M:实例化基础模型类
I:获取参数
L:设置或者获取当前语言
C:设置或获取,保存配置
当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会被调用。
抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract来声明的。
抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。
抽象方法的格式为:abstract function abstractMethod();
接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。
抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。
子类继承抽象类使用 extends,子类实现接口使用implements。
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。
oop是面向对象编程,面向对象编程是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
1、封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只 需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。
2、继承性:就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP只支持单继承,也就是说一个子类只能有一个父类。
3、多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。
1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
最基本类型有以下三种:
1、数字(整型、浮点数、定点数);
2、字符和字符串;
3、布尔类型。
还有其他数据类型:
一、对象;
二、null;
三、数组。
注意,复合数据类型对象的数据结构可以被解构为原始数据类型。
1、trim()移除字符串两侧的空白字符和其他字符;
2、substr_replace()把字符串的一部分替换为另一个字符串;
3、substr_count()计算子串在字符串中出现的次数;
4、substr()返回字符串的一部分;
5、strtolower()把字符串转换为小写字母;
6、strtoupper()把字符串转换为大写字母;
7、strtr()转换字符串中特定的字符;
8、strrchr()查找字符串在另一个字符串中最后一次出现;
9、strstr()查找字符串在另一字符串中的第一次出现(对大小写敏感);
10、strrev()反转字符串;
11、strlen()返回字符串的长度;
12、str_replace()替换字符串中的一些字符(对大小写敏感);
13、print()输出一个或多个字符串;
14、explode()把字符串打散为数组;
15、is_string()检测变量是否是字符串;
16、strip_tags()从一个字符串中去除HTML标签;
17、mb_substr()用来截中文与英文的函数
echo可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。echo是php的内部指令,不是函数,无返回值。
print():函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。只能打印出简单类型变量的值(如int,string),有返回值
printf():源于C语言中的printf()。该函数输出格式化的字符串。
print_r()和var_dump()
print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。但print_r()输出布尔值和NULL的结果没有意义,因为都是打印”\n”。因此用var_dump()函数更适合调试。print_r是函数,可以打印出比较复杂的变量(如数组,对象),有返回值。
var_dump()判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
php也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)。
对象默认是传引用。
对于较大是的数据,传引用比较好,这样可以节省内存的开销。
HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;
如果不想所有的错误都用 try / catch 处理,还可以使用set_exception_handler注册异常处理函数,这样当有未被catch的异常产生时,系统会为我们自动调用注册的处理函数来处理。
(1)优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询。
(2)数据表中创建索引。
(3)对程序中经常用到的数据生成缓存(比如使用redis缓存数据,比如使用ob进行动态页面静态化等等)。
(4)对mysql做主从复制,读写分离。(提高mysq执行效率和查询速度)
(5)使用nginx做负载均衡。(将访问压力平均分配到多态服务器)
Safe_mode是php的安全模式。开启之后,主要会对系统操作、文件、权限设置等方法产生影响,主要用来应对webshell。以下是受到影响的一些函数:ckdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,highlight_file,show_source,include,symlink,link,touch,mkdir,unlink,exec,shell_exec,pasathru,system,popen需要注意的是:在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。
PHP与MYSQL数据库是最优搭配,当然PHP也可以去其它的数据库搭配使用,例如PostgreSql,SqlServer,Oracle,SqlLite等。
①单引号内部的变量不会执行, 双引号会执行
②单引号解析速度比双引号快。
③单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。
POSIX风格:匹配正则表达式ereg和替换ereg_replace。
Prel风格:匹配正则表达式preg_match和替换preg_replace。
Preg_match比ereg的执行效率更快,preg_replace比ereg_replace的执行效率更快。
laravel框架的设计思想比较先进,非常适合应用各种开发模式,作为一个框架,它为你准备好了一切,composer是php的未来,没有composer,php肯定要走向没落;
laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖注入等。
CGI,通用网关接口,用于WEB服务器和应用程序间的交互,定义输入输出规范,用户的请求通过WEB服务器转发给FastCGI进程,FastCGI进程再调用应用程序进行处理,如php解析器,应用程序的处理结果如html返回给FastCGI,FastCGI返回给Nginx 进行输出。假设这里WEB服务器是Nginx,应用程序是 PHP,而 php-fpm 是管理 FastCGI 的,这也就是 php-fpm,FastCGI,和 Nginx 之间的关系。
FastCGI 用来提高 cgi 程序性能,启动一个master,再启动多个 worker,不需要每次解析 php.ini. 而 php-fpm 实现了 FastCGI 协议,是 FastCGI 的进程管理器,支持平滑重启,可以启动的时候预先生成多个进程。
①防远程提交;
②防SQL注入,对特殊代码进行过滤;
③防止注册机灌水,使用验证码;
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:
按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
(1)打开目录 opendir()
(2)读取目录 readdir()
(3)删除目录 rmdir()
(4)关闭目录句柄 closedir()
(5)创建目录 mkdir()
(6)返回路径中的目录部分 dirname()
(7)取得当前工作目录 getcwd()
(8)列出指定路径中的文件和目录 scandir()
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。
讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。
CSRF防范:
1.合理规范api请求方式,GET,POST
2.对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。
XSS,跨站脚本攻击。
防范:不相信任何输入,过滤输入。
1.file_get_contents
2.readfile读取内容
3.fopen系列函数
4.curl
XSS攻击原理
XSS原称为CSS(Cross-Site Scripting),因为和层叠样式表(Cascading Style Sheets)重名,所以改称为XSS(X一般有未知的含义,还有扩展的含义)。XSS攻击涉及到三方:攻击者,用户,web server。用户是通过浏览器来访问web server上的网页,XSS攻击就是攻击者通过各种办法,在用户访问的网页中插入自己的脚本,让其在用户访问网页时在其浏览器中进行执行。攻击者通过插入的脚本的执行,来获得用户的信息,比如cookie,发送到攻击者自己的网站(跨站了)。所以称为跨站脚本攻击。XSS可以分为反射型XSS和持久性XSS,还有DOM Based XSS。(一句话,XSS就是在用户的浏览器中执行攻击者自己定制的脚本。)
XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。
也就是对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的XSS攻击。
1.改成纯前端渲染,把代码和数据分隔开;
2.对 HTML 做充分转义;
3.白名单和黑名单结合;
4.XSS 一般利用js脚步读取用户浏览器中的cookie,而如果在服务器端对 cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie。
1、__construct() :实例化对象时自动调用。
2、__destruct() :销毁对象或脚本执行结束时自动调用。
3、__call() :调用对象不存在的方法时执行此函数。
4、__get() :获取对象不存在的属性时执行此函数。
5、__set() :设置对象不存在的属性时执行此函数。
6、__isset() : 检测对象的某个属性是否存在时执行此函数。
7、__unset() :销毁对象的某个属性时执行此函数。
8、__toString() :将对象当作字符串输出时执行此函数。
9、__clone() :克隆对象时执行此函数。
10、__autoload() :实例化对象时,当类不存在时,执行此函数自动加载类。
11、__sleep() :serialize之前被调用,可以指定要序列化的对象属性。
12、__wakeup :unserialize之前被调用,可以执行对象的初始化工作。
13、__set_state() :调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
14、__invoke() :将对象当作函数来使用时执行此方法,通常不推荐这样做。
服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器、注册服务容器绑定、事件监听、中间件、路由注册以及我们的应用程序都是由服务提供者引导启动的。
$_GET —–>get传送方式
$_POST —–>post传送方式
$_REQUEST —–>可以接收到get和post两种方式的值
$GLOBALS —–>所有的变量都放在里面
$_FILE —–>上传文件使用
$_SERVER —–>系统环境变量
$_SESSION —–>会话控制的时候会用到
$_COOKIE —–>会话控制的时候会用到
如果是PHP和HTML混编时,一定要有结束符号?>,否则有可能导致语法错误。
如果是一个纯粹的PHP页面,最后的结束符?>最好一定不要添加
主要防止 include,require 引用文件,把文件末尾可能的回车和空格等字符引用进来,还有一些函数必须在没有任何输出之前调用,就会造成不是期望的结果。PHP文件的编码不包含BOM的UTF8. 这也是PSR-2中的规范:纯PHP代码文件必须省略最后的 ?> 结束标签。
这样做的好处是:如果这个是一个被别人包含的程序,没有这个结束符,可以减少很多很多问题,比如说:header,setcookie, session_start这些动作之前不能有输出,如果不小心在?>后边加了不可见字符(多余的空格、换行符)等破坏页面显示,就会报”Header already sent”错误,不写的话不会有此问题。
date_default_timezone_get()返回默认时区。
date_default_timezone_set()设置默认时区。
date()格式化本地时间/日期。
getdate()返回日期/时间信息。
gettimeofday()返回当前时间信息。
microtime()返回当前时间的微秒数。
mktime()返回一个日期的 Unix时间戳。
strtotime()将任何英文文本的日期或时间描述解析为 Unix时间戳。
time()返回当前时间的 Unix时间戳。
unix socket和TCP
TCP使用的是 127.0.0.1:9000端口,将fastcgi_pass参数修改为127.0.0.1:9000
unix socket 使用套接字 /dev/shm/php-cgi.sock,两个进程引用同一个socket描述符文件就可以建立通道进行通信了,fastcgi_pass unix:/dev/shm/fpm-cgi.sock;
unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源,unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,多少可以保证通信的正确性和完整性。
Facades(一种设计模式,通常翻译为外观模式)提供了一个”static”(静态)接口去访问注册到 IoC 容器中的类。提供了简单、易记的语法,而无需记住必须手动注入或配置的长长的类名。此外,由于对 PHP 动态方法的独特用法,也使测试起来非常容易。
按值传递:函数范围内对值的任何改变在函数外部都会被忽略;
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改;
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
static 是静态变量,在局部函数中存在且只初始化一次,使用过后再次使用会使用上次执行的结果; 作为计数,程序内部缓存,单例模式中都有用到。
global 关键字,引用全局变量,wordpress中大量用到,如面向过程开发。
static 静态方法,是类的成员方法,但不需要实例化类可直接使用
GLOBAL 在函数内使用具有全局作用域的变量,如GLOBAL[‘a’]
Singleton(单例模式):单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。
1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
4.应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
9. HttpApplication也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例。
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
Contract(契约)是 laravel 定义框架提供的核心服务的接口。Contract 和 Facades 并没有本质意义上的区别,其作用就是使接口低耦合、更简单。
1、cookie数据存放在第三方应用的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE,进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。
HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
1.static模式
static模式始终会保持一个固定数量的子进程,这个数量由pm.max_children定义。
2.dynamic模式
子进程的数量是动态变化的,启动时,会生成固定数量的子进程,可以理解成最小子进程数,通过pm.start_servers控制,而最大子进程数则由pm.max_children控制,子进程数会在pm.start_servers~pm.max_children范围内波动,另外,闲置的子进程数还可以由pm.min_spare_servers和pm.max_spare_servers两个配置参数控制。换句话说,闲置的子进程也可以由最小数目和最大数目,而如果闲置的子进程超过pm.max_spare_servers,则会被杀掉。
3.ondemand模式
这种模式和dynamic模式相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉。有了这个模式,到了服务器低峰期,内存自然会降下来,如果服务器长时间没有请求,就只有一个主进程,当然其弊端是,遇到高峰期或者pm.process_idle_timeout设置太小,无法避免服务器频繁创建进程的问题。
sort() 函数用于对数组单元从低到高进行排序。 rsort() 函数用于对数组单元从高到低进行排序。 asort() 函数用于对数组单元从低到高进行排序并保持索引关系。 arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。 ksort() 函数用于对数组单元按照键名从低到高进行排序。 krsort() 函数用于对数组单元按照键名从高到低进行排序。
使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。
这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后
就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。
使用自动载入的魔术函数可以不必要写很多个include或者require函数。
修改server配置项如worker_num、监听端口必须要重启Server。如果只改onReceive回调中的代码,可以使用reload实现热加载。
CI非常轻量级,是一个简单的MVC框架,性能也很快。
ThinkPHP3.2国内使用比较多,优点是文档非常多,各种问题解决方案比较多,缺点是代码不够规范,理念落后。
Laravel 是一个现代化的PHP开发框架,代码优雅,使用 composer 方式扩展功能,社区活跃,缺点是比较重,比较适合做后台管理或者应用型WEB系统。
Composer 是 PHP 的一个依赖管理工具。工作原理就是将已开发好的扩展包从 packagist.org composer 仓库下载到我们的应用程序中,并声明依赖关系和版本控制。
PHP的运行环境最优搭配为Apache/Nignx+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台