开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5921|回复: 24
打印 上一主题 下一主题
收起左侧

[讨论] 易语言开发web容器的必要性,可行性讨论

[复制链接]
头像被屏蔽
结帖率:14% (1/7)
跳转到指定楼层
楼主
发表于 2017-7-4 04:28:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式   湖北省孝感市
本帖最后由 落款hMZ 于 2017-7-4 04:41 编辑

一:首先,说一下目前的痛点
痛点1:目前web开发的主流语言是 .net  asp  php  java等,对于一个易语言编程者来说,如果能够非常熟练的掌握上面几个语言,那当然是很好的,可是我们每个人的时间有限,易语言编程者大多数也都并不是科班出身,掌握多一门语言需要花费的时间很多,并且很多人可能跟我一样,汉字写的文章,一大段都可以随便背诵,可是超过4个字母或者数字的组合永远都记不住(我花了很久的时间才记住php里的 ‘substr’,虽然我用过他上百次了)

痛点2:主流web开发语言调用DLL都不方便,不管是asp 还是 php,想调用一个易语言编写的DLL,都要走一些弯路,并且效率也不见得有多高,很多时候,web给用户提供的一些功能,必需使用到超出一般脚本语言能力所及的范围,比如我们的网站想要帮用户识别另外一个网站的验证码,而识别程序恰好又是易语言写的,这个就比较麻烦了

痛点3:某些主流编程语言,在特定的情况下,效率并不是很高,在这里,我举一个可能大家都没想过的例子来说明一下吧
我有一个mysql数据库,管理着我的软件用户的数据,而我的软件是基于服务器-客户 的模式的,用户打开软件后登陆到服务器,然后要保持在线,接收服务器发来的消息,计算在线时间等等,这个有点类似于即时通讯,所以客户端需要循环每10秒访问一次我的服务器,我的服务器不停的查询数据库里是否有该用户的新消息,如果有,就立即发给用户
服务器如果不用http的话,速度应该还是可以的,但是后来我扩展到了有些操作可以在网页里完成,甚至在微信里完成,这样的话,就必须搞http服务器了,而软件所对应的服务器端也跟着改为http的了
服务器我用的是阿里云的,负载均衡后面带一堆子服务器,http服务器是IIS,页面是PHP写的
所有更改完成以后,发现服务器经常返回500错误,于是查找原因发现,是PHP对mysql服务器访问失败,原因是mysql的最大连接不够
于是我把最大连接改到3000,然后把mysql服务器升级为 16核64G 的,在用户量激增的时候仍然会有这样的情况,并且我的web服务器是负载均衡集群的,后台子服务器数量已经达到了15个,每个里面进程数量都达到900+
于是在闲的时候,我用阿里云的压力测试服务做了一下压测,结果是这样的

这就是PHP和mysql的组合,在这么点流量的情况下,失败率达到50%
分析原因,发现问题出在PHP的机制上面,PHP跟mysql的结合其实并不像大家想象的那么好,每个页面,每次用户访问一次,都会新建一条mysql连接,而我的页面是每1秒查询一次mysql,没有数据就等待1秒后继续查询,所以mysql连接在整个15秒内都没有释放,被这个请求独占了15秒,又不能给其它用户使用
PHP不支持mysql长连接共享,也就是说每次请求都会创建一个mysql连接,直到mysql服务器达到最大连接数
因此,我想到了用易语言代替PHP,新建一些mysql长连接,在等待1秒的期间,这个连接可以给别的请求所使用,这样就可以极大节约mysql连接数
所以我用易语言写了一个ISAPI扩展,全局变量里放一个数组,里面是mysql句柄,在没有用户请求的时候,用一个线程去检查每个句柄最后使用的时间,一旦最后使用的时间超过2分钟,就做一次非常简单的查询 select 1+1,这样做仅仅是为了保持这个连接,在有用户使用的时候,每次查询数据库之前,先在这个池子里提取一个mysql句柄,查询完以后再放回去,以提供给其它用户使用
这样做了以后,再次用阿里云的压力测试进行测试,结果如下:

失败率一下下降到3%
所以从这件事以后,我就开始觉得,用易语言编写web服务器也是可行的,限于ISAPI的各种限制,做ISAPI扩展远远不如直接抛弃IIS,自己写个web容器来得痛快

二:易语言做web服务器的好处
1、适合易语言编程者:不管是我们这些年自己积累的,还是精易论坛里搜索到的,我们都有大量成熟的代码,在易语言IED里,我们几乎可以做任何事,可是到了PHP,asp这些脚本语言,很多时候我们发现我们无能为力,用易语言开发web容器的目的就是为所欲为,做我想做的事
2、做一个比Apache和IIS更加轻量级的容器,可以节约更多资源,Apache和IIS并不是每个功能我们都需要,比如日志,很多人可能根本不需要日志,可是关闭的话,总觉得少了点什么,Apache和IIS都是大工程,功能齐全,代码庞大,可是我们很多时候仅仅只是想要一个轻量级的,能够提供最基础的功能就够了
3、对底层的绝对掌控。Apache我不是很熟,先不说,就说IIS吧,IIS的底层是基于socket的,作为一个web容器,我认为对于,TCP等待队列,应用程序内存的分配,保持连接的时长,这些在IIS里面都没有直接的选项,有的需要修改注册表,有的需要在某个埋得很深的地方找到一个配置文件修改,有的甚至根本无法修改,而如果我们是用易语言自己开发的话,这些一切的东西我们都可以自定义
4、更另类的东西其实更安全。除了sql注入以外,在一般情况下,如果我们用的是易语言写的web容器的话,黑客想要通过后台获取我们服务器的管理权限,是非常困难的,因为他们根本不知道这是个什么东西,代码在哪里,我想没有几个黑客愿意花大量时间研究一下一个非标准化的东西,这样无形中保护了服务器的安全
5、因为底层我们可以完全掌握,这样,我们可以自定义CC攻击的阀值,可以为自己定制更加适合的防御策略,可以更好的防御爬虫等等

三:那么说了这么多,易语言编写web服务器真的可以高效率运行吗?
  还是以Window系统下的web服务器为例,不管是Apache还是IIS,最底层还是操作socket,而易语言操作Windows的socket API效率并不低,跟IIS相比,无非就是在启动的时候多了几个寻找函数地址的过程,后面其实都是一样的call,相比IIS,我们可以阉割掉大量我们不需要的功能,只要代码写好了,运行效率不一定比IIS差
对于应用池,我们是直接调用DLL的,甚至是直接在web容器内部调用函数的,这个比fastcgi可是要快得多了,当然,如果你想要,你也可以在你的web容器里加入对fastcgi和ISAPI的支持,这些后面再说

四:我们需要写一个怎么样的web容器,它需要哪些基本功能?
我认为,作为一个合格的web容器,以下几个功能是必须的
1、支持所有HTTP谓词,“OPTIONS”, “HEAD”, “GET”, “POST”, “PUT”, “DELETE”, “TRACE”, “CONNECT”,另外还可以自己扩展几个谓词用于特定的操作
2、支持安全管理:绝对不可以用Administrator权限去直接处理用户的请求,这是安全管理最基本的要求,来宾用户只有对web根目录文件夹有一定权限,不能对所有文件夹都有权限,甚至应用程序池的权限也要做一定的控制,至于权限控制,本人之前已经在论坛发了源码,后面我们会详细讲
3、对Connection: keep-alive的支持,想要web容器高效率运行,每次都要新建socket连接当然不行
4、多主机头支持,其实这个也就是把访问过滤分类而已,如果想做得更细致,我们还能做对不同的主机头访客使用不同的来宾账号,让服务器更加安全
5、筛选器插件支持,用于URL改写或者访问拦截
6、Gzip支持,这个精易模块就有源码,不是事

五:我们还可以做哪些功能?
下面说到的功能可能都不是必须的,但是也是我自己亲自测试可用的
1、对websocket的支持,既然都socket编程了,而websocket协议又不是很难,一个http访问升级为websocket访问,对我们已经掌握了底层来说,完全不是问题,论坛里websocket协议的源码很多,如果不满意还可以自己去研究websocket协议,自己写
2、对SSL的支持,这个稍微有点难,不过用OpenSSL 或者Windows的 SSPI API + Crypt API也是可以做的,论坛里已经有SSPI API 创建SSL连接,监听端口的相关源码,搜索一下就是了
3、对PHP的支持。这个我研究过几天,想要支持PHP,最简单的办法是 使用命令 -S <addr>:<port> 创建一个内置PHP服务器来处理用户请求,直接吧php的请求转发到本地的端口就可以了(注意这个内置PHP服务器是单线程的,所以要维护一个程序池,启动很多内置服务器)
4、对asp的支持,使用 smwn.exe 就可以了,也是一个内置服务器,没毛病
5、代理,反向代理支持,这关键就是一个端口映射,没什么特别难的

六:做一个合格的,高效的web容器,我们需要哪些知识或者源码?
1、socket 咯,源码到处都是,建议采用原生的Windows API,不要使用封装过的,比如hpsocket 这个封装过度了,反而不那么自由,且带个DLL也不是很爽的事
2、熟悉HTTP协议咯,这个是最基本的吧,上面说的那些个谓语,还有协议头里的各种值都要了解,这里特别提醒一下大家注意 Transfer-Encoding: chunked这个头
3、web应用程序的一些基本工具,写易语言服务器是为了方便易语言开发者,可是如果连常用工具都没有,那就不方便了,常用工具如
  (1) mysql连接池啦,这个自己写吧,超级简单,注意伪心跳,超过2分钟没有使用的mysql句柄就查询一下 select 1+1 就是了
  (2) 密码算法咯,这个任何一个web应用程序都少不了的,论坛上我已经发过OpenSSL和Crypt API的算法源码,支持RSA加密和签名,多种模式的AES,DES,各种散列,数据摘要,各种HMAC,这些都已经帮大家写好了,比PHP还全,请自行搜索吧
  (3)文本处理咯,比如json,xml的解析,生成等,这个我也发了源码,自行搜索吧
  (4)验证码。。。。没想到吧,web服务器不能产生验证码那还叫web服务器吗?嘿嘿,我又发过源码了,直接用易语言产生验证码,效率又比PHP的高,自己找吧
  (5) CURL,这个在易语言里叫做 libcurl,几年前就有人发源码了,我们尽量贴合PHP的常用扩展,它有的,我们尽量也要有
4、上面说了,合格的web容器一定要有安全管理,权限控制等等,好吧,我又发过源码。Windows安全机制,自己找

七:我们可能还需要这些东西:
1、SSL服务器源码,上面说了,源码在论坛里有
2、websocket,要么自己去学,要么在论坛找找源码吧,这个最近几年很火,论坛前年就有websocket服务器的源码了
3、程序池的管理,比如要做PHP支持,我们需要创建一大堆 PHP内置服务器进程,同一时间每个访问对应不同的进程,在主进程关闭后自动关闭创建出来的这些进程,根据访问量的增大和减少,增加或者减少PHP内置服务器进程 等等,这些需要花点时间去研究一下,做个简单的功能不难
4、PHP里的一些其他扩展,比如非mysql数据库操作,比如SMTP扩展,比如GD+扩展等等
5:、二维码生成,这个可能会用到,用易语言生成二维码,这个貌似是有源码的,大家找一找,要是没有,自己用PHP的源码或者js源码翻译也不难的

八:必要性和可行性总结:
  有必要吗?有吗?我觉得是有必要的,不亲眼见识过轻量级web容器的威力的人可能无法理解这个需求,标准的东西,有他的好处也有他的坏处,非标准的东西可以取长补短,最重要的是,如果你的网页全都是易语言写的,那黑客绝对直接绕道了
  可行吗?为什么不行?我上面总结的我们需要哪些东西,可能不是很全面,但是绝大多数都是有现成的源码的啊,只要你有一点点时间,耐心的把各种源码拼凑一番,基本上这个web容器就已经完成了90%了啊

九:那么怎么启动这个项目:
  这个项目是否需要多个人一起合作?个人认为,既然做非标准的东西,既然非标准是卖点之一,既然实现起来大多数都有源码,难度不大,那么没必要一堆人合作做出这个东西,或者更没必要让某个大神做了这个东西以后开源
最好是有需要的人,大家各自分开做吧,各做各的,每个人的都不相同,在做的过程中把大家可能会用到的一些工具源码发到论坛上来,供别人参考


以上,大家有什么看法,欢迎发言
希望早点看到优秀的易语言web服务器

点评

http://125.confly.eu.org/forum.php?mod=viewthread&tid=14027751   河南省郑州市  发表于 2017-7-4 11:39
我前段时间写过一个勉强能支持web访问的软件,支持dll编程。你可以去看下,开源的了。随便写的,代码并不严谨   河南省郑州市  发表于 2017-7-4 11:38

评分

参与人数 2好评 +2 精币 +6 收起 理由
韩龙 + 1 + 1 我读书少,不要骗我
Cand + 1 + 5 很赞同,谢谢!

查看全部评分

结帖率:67% (29/43)

签到天数: 6 天

沙发
发表于 2017-7-4 08:16:28 | 只看该作者   湖南省益阳市
前排瓜子花生
回复 支持 反对

使用道具 举报

结帖率:58% (7/12)

签到天数: 2 天

板凳
发表于 2017-7-4 08:19:20 | 只看该作者   山西省吕梁市
虽然不懂,但是感觉很强大的样子
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 14 天

地板
发表于 2017-7-4 08:54:06 | 只看该作者   广东省揭阳市
这文章,要顶
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
地下
发表于 2017-7-4 08:57:06 | 只看该作者   河南省郑州市
小牛大大 发表于 2017-7-4 08:19
虽然不懂,但是感觉很强大的样子

虽然不懂,但是感觉很强大的样子
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
6
发表于 2017-7-4 09:08:40 | 只看该作者   河南省周口市
不明觉厉,继续看看
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)
7
发表于 2017-7-4 09:43:19 | 只看该作者   广东省深圳市
易语言对于内存的管理限制,使得你基本丧失了对其的控制权,这也就注定了其并不适合用于制作服务端软件(专业的),大量的临时性访问会带来非常高的内存更迭消耗,如果没有适当的内存管理措施,迟早会被内存碎片淹没,其次还有数据结构的局限性,易语言本身提供泛式数据存储容器可选的余地实在是过少(仅有数组),如何高效有序的管理数据也是比较头疼的一环。总得来说要想做容易,要想做得好就很难。
回复 支持 反对

使用道具 举报

8
发表于 2017-7-4 10:07:07 | 只看该作者   广东省汕头市
生意看人做,代码看什么人写。想法错了,但是万一作者是个乔布斯那样执着的人,也是可以成功的。
你要问问,易语言的作者屁股下面坐着能用于开发不干事埋头写代码的钱力,和他的毅力。
这2点才是最靠谱的。
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:14% (1/7)
9
 楼主| 发表于 2017-7-4 10:23:55 | 只看该作者   湖北省孝感市
黑猫よ__ 发表于 2017-7-4 09:43
易语言对于内存的管理限制,使得你基本丧失了对其的控制权,这也就注定了其并不适合用于制作服务端软件(专业 ...

受教了,不过我有个疑问,如果利用易语言自身的内存管理呢?尽量使用易语言基本变量,让底层自己释放,这样不会造成内存碎片什么的吧,从4月份开始,我的易语言编写的web已经有2个月没关机重启了,内存基本没增加多少

2个月之前这个数是9M,现在是19M,两个多月内存增加了10M,并且这是因为 易语言 取现行时间() 这个命令在多线程下的内存泄露造成的
即使是IIS,也会在固定的一个时间重启应用池里的程序,以释放内存
所以你说的迟早会被内存碎片淹没这个我没有感觉到,所以我猜测你所说的内存更迭消耗是否是指调用API的时候出现的问题?
数据结构问题,也是调用API的时候的问题,这个我做过adv32.dll里的API就明白,API支持不定格式,不定长度的数据结构,而易语言不行。我的办法是,尽量把数据结构作为一整个内存块来看待,了解一个结构体在内存中存在的形式,然后以内存操作取代直接访问结构体成员,尽量不使用RtlMoveMemory复制结构体,想要访问结构体内哪个成员,直接 指针到字节集()就可以了,由易语言申请的内存块,由易语言来释放,由API申请的内存块,由API来释放,这样,不但功能可以实现,内存也不会有什么泄露

点评

内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。产生内存碎片的方法很简单,举个例: 假设有一块一共有100个单位的连续空闲内存空间,范围是0~99。如果你从中申请一块内存   广东省深圳市  详情 回复 发表于 2017-7-4 11:33
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:14% (1/7)
10
 楼主| 发表于 2017-7-4 10:28:52 | 只看该作者   湖北省孝感市
xydk 发表于 2017-7-4 10:07
生意看人做,代码看什么人写。想法错了,但是万一作者是个乔布斯那样执着的人,也是可以成功的。
你要问问 ...

有需求就会有人去做,当然并不是要每个人都去写一个web容器,只是讨论有些人是否需要这个东西,是否有能力去开发出来,如果你确定你的项目里很需要一个易语言写的web容器,并且你的项目目前盈利可以,换了web容器后执行效率更高,那什么不去做呢?

如果你现在手头有个赚钱的项目,用到了http服务器,然而因为某些原因你不满意,你认为换了易语言写的容器后可以赚更多的钱,或者可以节约更多的服务器开支,那当然会去做了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表