文档章节

简单的php基于curl的反向代理程序

任臻
 任臻
发布于 2016/04/30 21:38
字数 1057
阅读 2.4W
收藏 15

起因:

经理:需要实现一个反向代理?  

我:  简单,nginx分分钟配置好。      

经理:嗯?没有nginx?      

我: nodejs也行啊,网上有例子分分钟搞定。

经理:嗯?只有虚拟主机,只能上传php程序?

我:Oh,My god!

于是就有了一个php写的反向代理程序就诞生了

 

 

什么是反向代理:

百度百科有云:

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理目的也各有不同,有用作CDN的,有作为负载均衡的等等。

成熟的反向代理的软件有很多:我比较熟悉nginx,性能高,功能强大,配置简单,作为负载均衡的工具绝对是杠杠的。

作为一个程序员,以上都是废话,下面进入正题。

为了快速的完成功能(其实就是懒),我首先做的就是google,看看是否有php实现的反向打理程序。事实上还真找到了。有7ghost、phpproxy等等,可惜他们要不是用fsockopen写的。我不是很看得懂,看不懂,就很难修改和扩展,更好的为自己的需求工作,要不就是功能上好像有些不符合我们的一些测试。于是一咬牙就写了php基于curl的反向代理脚本。

php是一个脚本语言,也就是说它的执行效率肯定是不如C,也不如JS,而且传统的php也无法利用事件驱动IO,所以在性能上无法和nginx、nodejs实现的程序相比,如果条件允许,优先使用更好的实现工具。

但是不得以只能使用的情况下,提高性能就是必须的了。而提高性能的秘密就是少做事,只做一件事,那就是做好请求数据的搬运工,保留HTTP的美好的特性,比如:浏览器缓存,gzip压缩,但是php不做额外的操作,比如:负载均衡,根据缓存头缓存内容等。

实现的逻辑主要就是一下三步:

1. 从$_SERVER获取浏览器请求的内容,传说中的Request,并进行一些修改。

2. 用curl将Request发到后端机器上,并等待后端的返回内容 传说中的Response。

3. Response中包含Header和Body,分别用header函数和echo函数将它们发到浏览器渲染。

4. 用rewrite规则将请求发给index.php上执行,这个很容易,代码就不贴了。

代码地址如下:

https://gitee.com/jamesren_781/codes/e9v45qa68wndrzbh3ktof

题外话:我曾经看到我的同事写过一个类似反向代理的实现功能,使用的方法很简单:

echo file_get_contents($url);

后来发现如果url是一个图片的话不行,因为content-type不对,浏览器无法识别。结果写了一套根据url后缀识别content-type的方法,等于是实现了一套服务器规则,使得浏览器显示正常了,当时他还得意了很久。这种实现丢失了很多好的东西,比如缓存,gzip等等,还白白浪费了性能。

所以,人生就是奇妙,有时候一些简单的代码和逻辑反而包含着更高的智慧。而复杂的实现反而在各方面都不如它。有时候我在想为什么别人赚钱这么容易,我这么辛苦还赚得少?也许这就是智慧的高低,这就是道,就是极限挑战里常说的:这就是命。

 

© 著作权归作者所有

任臻
粉丝 1
博文 15
码字总数 9879
作品 0
杨浦
程序员
私信 提问
加载中

评论(5)

izee
izee

引用来自“izee”的评论

代码链接不可用

引用来自“任臻”的评论

改好了,再试试
谢谢,我测试了,图片、字体这些链接会有问题,估计是代理转发时,文件编码发生了改变。最后换成7ghost了
任臻
任臻 博主

引用来自“izee”的评论

代码链接不可用
改好了,再试试
izee
izee
代码链接不可用
你个大胖子
你个大胖子
感谢博主提供的php代码,刚好要开发微信集成,只能80端口,于是用博主的代码完美解决了微信80端口的问题
乌龟壳
乌龟壳
不用socket来做,https的网页都浏览不了。http代理主要是要实现CONNECT请求。
php的curl遇到返回多个Set-Cookie问题

各位老大,利用curl做反向代理登陆,遇到一个问题, 一个网站,返回的头文件有多个set-cookie,例如 我在自己的电脑上用php的curl,想模拟登录这个网站,但curl返回的信息中,test这个cooki...

坚慧
2014/03/21
2.4K
7
centos 6.8 安装LNMP环境(linux+nginx+mysql+php)---2

Nginx 特性 Nginx 性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源极少。 1、相比 Apache,用 Nginx 作为 Web 服务器:使用资源更少,支持更多并发连接,效率更高。 2、作为...

vperson
2017/04/17
0
0
Nginx的反向代理及负载均衡

1.集群的简介 简单来说,集群就是指一组相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同...

10pcm
2018/06/26
0
0
centos 6.8 安装LNMP环境(linux+nginx+mysql+php)

Nginx 特性 Nginx 性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源极少。 1、相比 Apache,用 Nginx 作为 Web 服务器:使用资源更少,支持更多并发连接,效率更高。 2、作为...

vperson
2017/04/17
0
0
物联网协议 HTTP libcurl

参考https://yq.aliyun.com/ask/300773 curl是利用URL语法在命令行方式下工作的开源文件传输工具。 它支持很多协议:DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAP...

iotcsdn
2018/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

每天AC系列(六):有效的括号

1 题目 LeetCode第20题,这题比较简单,匹配括号. 2 栈 这是栈的典型应用,括号匹配,当然不需要直接使用栈,使用一个StringBuilder即可: if(s.isEmpty()) return true;char a = s.charAt(0);...

Blueeeeeee
今天
27
0
Spring AOP-06-切入点类型

切入点是匹配连接点的拦截规则。之前使用的是注解@Pointcut,该注解是AspectJ中的。除了这个注解之外,Spring也提供了其他一些切入点类型: • 静态方法切入点StaticMethodMatcherPointcut •...

moon888
昨天
90
0
Class Loaders in Java

1. Introduction to Class Loaders Class loaders are responsible for loading Java classes during runtime dynamically to the JVM (Java Virtual Machine). Also, they are part of the ......

Ciet
昨天
96
0
以Lazada为例,看电商系统架构演进

什么是Lazada? Lazada 2012年成立于新加坡,是东南亚第一电商,2016年阿里投资10亿美金,2017年完成对lazada的收购。 业务模式上Lazada更偏重自营,类似于亚马逊,自建仓储和为商家提供服务...

春哥大魔王的博客
昨天
60
0
【自用】 Flutter Timer 简单用法

dart: void _startTime() async { _timer = Timer(Duration(seconds: sec), () { fun(xxx,yyy,zzz); }); } @override void dispose() { _timer.cancel()......

Tensor丨思悟
昨天
65
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部