简单的php基于curl的反向代理程序
起因:
经理:需要实现一个反向代理?
我: 简单,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的反向代理程序的更多相关文章
- paip.基于urlrewrite的反向代理以及内容改写
paip.基于urlrewrite的反向代理以及内容改写 ---------反向代理 RewriteCond %{REQUEST_URI} !=/process.php RewriteRule ^( ...
- Asp反向代理程序,调用远程站点全站数据,一款脚本级反向代理程序.
前些天临时写的一脚本级反向代理程序,用法很简单,设置好目标站地址,然后放到你网站根目录:index.asp,再将404页面自定义为:index.asp,即可. 由于暂时没有 url 替换需要,所以没有 ...
- nginx基于TCP的反向代理
一.4层的负载均衡 Nginx Plus的商业授权版开始具有TCP负载均衡的功能.从Nginx 1.7.7版本开始加入的,现在变成了一个商业收费版本,想要试用,需要在官网申请.也就是说,Nginx除了 ...
- 基于Nginx实现反向代理
一.nginx的简介 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服 ...
- 基于Tengine的反向代理详细配置
系统环境: SUSE Linux Enterprise Server 10 SP1 (x86_64) 注:所有软件包都放置在/data/software目录下 nginx_tcp_proxy_modu ...
- 项目详解4—haproxy 反向代理负载均衡
一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...
- Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践
1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...
- Nginx反向代理 实现Web负载均衡
实现负载均衡的方式有很多种,DNS.反向代理.LVS负载均衡器(软件实现).F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务 DNS服 ...
- 跨域问题,解决方案-Nginx反向代理
跨域问题,解决之道 跨域问题,在日常开发过程中,是一个非常熟悉的名词.今天的话题,结合我之前的项目场景,讨论下<跨域问题,解决之道>. 跨域是什么 跨域问题,是由于JavaScript出于 ...
随机推荐
- Tomcat源代码解析系列
学web也有一段时间了.为了从底层了解web应用在Tomcat中的执行,决定看一下Tomcat的源代码參见<How Tomcat works> 和大牛博客.对大体架构有了一定的了解, ...
- cookie技术自动登录
user public class User implements Serializable{ private String username; private String nick; privat ...
- esriControlsMousePointer常量
控制鼠标指针选项. 不变 值 描述 esriPointerParentWindow -1 指针指定的父窗口或窗体. esriPointerDefault 0 默认指针,箭头一样. esriPointe ...
- mysql中如何统计某字段里某个字符的个数
select * from order where length(order_num)-length(replace(order_num,'8','')) = 4
- java基础讲解12-----Swing
package com.swing; import java.awt.*; import javax.swing.*; public class Swing01 extends JFrame{ /* ...
- sql 数据类型 论可变长度字符串与定长性能差异(my sql版)
首先从字节上来说CHAR是定长,意思就是只要输入在我这个定长以下,不管是几个字符,它的实际占用空间都是CHAR定长的长度.而VARCHAR则相对来说会节省一点空间,比如:你VARCHAR的长度设为10 ...
- ASP.NET CORE 2.1无法添加控制器、视图
常规操作:右键Controllers,添加控制器 结果提示:运行所选代码生成器时出错 在控制器里快速添加视图也得到同样的错误提示 既然提示代码生成器了,对比了一下2.0和2.1的代码,发现2.1默认没 ...
- DataProtectionConfigurationProvider加密web.config文件
web.config 文件中经常会包含一些敏感信息,最常见的就是数据库连接字符串了,为了防止该信息泄漏,最好是将相关内容加密. Aspnet_regiis.exe命令已经提供了加密配置文件的方法,系统 ...
- nekohtml转换html时标签变大写的问题
public static Document transferByNeko(InputStream stream, String charset) { if (stream == null) retu ...
- NSArray、NSMutableArray和NSMutableDictionary的用法
转自:http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt=1 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域 ...