分类 知识 下的文章

接口的使用

要过年啦,趁着不忙买书学习.

以前学习的面向对象中对于接口,了解的不是很明白.尤其是怎么利用好他.

在看了一些书籍后,做下笔记.

接口是两个PHP对象之间的契约,目的不是让一个对象依赖另一个对象的身份,而是依赖其能力.如果我们的代码要处理指定类的对象,那就限定了,因为只能使用那个类的对象.(这等于写死了一样).代码处理的是接口,那代码就能知道如何处理实现这一接口的任何对象.

概括:多种不同方法完成结果,利用接口实现不同的类来调用处理.

相反情况,不同类中相同的方法,可以使用性状(trait)来解决.

TCP/IP协议

TCP/IP模型是一系列网络协议的总称,这些协议的目的,就是使计算机之间可以进行信息交换。
所谓”协议”可以理解成机器之间交谈的语言,每一种协议都有自己的目的。TCP/IP模型一共包括几百种协议,对互联网上交换信息的各个方面都做了规定。

最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。
IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。
IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。
TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。


以太网数据包(packet)的大小是固定的,最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)。
IP 数据包在以太网数据包的负载里面,它也有自己的头信息,最少需要20字节,所以 IP 数据包的负载最多为1480字节。

曼哈顿Manhattan

spgPJ.jpg
曼哈顿Manhattan鸡尾酒据说是前英国首相丘吉尔发明的,这是曼哈顿鸡尾酒众多起源较出名的一种,这款鸡尾酒被称为男人的鸡尾酒,主要因为他口感强烈。曼哈顿在众多酒吧非常的受欢迎,又有“鸡尾酒皇后”的美称。

原料:黑麦威士忌45ml 、甜味美思酒 15ml 、安哥斯特拉苦精 少许、红樱桃1颗、冰块4~6块

  1. 将冰块放入调酒壶中
  2. 将黑麦威士忌、甜味美思酒 、安哥斯特拉苦精倒入调酒壶,摇晃均匀
  3. 将鸡尾酒倒入酒杯中,放入一颗红樱桃装饰

 

金菲士gin fizz

spf3Y.jpg
金菲士gin fizz鸡尾酒又叫非斯杜松子酒,起源于美国,是世界十大经典鸡尾酒之一。由于这款鸡尾酒加入了苏打水,会产生气泡,发出滋滋的声音,就好像在叫“菲士”“菲士”,因此而得名。

原料:金酒45ml 、 鲜柠檬汁20ml、 糖粉 2茶匙 、苏打水适量、冰块适量、柠檬片一片

  1. 将冰块、金酒、柠檬汁、糖粉倒入雪克壶
  2. 用力摇晃雪克壶,使原料充分摇匀
  3. 倒入酒杯中,用苏打水注满
  4. 柠檬片装饰

上面的配方是古典配方,现在流行的配方还要加入一个蛋黄,制法与上述步骤是一样的。如果把蛋黄换成蛋清这个鸡尾酒就叫做银菲士,如果加入整个鸡蛋就叫做露西亚菲士。

新加坡司令Singapore sling

sjfJK.jpg
新加坡司令鸡尾酒是华裔男子严崇文在1915年于新加坡首次调制的,后期配方多次调整,最终配方是严崇文的侄子确定。

原料: 金酒45ml、樱桃白兰地 30ml、柠檬汁30ml、糖浆 1茶匙、苏打水、 冰块若干、柠檬皮条、樱桃

  1. 把金酒、柠檬汁、糖浆和冰块倒入雪克壶,摇晃均匀
  2. 把酒杯中放入适量冰块,把雪克壶中的鸡尾酒滤入酒杯中
  3. 用苏打水加入九分满
  4. 延杯边注入樱桃白兰地
  5. 用柠檬皮条及樱桃装饰

龙舌兰日出Tequila Sunrise

pQtqB.jpg至于它的风靡,怕是得归功于滚石乐队了,据说曾在每一次演出之后他们都会来上一杯,龙舌兰日出。

原料:银龙舌兰2盎司、橙汁1杯、石榴糖浆1盎司、樱桃1颗、橙片1片、冰块适量.       —调和法

  1. 在杯中放入适量冰块,倒入龙舌兰
  2. 用橙汁补到杯子2/3
  3. 将杯中原料搅拌均匀
  4. 沿着杯壁或者调酒勺缓缓倒入石榴糖浆,用樱桃和橙片装饰

 

玛格丽特Margarita

pQcrR.jpg

1926年洛杉矶调酒师简·杜雷萨和女友玛格丽特在一次打猎中女友不幸中流弹身亡。简·杜雷萨为了纪念爱人创作了玛格丽特鸡尾酒,并在1949年荣获了美国调酒师大赛冠军。 墨西哥的国酒是龙舌兰,表示他的墨西哥女友,青檬汁表示他酸楚的心,而盐表示了他的泪水。玛格丽特清澈中带有淡淡的模糊,这是回忆的颜色,憧憬而不可见。看似眼前却怎么也抓不住,或许只有失去了最爱的人才能体会到这种感觉。
原料:白龙舌兰3盎司、橙味力娇酒或君度1盎司、青檬汁2盎司、青檬片2片、粗盐少许、冰块4-6块.

  1. 将酒杯边缘贴近青檬片,转一周以湿边
  2. 把酒杯倒置在放了盐的小碟上转一周做雪花边
  3. 将冰块放入摇壶,然后依次倒入龙舌兰、君度、青檬汁用力摇晃均匀倒入酒杯中
  4. 在杯沿插上另一片青檬用来装饰,也可以放入杯中

也可以加入1盎司糖浆来增加甜味,如果把橙味力娇酒(君度)换成蓝橙力娇酒就叫做“蓝色玛格丽特”,把白色龙舌兰换成金色龙舌兰就叫“金色玛格丽特”。

pQrxr.jpg

PHP遇到$_FILES中error=6

今天在做编辑器上传图片时候发现上传失败,返回错误是未知.

然后看代码打印$_FILES下file下的error的值为6.
php的错误提示: unable to create a temporary file in Unknown on line 0
对应错误一看,去设置吧.
php.ini经设置 upload_tmp_dir =”D:/temp” 顺便看下目录的权限. 取消配置前面的;
重启php,再次测试 已经ok了.

顺便了解了其他错误:
$_FILES[‘file’][‘error’]
其值为 0,没有错误发生,文件上传成功。
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
其值为 3,文件只有部分被上传。
其值为 4,没有文件被上传。
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
其值为 7,文件写入失败。PHP 5.1.0 引进。

WD My Cloud降级3.0

最近NAS有点问题,容易中断。不知道哪里的问题,开始只是恢复出厂发现没什么用。

现在实在忍不了了,降级试试。降级前是4.04.xx

降级操作:

首先设置静态ip,开启SSH设置。

然后用终端连接,命令 echo "02.02.02-111" >/etc/version;

命令之后去控制台http://IP/UI/ 这里固件那里选择固件更新。文件为:sq-040000-607-20140630.deb

之后等待他更新重启,重启之后第一步就是恢复出厂。恢复完成按照上面设置进行设置。

接着用命令 echo "02.02.02-111" >/etc/version;

同样步骤去控制台更新固件 文件为:sq-030401-230-20140415.deb

好这次更新完重启之后,还是先恢复出厂设置。

重启之后按照正常使用就好啦。把之前文件夹权限改改,用户创建等等。

ok,完毕。

 

CGI、FastCGI和PHP-FPM关系

原文

在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM、FastCGI和CGI 这几个概念。如果对它们一知半解,很难搭建出高性能的服务器。接下来我们就以图形方式,解释这些概念之间的关系。

基础

在整个网站架构中,Web Server(如Apache)只是内容的分发者。举个栗子,如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。

如果请求的是 index.php,根据配置文件,Web Server知道这个不是静态文件,需要去找 PHP 解析器来处理,那么他会把这个请求简单处理,然后交给PHP解析器。

当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了,

  • CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
  • FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
  • PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
  • PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。

WEB 中,

  • Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,
  • Web Application 一般指PHP、Java、Asp.net等应用程序。

Module方式

在了解 CGI 之前,我们先了解一下Web server 传递数据的另外一种方法:PHP Module加载方式。以 Apache 为例,在PHP Module方式中,是不是在 Apache 的配置文件 httpd.conf 中加上这样几句:

 

上面是 Windows 下安装php和apache环境后手动配置,在linux下源码安装大致是这样配置的:

所以,这种方式,他们的共同本质都是用 LoadModule 来加载 php5_module,就是把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。

那么php5_module是怎么来将数据传给php解析器来解析php代码的呢?答案是通过sapi。

我们再来看一张图,详细的说说apache 与 php 与 sapi的关系:

mode_php

从上面图中,我们看出了sapi就是这样的一个中间过程,SAPI提供了一个和外部通信的接口,有点类似于socket,使得PHP可以和其他应用进行交互数据(apache,nginx等)。php默认提供了很多种SAPI,常见的提供给apache和nginx的php5_module、CGI、FastCGI,给IIS的ISAPI,以及Shell的CLI。

所以,以上的apache调用php执行的过程如下:

好了。apache与php通过php5_module的方式就搞清楚了吧!

这种模式将php模块安装到apache中,所以每一次apache结束请求,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作。

在上图中,我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。

而且,把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题。

CGI

CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与PHP应用进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。

WEB服务器会传哪些数据给PHP解析器呢?URL、查询字符串、POST数据、HTTP header都会有。所以,CGI就是规定要传哪些数据,以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中使用的用户从哪里来的。

也就是说,CGI就是专门用来和 web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(如php-cgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句,返回给web服服务器,WEB服务器再返回给客户端,这就是普通cgi的工作原理。

CGI的好处就是完全独立于任何服务器,仅仅是做为中间分子。提供接口给apache和php。他们通过cgi搭线来完成数据传递。这样做的好处了尽量减少2个的关联,使他们2变得更独立。

但是CGI有个蛋疼的地方,就是每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了。

FastCGI介绍

FastCGI简单介绍

从根本上来说,FastCGI是用来提高CGI程序性能的。类似于CGI,FastCGI也可以说是一种协议

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行,并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中,并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中,并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

FastCGI的工作原理

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

fastcgi

  1. Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可建多个php-cgi),并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  4. FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

FastCGI与CGI特点:

  1. 对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
  2. 由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

PHP-FPM介绍

要了解PHP-FPM,就得先说说PHP-CGI。

PHP-CGI就是PHP实现的自带的FastCGI管理器。 虽然是php官方出品,但是这丫的却一点也不给力,性能太差,而且也很麻烦不人性化,主要体现在:

  1. php-cgi变更php.ini配置后,需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
  2. 直接杀死php-cgi进程,php就不能运行了。

上面2个问题,一直让很多人病垢了很久,所以很多人一直还是在用 Module 方式。 直到 2004年一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM ,这神器的出现就彻底打破了这种局面,这是一个PHP专用的 fastcgi 管理器,它很爽的克服了上面2个问题,而且,还表现在其他方面更表现强劲。

也就是说,PHP-FPM 是对于 FastCGI 协议的具体实现,他负责管理一个进程池,来处理来自Web服务器的请求。目前,PHP5.3版本之后,PHP-FPM是内置于PHP的

因为PHP-CGI只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理。所以就出现了一些能够调度 php-cgi 进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。同样,PHP-FPM也是用于调度管理PHP解析器php-cgi的管理程序。

PHP-FPM通过生成新的子进程可以实现php.ini修改后的平滑重启。

总结

最后,我们来总结一下,这些技术经过不断的升级,可以解决什么问题(不然也不会升级嘛)。

所以,如果要搭建一个高性能的PHP WEB服务器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了,不要再使用 Module加载或者 CGI 方式啦:)

参考资料

  1. 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319
  2. php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231
  3. 请问CGI、PHP-CGI、PHP-FPM之间是什么关系?https://groups.google.com/forum/?fromgroups=#!topic/shlug/d5hJKyFzI-g
  4. FastCGI 进程管理器(FPM):http://php.net/manual/zh/install.fpm.php

 

人生的悲剧只有两种:一种是没有得到自己想要的东西,另一种是得到自己想要的东西。
                                —王尔德

标签

打赏