【思考】PHP——成也Web,败也Web

背景

早年我并不知道Python写的Web应用是怎么部署的,总觉得像PHP、ASP一样,仅仅提供一个语言级别的执行模块,直接嵌入Web服务器运行,甚至于直接对外提供带扩展名的URL都是自然而然的事情。

前一阵学习了Python,总是如别人一样,不自觉的和PHP进行对比。随着学习的逐步深入,更发现PHP的发展受限于其Web出身,恐将来难成正经的通用开发语言。

先说说PHP从历史到今天分别是怎么运行的: * CGI SAPI:由Web服务器的请求处理进程fork+exec这个CGI,用环境变量单向传递Headers给应用程序,应用程序从stdin读request body,其stdout会被Web服务器作为response headers和body输出给客户端。Web服务器和PHP CGI的关系是父子进程间通信,当应用程序的响应速度较慢时(忙于计算、外部I/O等),会阻塞对应的Web服务器进程/线程 * Apache2Handler等Web服务器模块类SAPI:Apache2调用Handler,并向其传递server_context;Handler利用server_context读到Header、body等内容之后构造起PHP脚本的context,也就是$_SERVER之类,然后开始执行PHP脚本。而脚本执行的输出也直接被Web服务器收集。PHP和Web服务器在同一个进程内执行,处于完全从属的地位。Apache2Handler方式本来可以通过多线程等方式让Apache不受PHP阻塞,但由于PHP社区的坚持,目前常见的Apache2+PHP配置都是prefork MPM的,以至于性能相当一般 * FastCGI SAPI:原理是把每次fork处理一个请求,变成一个不退出的循环,每循环一轮就处理一个请求;多进程listen在同一个socket上,实现并发。PHP-FPM是后来的一个民间补丁项目,提供了更好的进程管理和附加功能,处理完License问题之后,FPM合并入PHP主线。Web服务器和PHP的关系是网络通信的关系,可以分离到不同服务器上部署。Web服务器可以使用多线程或者I/O复用技术来处理别的请求,性能会>比前二者好很多。但FPM的实现仍然不够好。

PHP的各种扩展模块,大都是偏重于数据库、字符串处理等应用层面的功能,充分体现了其作为Web开发利器的特点;而对于I/O、POSIX基础功能,则关注较少。 Web开发之外的领域,用PHP写独立运行的服务器,并不是主流的用法。其依赖的pcntl、pthread等模块也是较晚加进来的,而且也没啥人用。用以下几个模块可以很容易的创作一个独立的HTTP静态文件或SOA服务: 1. PEAR Net_Server(无人维护) 通用服务器框架 2. PEAR HTTP2 协议解析库 3. PEAR HTTP_Server(无人维护) HTTP服务器框架 4. PECL pecl_HTTP(需要编译) HTTP服务器框架,我没编译出来…… 但如果想在其中运行一般的Web PHP脚本,就需要用PHP本身实现一个SAPI: * 输入方面是很容易仿制的,除了需要构造Predefined/Reserved Variables(感谢作者,$_SERVER等只是普通数组,只须填充内容就差不多了,而不像ASP那样是复杂的Request对象)再写一下上传文件自动存盘的处理就差不多了 * 输出方面就比较麻烦,因为“写”是动作。考虑到PHP深深的“假设stdout”情结,须使用output buffer机制收集输出内容。另外,header()函数等的实现可能会比较复杂

传统上,协议解析是SAPI的工作,PHP从属于Web服务器,以至于没积累出什么好用的协议解析库;而PHP书写的Web应用向来都是直接调用SAPI提供的函数,积习难改,以至于想用PHP本身来写Web服务器就须要去实现一个SAPI,但又会遭遇到这个语言本身的Web烙印太深、假设太多,以及不够“动态”的问题。 传统上,网络通信向来也不须由PHP来处理,以至于也没积累出什么好用的通信框架库。

最终,PHP成了一个Web only的开发语言。真可谓成也Web、败也Web。

一些新兴的PECL扩展提供了高性能I/O框架,比如swoole,但因为上述SAPI的问题,目前尚未出现像Python那样用PHP本身写的PHP Web服务器。

相比之下,不用写<%的Python语言,其发展道路就更加general purpose一些: 1. 标准库中有os、multiprocess、threading、select等模块,一看就是面向系统编程而非仅仅针对Web开发 2. 标准库中的SocketServer及其MixIn classes、HTTPServer等可用于写服务器;CGI模块可用于解析HTTP协议请求 3. 标准库中的wsgiref是纯Python的。也就是说,用Python语言写一个WSGI Server很容易且是提倡的做法 4. yield语法加入语言比较早,可以实现协程 在Web应用方面,Python的WSGI接口已经基本统一江湖。WSGI不是通信协议,而是语言级别的调用约定(关于这个函数后面带几个什么样的参数的约定),而WSGI可以用纯Python实现,因此不会遇见用PHP实现SAPI的尴尬。由于Python没有像PHP那样深深的Web烙印*(甚至早年在Web上的部署并不太方便)*加上标准库中很早就带有各种基础模块,导向结果就是出现了很多优秀的高性能框架和服务器软件。现在流行的组合是用 gunicorn WSGI Server运行WSGI应用程序,管理多个worker充分利用多处理器,用gevent消除I/O等待时的浪费;对外提供HTTP服务,前面套一个nginx提供静态文件和访问控制、rewrite等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真正的高阶特征交叉:xDeepFM与DCN-V2

文 | 水哥源 | 知乎Saying1. xDeepFM和DCN-V2是真正的高阶交叉&#xff0c;和前面讲的High Order Factorization Machine&#xff08;HOFM&#xff09;又有着千丝万缕的联系。某种简化下&#xff0c;都能退化为HOFM的形式2. 如图3. 推荐模型迭代的时候要平衡涨点和复杂度的关系…

学术会议 | 中国杭州举办——第21届国际语义网大会​ISWC2022 Call for Papers

中国杭州举办&#xff01;ISWC2022 Call for Papers.ISWC(International Semantic Web Conference)是语义网和知识图谱领域的国际顶级学术会议&#xff0c;2022年10月23-27日&#xff0c;ISWC将在中国杭州举行&#xff0c;通过线上线下结合的方式&#xff0c;汇聚全世界相关的科…

LeetCode 82. 删除排序链表中的重复元素 II(链表)

1. 题目 给定一个排序链表&#xff0c;删除所有含有重复数字的节点&#xff0c;只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5示例 2: 输入: 1->1->1->2->3 输出: 2->3来源&#xff1a;力…

从 ACL’22 投稿情况,速览当下 NLP 研究热点!

文 | Yimin_饭煲编 | 小轶卖萌屋的作者们&#xff0c;最近可真是忙秃了头~&#xff0c;不仅要苦哈哈地赶 ACL 2022 提前了两个月的Deadline&#xff0c;还要尽心尽力为读者们提供高质量的内容。如果大家心疼卖萌屋的作者们的话&#xff0c;还请多多一键三连:)ACL2022 全部转向了…

YUI事件体系之Y.EventTarget

上两篇文章YUI事件体系之Y.Do、YUI事件体系之Y.CustomEvent中&#xff0c;分别介绍了YUI实现AOP的Y.Do对象&#xff0c;以及建立自定义事件机制的Y.CustomEvent对象。 本篇文章&#xff0c;将要介绍YUI事件体系集大成者、最为精华的部分——Y.EventTarget。 Y.EventTarget DOM事…

开源开放 | DeepKE发布新版本:支持低资源、长篇章、多任务的图谱抽取开源框架(浙江大学)...

OpenKG地址&#xff1a;http://openkg.cn/tool/deepkeGitHub地址&#xff1a;https://github.com/zjunlp/deepkeGitee地址&#xff1a;https://gitee.com/openkg/deepkeDeepKE网站&#xff1a;http://deepke.zjukg.org/CN/index.html开放许可协议&#xff1a;GPL 3.0贡献者&…

LeetCode 478. 在圆内随机生成点(概率)

1. 题目 给定圆的半径和圆心的 x、y 坐标&#xff0c;写一个在圆中产生均匀随机点的函数 randPoint 。 说明: 输入值和输出值都将是浮点数。圆的半径和圆心的 x、y 坐标将作为参数传递给类的构造函数。圆周上的点也认为是在圆中。randPoint 返回一个包含随机点的x坐标和y坐标…

11月AI大事件回顾:GPT3开放使用/女娲视觉大模型/AE文艺复兴/...

编 | iven感谢提供本期内容的 ZenMoore、 jxyxiangyu、付瑶大家好&#xff5e; 11月的新闻速报来啦&#xff01;上个月不知道大家有没有忙着写文章&#xff0c;反正小编是这样的&#xff1a;好啦&#xff0c;让我们快来回顾上个月的 AI 大新闻吧&#xff01;学术进展何恺明 Mas…

开源开放 | 开源立体化漏洞情报知识图谱(四维创智)

OpenKG地址&#xff1a;http://openkg.cn/dataset/vuln-sprocket开放许可协议&#xff1a;CC BY-SA 4.0 &#xff08;署名相似共享&#xff09;贡献者&#xff1a;四维创智&#xff08;李德斌&#xff0c;孙基栩&#xff0c;鲍晨阳&#xff09;1. 前言随着时间的推移&#xff0…

LeetCode 515. 在每个树行中找最大值(层序遍历)

1. 题目 您需要在二叉树的每一行中找到最大的值。 示例&#xff1a; 输入: 1/ \3 2/ \ \ 5 3 9 输出: [1, 3, 9]来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row 著作…

YUI事件体系之Y.CustomEvent

上一篇文章中&#xff0c;简要介绍了YUI实现AOP的Y.Do对象。 接下来&#xff0c;我们继续对YUI事件体系进行探索。本次要介绍的是Y.CustomEvent对象&#xff0c;从命名上就可以看出&#xff0c;这个对象在整个YUI事件体系中十分重要。它建立起整个自定义事件的体系&#xff0c;…

GBDT是如何成为推荐系统顶级工具人的?

文 | 水哥源 | 知乎Saying1. 集成学习的ensemble注意一定要读作昂三姆包而不是印三姆包&#xff0c;一天一个算法工程师装x小技巧2. 区别bagging和boosting的准则是&#xff0c;先训练的模型对于后训练的模型是否有影响3. GBDT中&#xff0c;B&#xff08;boosting&#xff09;…

会议交流 | 如何提升推荐系统的可解释性?——DataFunSummit2022知识图谱在线峰会...

背景介绍知识图谱及特征学习结合智能推荐&#xff0c;可解决数据稀疏性及冷启动问题&#xff0c;更好的提升推荐决策场的准确性、多样性及可解释性&#xff0c;进而提升各个场景的推荐决策效率和体验。3月12日13:30-16:50&#xff0c;在DataFunSummit2022&#xff1a;知识图谱在…

LeetCode 143. 重排链表(链表反转+快慢指针)

1. 题目 给定一个单链表 L&#xff1a;L0→L1→…→Ln-1→Ln &#xff0c; 将其重新排列后变为&#xff1a; L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为…

YUI事件体系之Y.Do

YUI团队在种种场合不断的夸耀自己的事件体系是多么强大&#xff1a; YUI 3′s Event module is one of the strengths of the library –Eric Miraglia, YUI Theater — Luke Smith: “Events Evolved”YUI 3 is not all about DOM manipulation — it also contains a robust …

论文浅尝 | 采用成对编码的图卷积网络用于知识图谱补全

笔记整理&#xff1a;姚祯&#xff0c;浙江大学在读硕士&#xff0c;研究方向为知识图谱表示学习&#xff0c;图神经网络。论文引用&#xff1a;Liu S, Grau B, Horrocks I, et al. INDIGO: GNN-based inductive knowledge graph completion using pair-wise encoding[J]. Adva…

调研了下 AI 作曲,顺便做了期视频...快进来听歌!

文 | 白鹡鸰编 | 小轶视频 | 白鹡鸰嗨&#xff0c;大家好&#xff01;这里是卖萌屋&#xff0c;我是白鹡鸰。今天和大家聊聊人工智能作曲。人工智能在音乐领域的应用已经非常常见了&#xff0c;像听歌识曲、曲风分类、自动扒谱等等&#xff0c;而 利用机器来替代人类作曲 &…

LeetCode 1275. 找出井字棋的获胜者(位运算)

1. 题目 A 和 B 在一个 3 x 3 的网格上玩井字棋。 井字棋游戏的规则如下&#xff1a; 玩家轮流将棋子放在空方格 (" ") 上。第一个玩家 A 总是用 “X” 作为棋子&#xff0c;而第二个玩家 B 总是用 “O” 作为棋子。“X” 和 “O” 只能放在空方格中&#xff0c;而…

论文浅尝 | DSKReG:基于关系GNN的推荐知识图谱可微抽样

笔记整理&#xff1a;李爽&#xff0c;天津大学硕士链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3459637.3482092动机在信息爆炸的时代&#xff0c;推荐系统被广泛研究和应用&#xff0c;以发现用户的偏好信息。RS在冷启动时性能较差&#xff0c;如果将知识图谱(Knowl…

改变世界,改善生活:我从科沃斯扫地机器人X1,看到了AI新的希望

深度学习是当代人工智能的核心&#xff0c;计算机视觉、语音、NLP则是当代人工智能落地的热门应用方向。然而&#xff0c;机器人、智能agent这种看起来更加“人工智能”的话题却在大众视野出现的越来越少&#xff0c;取而代之的热点讨论反而是看似与人工智能关联不是那么直接的…