首页
统计
留言
Search
1
PHP中使用反射
996 阅读
2
phpstorm配置SFTP
940 阅读
3
Go语言——结构体
792 阅读
4
PhpStorm 使用 AI 代码生成工具 Codeium
782 阅读
5
关于PHP的垃圾回收机制
763 阅读
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
登录
Search
标签搜索
Laravel
Mysql
RPC
Redis
Liunx
PHP
CSS
ES
算法
开发工具
断点续传
反射
phpstorm
工具
防盗链
CURL
设计模式
面试
Nginx
搜索引擎
quhe.net
首页
栏目
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
页面
统计
留言
搜索到
57
篇与
quhe.net
的结果
2020-04-11
Golang中map、slice、chan 的初始化及使用
map// 1.先声明map var m1 map[string]string // 再使用make函数创建一个非nil的map,nil map不能赋值 m1 = make(map[string]string) // 最后给已声明的map赋值 m1["a"] = "aa" m1["b"] = "bb" // 2.直接创建 m2 := make(map[string]string) // 然后赋值 m2["a"] = "aa" m2["b"] = "bb" // 3.初始化 + 赋值一体化 m3 := map[string]string{ "a": "aa", "b": "bb", } // ========================================== // 查找键值是否存在 if v, ok := m1["a"]; ok { fmt.Println(v) } else { fmt.Println("Key Not Found") } // 遍历map for k, v := range m1 { fmt.Println(k, v) } slice// 1.直接创建 s1 = []int{1,2,3} // 2.基于已有的数组或切片 a:=[5]int{1,2,3,4,5} var s2 []int = a[1:4] //基于数组a创建一个切片,包含元素a[1] a[2] a[3] // 3.使用make来创建一个切片 s3 = make([]int,5,5)chan//开辟缓冲区为20的chan ch1:=make(chan int,20) //无缓冲区的chan ch2:=make(chan int) //只能向chan内写 ch3:=make( chan<-int,20) ch3 := make(chan<- int, 20) ch3 <- 10 ch3 <- 20 fmt.Println(len(ch3)) //只能从chan内读 ch4:=make(ch<-chan int,20)
2020年04月11日
20 阅读
0 评论
1 点赞
2020-04-07
PHP常用设计模式
设计模式六大原则开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象.依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。迪米特法则:一个对象应该对其他对象保持最少的了解。1.单例设计模式所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中!单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接。一个单例类应具备以下特点:单例类不能直接实例化创建,而是只能由类本身实例化。因此,要获得这样的限制效果,构造函数必须标记为private,从而防止类被实例化。需要一个私有静态成员变量来保存类实例和公开一个能访问到实例的公开静态方法。在PHP中,为了防止他人对单例类实例克隆,通常还为其提供一个空的私有__clone()方法。使用场景:只实例化一次,内部实例化,对外只有一个开放方法,只能通过调取该方法进行调取实例化对象。数据库连接单例模式的例子:<?php /** * Singleton of Database */ class Database { // We need a static private variable to store a Database instance. privatestatic $instance; // Mark as private to prevent it from being instanced. private function__construct() { // Do nothing. } private function__clone() { // Do nothing. } public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } } $a =Database::getInstance(); $b =Database::getInstance(); // true var_dump($a === $b); 2.工厂设计模式工厂模式是另一种非常常用的模式,正如其名字所示:确实是对象实例的生产工厂。某些意义上,工厂模式提供了通用的方法有助于我们去获取对象,而不需要关心其具体的内在的实现使用场景:使用方法 new实例化类,每次实例化只需调用工厂类中的方法实例化即可。我们举例子,假设矩形、圆都有同样的一个方法,那么我们用基类提供的API来创建实例时,通过传参数来自动创建对应的类的实例,他们都有获取周长和面积的功能。<?php interface InterfaceShape { function getArea(); function getCircumference(); } /** * 矩形 */ class Rectangle implements InterfaceShape { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } public function getArea() { return $this->width* $this->height; } public function getCircumference() { return 2 * $this->width + 2 * $this->height; } } /** * 圆形 */ class Circle implements InterfaceShape { private $radius; function __construct($radius) { $this->radius = $radius; } public function getArea() { return M_PI * pow($this->radius, 2); } public function getCircumference() { return 2 * M_PI * $this->radius; } } /** * 形状工厂类 */ class FactoryShape { public static function create() { switch (func_num_args()) { case1: return newCircle(func_get_arg(0)); case2: return newRectangle(func_get_arg(0), func_get_arg(1)); default: # code... break; } } } $rect =FactoryShape::create(5, 5); // object(Rectangle)#1 (2) { ["width":"Rectangle":private]=> int(5) ["height":"Rectangle":private]=> int(5) } var_dump($rect); echo "<br>"; // object(Circle)#2 (1) { ["radius":"Circle":private]=> int(4) } $circle =FactoryShape::create(4); var_dump($circle); 3.观察者设计模式观察者模式是挺常见的一种设计模式,使用得当会给程序带来非常大的便利,使用得不当,会给后来人一种难以维护的想法。什么是观察者模式?一个对象通过提供方法允许另一个对象即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦。看下面例子你就明白了使用场景:用户登录,需要写日志,送积分,参与活动 等 使用消息队列,把用户和日志,积分,活动之间解耦合<?php /* 观察者接口 */ interface InterfaceObserver { function onListen($sender, $args); function getObserverName(); } // 可被观察者接口 interface InterfaceObservable { function addObserver($observer); function removeObserver($observer_name); } // 观察者抽象类 abstract class Observer implements InterfaceObserver { protected $observer_name; function getObserverName() { return $this->observer_name; } function onListen($sender, $args) { } } // 可被观察类 abstract class Observable implements InterfaceObservable { protected $observers = array(); public function addObserver($observer) { if ($observerinstanceofInterfaceObserver) { $this->observers[] = $observer; } } public function removeObserver($observer_name) { foreach ($this->observersas $index => $observer) { if ($observer->getObserverName() === $observer_name) { array_splice($this->observers, $index, 1); return; } } } } // 模拟一个可以被观察的类 class A extends Observable { public function addListener($listener) { foreach ($this->observersas $observer) { $observer->onListen($this, $listener); } } } // 模拟一个观察者类 class B extends Observer { protected $observer_name = 'B'; public function onListen($sender, $args) { var_dump($sender); echo "<br>"; var_dump($args); echo "<br>"; } } // 模拟另外一个观察者类 class C extends Observer { protected $observer_name = 'C'; public function onListen($sender, $args) { var_dump($sender); echo "<br>"; var_dump($args); echo "<br>"; } } $a = new A(); // 注入观察者 $a->addObserver(new B()); $a->addObserver(new C()); // 可以看到观察到的信息 $a->addListener('D'); // 移除观察者 $a->removeObserver('B'); // 打印的信息: // object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } } // string(1) "D" // object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } } // string(1) "D" 4.适配器模式将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本的由于接口不兼容而不能一起工作的那些类可以一起工作。应用场景:老代码接口不适应新的接口需求,或者代码很多很乱不便于继续修改,或者使用第三方类库。例如:php连接数据库的方法:mysql,,mysqli,pdo,可以用适配器统一//老的代码 class User { private $name; function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } //新代码,开放平台标准接口 interface UserInterface { function getUserName(); } class UserInfo implements UserInterface { protected $user; function __construct($user) { $this->user = $user; } public function getUserName() { return $this->user->getName(); } } $olduser = new User('张三'); echo $olduser->getName()."n"; $newuser = new UserInfo($olduser); echo $newuser->getUserName()."n"; 5.策略模式将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告MaleUserStrategy.php<?php namespace IMooc; class MaleUserStrategy implements UserStrategy { function showAd() { echo "IPhone6"; } function showCategory() { echo "电子产品"; } } FemaleUserStrategy.php<?php namespace IMooc; class FemaleUserStrategy implements UserStrategy { function showAd() { echo "2017新款女装"; } function showCategory() { echo "女装"; } } UserStrategy.php<?php namespace IMooc; interface UserStrategy { function showAd(); function showCategory(); } <?php interface FlyBehavior{ public function fly(); } class FlyWithWings implements FlyBehavior{ public function fly(){ echo "Fly With Wings \n"; } } class FlyWithNo implements FlyBehavior{ public function fly(){ echo "Fly With No Wings \n"; } } class Duck{ private $_flyBehavior; public function performFly(){ $this->_flyBehavior->fly(); } public function setFlyBehavior(FlyBehavior $behavior){ $this->_flyBehavior = $behavior; } } class RubberDuck extends Duck{ } // Test Case $duck = new RubberDuck(); /* 想让鸭子用翅膀飞行 */ $duck->setFlyBehavior(new FlyWithWings()); $duck->performFly(); /* 想让鸭子不用翅膀飞行 */ $duck->setFlyBehavior(new FlyWithNo()); $duck->performFly();
2020年04月07日
753 阅读
0 评论
47 点赞
2020-04-04
2020 年 4 月 4 日全国哀悼,如何让你的网站变成灰色的呢?
本站首页换上灰色调,与国同哀。为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院今天发布公告,决定 2020 年 4 月 4 日举行全国性哀悼活动。在此期间,全国和驻外使领馆下半旗志哀,全国停止公共娱乐活动。4 月 4 日 10 时起,全国人民默哀 3 分钟,汽车、火车、舰船鸣笛,防空警报鸣响。如何实现呢:html { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); }
2020年04月04日
524 阅读
0 评论
29 点赞
2020-02-15
Nginx 的五大应用场景
一:HTTP服务器Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。1、 首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个test.html;2、 配置nginx.conf中的serveruser mengday staff; http { server { listen 80; server_name localhost; client_max_body_size 1024M; # 默认location location / { root /usr/local/var/www/html; index index.html index.htm; } } } 3、访问测试http://localhost/ 指向/usr/local/var/www/index.html, index.html是安装nginx自带的htmlhttp://localhost/test.html 指向/usr/local/var/www/html/test.html注意:如果访问图片出现403 Forbidden错误,可能是因为nginx.conf 的第一行user配置不对,默认是#user nobody;是注释的,linux下改成user root; macos下改成user 用户名 所在组; 然后重新加载配置文件或者重启,再试一下就可以了, 用户名可以通过who am i 命令来查看。4、指令简介server : 用于定义服务,http中可以有多个server块listen : 指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口server_name : 服务名称,用于配置域名location : 用于配置映射路径uri对应的配置,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码root : 根路径,当访问http://localhost/test.html,“/test.html”会匹配到"/"uri, 找到root为/usr/local/var/www/html,用户访问的资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.htmlindex : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html5、location uri正则表达式. :匹配除换行符以外的任意字符? :重复0次或1次+ :重复1次或更多次* :重复0次或更多次\d :匹配数字^ :匹配字符串的开始$ :匹配字符串的结束{n} :重复n次{n,} :重复n次或更多次[c] :匹配单个字符c[a-z] :匹配a-z小写字母的任意一个(a|b|c) : 属线表示匹配任意一种情况,每种情况使用竖线分隔,一般使用小括号括括住,匹配符合a字符 或是b字符 或是c字符的字符串\ 反斜杠:用于转义特殊字符小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。二: 静态服务器在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。1、在/usr/local/var/www 下分别创建images和img目录,分别在每个目录下放一张test.jpghttp { server { listen 80; server_name localhost; set $doc_root /usr/local/var/www; # 默认location location / { root /usr/local/var/www/html; index index.html index.htm; } location ^~ /images/ { root $doc_root; } location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ { root $doc_root/img; } } } 自定义变量使用set指令,语法 set 变 量 名 值 ; 引 用 使 用 变量名 值; 引用使用 变量名值;引用使用变量名; 这里自定义了doc_root变量。静态服务器location的映射一般有两种方式:使用路径,如 /images/ 一般图片都会放在某个图片目录下,使用后缀,如 .jpg、.png 等后缀匹配模式访问http://localhost/test.jpg 会映射到$doc_root/img访问http://localhost/images/test.jpg 当同一个路径满足多个location时,优先匹配优先级高的location,由于^~ 的优先级大于 ~, 所以会走/images/对应的location常见的location路径映射路径有以下几种:= 进行普通字符精确匹配。也就是完全匹配。^~ 前缀匹配。如果匹配成功,则不再匹配其他location。~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配,不区分大小写/xxx/ 常规字符串路径匹配/ 通用匹配,任何请求都会匹配到location优先级当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。以下是按优先级排列说明:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。^~类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。常规字符串匹配类型。按前缀匹配。/ 通用匹配,如果没有匹配到,就匹配通用的优先级搜索问题:不同类型的location映射决定是否继续向下搜索等号类型、^~类型:一旦匹配上就停止搜索了,不会再匹配其他location了正则表达式类型(~ ~*),常规字符串匹配类型/xxx/ : 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索location优先级从高到底:(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)location = / { # 精确匹配/,主机名后面不能带任何字符串 / [ configuration A ] } location / { # 匹配所有以 / 开头的请求。 # 但是如果有更长的同类型的表达式,则选择更长的表达式。 # 如果有正则表达式可以匹配,则优先匹配正则表达式。 [ configuration B ] } location /documents/ { # 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。 # 但是如果有更长的同类型的表达式,则选择更长的表达式。 # 如果有正则表达式可以匹配,则优先匹配正则表达式。 [ configuration C ] } location ^~ /images/ { # 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。 # 所以,即便有符合的正则表达式location,也不会被使用 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif jpg jpeg结尾的请求。 # 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级 [ configuration E ] } location /images/ { # 字符匹配到 /images/,还会继续往下搜索 [ configuration F ] } location = /test.htm { root /usr/local/var/www/htm; index index.htm; } 注意:location的优先级与location配置的位置无关 三: 反向代理反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。反向代理通过proxy_pass指令来实现。启动一个Java Web项目,端口号为8081server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8081; proxy_set_header Host $host:$server_port; # 设置用户ip地址 proxy_set_header X-Forwarded-For $remote_addr; # 当请求服务器出错去寻找其他服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; } } 当我们访问localhost的时候,就相当于访问 localhost:8081了四:负载均衡负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。负载均衡通过upstream指令来实现。1. RR(round robin :轮询 默认):每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上,如果只有两台服务器,第三次请求继续分配到第一台上,这样循环轮询下去,也就是服务器接收请求的比例是 1:1, 如果后端服务器down掉,能自动剔除。轮询是默认配置,不需要太多的配置同一个项目分别使用8081和8082端口启动项目upstream web_servers { server localhost:8081; server localhost:8082; } server { listen 80; server_name localhost; #access_log logs/host.access.log main; location / { proxy_pass http://web_servers; # 必须指定Header Host proxy_set_header Host $host:$server_port; } } 访问地址仍然可以获得响应 http://localhost/api/user/login?username=zhangsan&password=111111 ,这种方式是轮询的2. 权重指定轮询几率,weight和访问比率成正比, 也就是服务器接收请求的比例就是各自配置的weight的比例,用于后端服务器性能不均的情况,比如服务器性能差点就少接收点请求,服务器性能好点就多处理点请求。upstream test { server localhost:8081 weight=1; server localhost:8082 weight=3; server localhost:8083 weight=4 backup; } 示例是4次请求只有一次被分配到8081上,其他3次分配到8082上。backup是指热备,只有当8081和8082都宕机的情况下才走80833. ip_hash上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。upstream test { ip_hash; server localhost:8080; server localhost:8081; } 4. fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个配置是为了更快的给用户响应upstream backend { fair; server localhost:8080; server localhost:8081; } 5. url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法upstream backend { hash $request_uri; hash_method crc32; server localhost:8080; server localhost:8081; } 以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。五:动静分离动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。upstream web_servers { server localhost:8081; server localhost:8082; } server { listen 80; server_name localhost; set $doc_root /usr/local/var/www; location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ { root $doc_root/img; } location / { proxy_pass http://web_servers; # 必须指定Header Host proxy_set_header Host $host:$server_port; } error_page 500 502 503 504 /50x.html; location = /50x.html { root $doc_root; } } 六:其他1.return指令返回http状态码 和 可选的第二个参数可以是重定向的URLlocation /permanently/moved/url { return 301 http://www.example.com/moved/here; } 2. rewrite指令重写URI请求 rewrite,通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。 第一个(必需)参数是请求URI必须匹配的正则表达式。 第二个参数是用于替换匹配URI的URI。 可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301或302)的标志location /users/ { rewrite ^/users/(.*)$ /show?user=$1 break; } 3. error_page指令使用error_page指令,您可以配置NGINX返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他URI。 在以下示例中,error_page指令指定要返回404页面错误代码的页面(/404.html)。error_page 404 /404.html; 4. 日志访问日志:需要开启压缩 gzip on; 否则不生成日志文件,打开log_format、access_log注释log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /usr/local/etc/nginx/logs/host.access.log main; gzip on; 5. deny 指令# 禁止访问某个目录 location ~* \.(txt|doc)${ root $doc_root; deny all; } 6. 内置变量nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。$args : #这个变量等于请求行中的参数,同$query_string$content_length : 请求头中的Content-length字段。$content_type : 请求头中的Content-Type字段。$document_root : 当前请求在root指令中指定的值。$host : 请求主机头字段,否则为服务器名称。$http_user_agent : 客户端agent信息$http_cookie : 客户端cookie信息$limit_rate : 这个变量可以限制连接速率。$request_method : 客户端请求的动作,通常为GET或POST。$remote_addr : 客户端的IP地址。$remote_port : 客户端的端口。$remote_user : 已经经过Auth Basic Module验证的用户名。$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。$scheme : HTTP方法(如http,https)。$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。$server_name : 服务器名称。$server_port : 请求到达服务器的端口号。$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。$document_uri : 与$uri相同
2020年02月15日
406 阅读
0 评论
19 点赞
2019-12-30
PHP面试常见问题
基础篇了解大部分数组处理函数字符串处理函数 区别 mb_ 系列函数& 引用,结合案例分析== 与 === 区别isset 与 empty 区别全部魔术函数理解static、$this、self 区别private、protected、public、final 区别OOP 思想抽象类、接口 分别使用场景Trait 是什么东西echo、print、print_r 区别(区分出表达式与语句的区别)__construct 与 __destruct 区别static 作用(区分类与函数内)手册 、SOF__toString() 作用单引号'与双引号"区别常见 HTTP 状态码,分别代表什么含义301 什么意思 404 呢?进阶篇Autoload、Composer 原理 PSR-4 、原理Session 共享、存活时间异常处理如何 foreach 迭代对象如何数组化操作对象 $obj[key];如何函数化对象 $obj(123);yield 是什么,说个使用场景 yieldPSR 是什么,PSR-1, 2, 4, 7如何获取客户端 IP 和服务端 IP 地址客户端 IP服务端 IP了解代理透传 实际IP 的概念如何开启 PHP 异常提示php.ini 开启 display_errors 设置 error_reporting 等级运行时,使用 ini_set(k, v); 动态设置如何返回一个301重定向[WARNING] 一定当心设置 301 后脚本会继续执行,不要认为下面不会执行,必要时使用 die or exit如何获取扩展安装路径phpinfo(); 页面查找 extension_dir命令行 php -i |grep extension_dir运行时 echo ini_get('extension_dir');字符串、数字比较大小的原理,注意 0 开头的8进制、0x 开头16进制字符串比较大小,从左(高位)至右,逐个字符 ASCII 比较BOM 头是什么,怎么除去0xEF,0xBB,0xBF检测、去除什么是 MVC依赖注入实现原理如何异步执行命令模板引擎是什么,解决什么问题、实现原理(Smarty、Twig、Blade)如何实现链式操作 $obj->w()->m()->d();Xhprof 、Xdebug 性能调试工具使用索引数组 [1, 2] 与关联数组 ['k1'=>1, 'k2'=>2] 有什么区别缓存的使用方式、场景实践篇给定二维数组,根据某个字段排序如何判断上传文件类型,如:仅允许 jpg 上传不使用临时变量交换两个变量的值 $a=1; $b=2; => $a=2; $b=1;strtoupper 在转换中文时存在乱码,你如何解决?php echo strtoupper('ab你好c');Websocket、Long-Polling、Server-Sent Events(SSE) 区别"Headers already sent" 错误是什么意思,如何避免算法篇快速排序(手写)冒泡排序(手写)二分查找(了解)查找算法 KMP(了解)深度、广度优先搜索(了解)LRU 缓存淘汰算法(了解,Memcached 采用该算法)数据结构篇(了解)堆、栈特性队列哈希表链表对比篇Cookie 与 Session 区别GET 与 POST 区别include 与 require 区别include_once 与 require_once 区别Memcached 与 Redis 区别MySQL 各个存储引擎、及区别(一定会问 MyISAM 与 Innodb 区别)HTTP 与 HTTPS 区别Apache 与 Nginx 区别define() 与 const 区别traits 与 interfaces 区别 及 traits 解决了什么痛点?Git 与 SVN 区别数据库篇MySQL索引、联合索引(命中条件)分库分表(水平分表、垂直分表)分区会使用 explain 分析 SQL 性能问题,了解各参数含义Slow Log(有什么用,什么时候需要)重点理解 type、rows、keyCRUDJOIN、LEFT JOIN 、RIGHT JOIN、INNER JOINUNIONGROUP BY + COUNT + WHERE 组合案例常用 MySQL 函数,如:now()、md5()、concat()、uuid()等1:1、1:n、n:n 各自适用场景了解触发器是什么,说个使用场景数据库优化手段MSSQL(了解)查询最新5条数据NOSQL持久化支持多钟数据类型可利用 CPU 多核心内存淘汰机制集群 Cluster支持 SQL性能对比支持事务应用场景Redis、Memcached、MongoDB对比、适用场景(可从以下维度进行对比)你之前为了解决什么问题使用的什么,为什么选它?服务器篇查看 CPU、内存、时间、系统版本等信息find 、grep 查找文件awk 处理文本查看命令所在目录自己编译过 PHP 吗?如何打开 readline 功能如何查看 PHP 进程的内存、CPU 占用如何给 PHP 增加一个扩展修改 PHP Session 存储位置、修改 INI 配置参数负载均衡有哪几种,挑一种你熟悉的说明其原理数据库主从复制 M-S 是怎么同步的?是推还是拉?会不会不同步?怎么办如何保障数据的可用性,即使被删库了也能恢复到分钟级别。你会怎么做。数据库连接过多,超过最大值,如何优化架构。从哪些方便处理?502 大概什么什么原因?如何排查 504呢?架构篇偏运维(了解):负载均衡(Nginx、HAProxy、DNS)主从复制(MySQL、Redis)数据冗余、备份(MySQL增量、全量 原理)监控检查(分存活、服务可用两个维度)MySQL、Redis、Memcached Proxy 、Cluster 目的、原理分片高可用集群RAID源代码编译、内存调优缓存工作中遇到哪里需要缓存,分别简述为什么搜索解决方案性能调优各维度监控方案日志收集集中处理方案国际化数据库设计静态化方案画出常见 PHP 应用架构图框架篇ThinkPHP(TP)、CodeIgniter(CI)、Zend(非 OOP 系列)Yaf、Phalcon(C 扩展系)Yii、Laravel、Symfony(纯 OOP 系列)Swoole、Workerman (网络编程框架)对比框架区别几个方向点是否纯 OOP类库加载方式(自己写 autoload 对比 composer 标准)易用性方向(CI 基础框架,Laravel 这种就是高开发效率框架以及基础组件多少)黑盒(相比 C 扩展系)运行速度(如:Laravel 加载一大堆东西)内存占用设计模式单例模式(重点)工厂模式(重点)观察者模式(重点)依赖注入(重点)装饰器模式代理模式组合模式安全篇SQL 注入XSS 与 CSRF输入过滤Cookie 安全禁用 mysql_ 系函数数据库存储用户密码时,应该是怎么做才安全验证码 Session 问题安全的 Session ID (让即使拦截后,也无法模拟使用)目录权限安全包含本地与远程文件文件上传 PHP 脚本eval 函数执行脚本disable_functions 关闭高危函数FPM 独立用户与组,给每个目录特定权限了解 Hash 与 Encrypt 区别高阶篇PHP 数组底层实现 (HashTable + Linked list)Copy on write 原理,何时 GCPHP 进程模型,进程通讯方式,进程线程区别yield 核心原理是什么PDO prepare 原理PHP 7 与 PHP 5 有什么区别Swoole 适用场景,协程实现方式前端篇原生获取 DOM 节点,属性盒子模型CSS 文件、style 标签、行内 style 属性优先级HTML 与 JS 运行顺序(页面 JS 从上到下)JS 数组操作类型判断this 作用域.map() 与 this 具体使用场景分析Cookie 读写JQuery 操作Ajax 请求(同步、异步区别)随机数禁止缓存Bootstrap 有什么好处跨域请求 N 种解决方案新技术(了解)ES6模块化打包构建工具vue、react、webpack、前端 mvc优化浏览器单域名并发数限制静态资源缓存 304 (If-Modified-Since 以及 Etag 原理)多个小图标合并使用 position 定位技术 减少请求静态资源合为单次请求 并压缩CDN静态资源延迟加载技术、预加载技术keep-aliveCSS 在头部,JS 在尾部的优化(原理)网络篇IP 地址转 INT192.168.0.1/16 是什么意思DNS 主要作用是什么?IPv4 与 v6 区别网络编程篇TCP 三次握手流程TCP、UDP 区别,分别适用场景有什么办法能保证 UDP 高可用性(了解)TCP 粘包如何解决?为什么需要心跳?什么是长连接?HTTPS 是怎么保证安全的?流与数据报的区别进程间通信几种方式,最快的是哪种?fork() 会发生什么?API 篇RESTful 是什么如何在不支持 DELETE 请求的浏览器上兼容 DELETE 请求常见 API 的 APP_ID`APP_SECRET` 主要作用是什么?阐述下流程API 请求如何保证数据不被篡改?JSON 和 JSONP 的区别数据加密和验签的区别RSA 是什么API 版本兼容怎么处理限流(木桶、令牌桶)OAuth 2 主要用在哪些场景下JWTPHP 中 json_encode(['key'=>123]); 与 return json_encode([]); 区别,会产生什么问题?如何解决
2019年12月30日
457 阅读
0 评论
21 点赞
1
...
8
9
10
...
12