起因:

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

我:  简单,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等等,还白白浪费了性能。

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

简单的php基于curl的反向代理程序的更多相关文章

  1. paip.基于urlrewrite的反向代理以及内容改写

    paip.基于urlrewrite的反向代理以及内容改写 ---------反向代理 RewriteCond %{REQUEST_URI} !=/process.php RewriteRule  ^( ...

  2. Asp反向代理程序,调用远程站点全站数据,一款脚本级反向代理程序.

    前些天临时写的一脚本级反向代理程序,用法很简单,设置好目标站地址,然后放到你网站根目录:index.asp,再将404页面自定义为:index.asp,即可. 由于暂时没有 url 替换需要,所以没有 ...

  3. nginx基于TCP的反向代理

    一.4层的负载均衡 Nginx Plus的商业授权版开始具有TCP负载均衡的功能.从Nginx 1.7.7版本开始加入的,现在变成了一个商业收费版本,想要试用,需要在官网申请.也就是说,Nginx除了 ...

  4. 基于Nginx实现反向代理

    一.nginx的简介 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服 ...

  5. 基于Tengine的反向代理详细配置

    系统环境: SUSE Linux Enterprise Server 10 SP1 (x86_64) 注:所有软件包都放置在/data/software目录下 nginx_tcp_proxy_modu ...

  6. 项目详解4—haproxy 反向代理负载均衡

    一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...

  7. Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践

    1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...

  8. Nginx反向代理 实现Web负载均衡

    实现负载均衡的方式有很多种,DNS.反向代理.LVS负载均衡器(软件实现).F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务       DNS服 ...

  9. 跨域问题,解决方案-Nginx反向代理

    跨域问题,解决之道 跨域问题,在日常开发过程中,是一个非常熟悉的名词.今天的话题,结合我之前的项目场景,讨论下<跨域问题,解决之道>. 跨域是什么 跨域问题,是由于JavaScript出于 ...

随机推荐

  1. 07-hibernate进阶

    1,hibernate.cfg.xml常用配置 2,session简介 3,transaction简介 4,session详解 5,对象关系映射常用配置 hibernate.cfg.xml常用配置 s ...

  2. 将项目从tomcat 迁移到JBoss5.0

    http://java-boy.iteye.com/blog/531411从Tomcat升级到JBoss5.1真是一个痛苦的过程,可能遇到很多问题.以下是我碰到的问题,及解决方法. 一.Hiberna ...

  3. django inspectdb

    使用inspectdb  --通过已有数据库表生成 model.pyinspectdb辅助工具检查你的settings文件指向的数据库,决定你表示你的表的Django模型并打印Python模型代码到标 ...

  4. form表单中的id 与name的区别

    以前经常写form表单时,不写id和name,总觉得没有什么用.后来一看后台套完的页面发现,他们都补上name,不知道所以然,就查了一下资料,吓我一跳,要是照我那样写根本不会有数据传到服务器.原来表单 ...

  5. 如何解决MySQL连接超时关闭

    最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...

  6. 动态webservice调用接口

    using System; using System.Collections; using System.IO; using System.Net; using System.Text; using ...

  7. iOS开发多线程篇 04 —线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

  8. javascript构造函数的理解

    构造函数是在javascript文档的创建对象当中提到的,主要目的是为了解决代码复用,能够大量产生同类型而多作用的方法 在javascript中给出了几种创建对象的模式: 1.对象字面量 例: var ...

  9. jdk8 StreamApi

    List<User> userList=new ArrayList<>(); userList.add(User.builder().age().name()).build() ...

  10. sqlmap里如何添加字典

    在sqlmap的目录下有那么一个目录.即"TXT"目录. 该目录下是放字典的. 我在日一个站的时候没有破解出表明.然后不小心下载到了数据库. sqlmap无法猜出表是啥.ps:ac ...