有没有一种语言像 PHP 那样可以「所见即所得」的开发?

2022-05-15 04:33:45 +08:00
 Licsber

经常有一些项目的不同模块之间是依赖很少的
或者说不同模块都仅单向依赖通用的数据库模块
想要应用在简单的修改之后不必重启就可以热重载

像是 Python 的 Flask 蓝图机制
可能不同蓝图之间并不是互相依赖的
但是开发调试过程中就需要每次修改都重载一遍应用

我知道有 debug 模式的监听 但不至于在生产环境开 debug 模式
而这样的需求在 PHP 中甚至可以直接改线上环境

期待的想法:

  1. 代码的目录组织结构直接反映网页 api 结构
  2. 允许不同模块之间不一起启停
  3. 不同模块是无状态的 或仅通过交换信息来共享状态
  4. 允许持久化层被单向依赖 常驻运行 不受应用影响
  5. 甚至使用类 fpm 的机制 每次访问都启动一个进程 而不是前后端分离 前端打包之后 后端还要常驻并躲在反向代理之后
1964 次点击
所在节点    问与答
18 条回复
kran
2022-05-15 07:39:23 +08:00
我也有几乎一样的需求,现在用 java+nashorn 解决的:
1 ,很容易,有一个项目甚至是一个接口对应一个 js 文件
2 ,非 java 代码修改,不用重启
3 ,模块间通讯使用 guava asynceventbus
4 ,数据访问在 java ,连接池常驻
5 ,emmm 。。。fpm 机制并非如此,前后端分离也和并发机制和反代没啥关系,可能我没理解。
eason1874
2022-05-15 07:48:05 +08:00
各模块互相独立,这不就是微服务吗?做成微服务,不仅可以分开启停,分别用不同语言开发都行

热加载热部署,大部分语言都行,当然实现难度不一样,PHP 和 Nodejs 算是最简单的,Java 那些也行,前不久才看到美团一篇文章介绍他们的 Java 热部署方案
cyndihuifei
2022-05-15 08:38:46 +08:00
那还是 php 吧
sutra
2022-05-15 08:48:06 +08:00
这好像不是语言的问题,而是工程问题。
agdhole
2022-05-15 09:50:56 +08:00
PHP 这个模式就是导致它框架性能低下的原因之一吧
GeruzoniAnsasu
2022-05-15 10:35:18 +08:00
前端选手们: ?
westoy
2022-05-15 11:01:18 +08:00
"我知道有 debug 模式的监听 但不至于在生产环境开 debug 模式"

php 的热修改保证不了整个项目原子性的, 正经严肃一点的项目也是需要通过切换后端的方式修改的
wonderfulcxm
2022-05-15 11:19:28 +08:00
因为 PHP 每次请求都要重新加载一遍…
westoy
2022-05-15 11:30:14 +08:00
重新加载不至于, 有 opcache 的, 中古时代 apc 、eaccelerator 、xcache 这些都是正经项目的标配

但是认为 php 是热修改的绝对是邪道, 那是虚拟主机时代妥协的办法, 更新期间出错就出错吧, 也是针对不严肃的项目的, 就算 php4 时代, 大公司自己部署 php 的哪个不是用 svn 版本挂软链接重启后端的方式去做的, 搞在线改文件那种弄法出到问题要被点天灯的

甚至 Zend 搞的 phpcloud, 修改代码 push 上去, 直接上去刷新, 会提示你正在重启项目的, 应该没人比 Zend 更了解 PHP 吧........
Licsber
2022-05-15 15:20:17 +08:00
@kran #1 看了看这个框架 确实你说的第一点非常符合我的需求
我描述的大概也就是这个意思 有时候一个接口就是一个项目 或者说项目里的一个接口完全可以独立出来部署
我觉得这样简单的程序甚至不配有入口点 交给 nginx 啥的来管理都符合我心意
现在就是觉得麻烦 比如 python 开发 我是每个小项目都开一个 screen 然后 gunicorn run
手动找服务器上一个还没占用的端口 然后配置 traefik 反向代理 给这个接口套 tls 支持 https 访问
然后面临修改的时候就 screen -r 过去 同步代码 ctrl-c 再重新 run
我觉得更不值得为了这样的需求去每个小项目都 build 一个 docker 镜像
也尝试了自动构建方案 采用 gitea + drone 加 k3s 自动部署 这一套还是太麻烦 太笨重
我好想要 php 那样的体验 + python 带的库 看到 py-script 好像不是很符合我的需求
所以面对甚至单文件就可以独立成一个接口的需求 python 有方便的实现么
我没有提及 go 的原因是 go 不是动态语言 所以更倾向于 python 能够有这样的框架
Licsber
2022-05-15 15:22:45 +08:00
@eason1874 #2 确实很像微服务 可能我在这方面没啥研究 总觉得现有方案还是太复杂了
lnmp 那一套实在是太方便了 单接口像文件一样部署 也不用手动指定一个宿主机上没用的端口
只有 nginx 需要一个 443 端口 放在下面的所有 php 文件就可以用路径来方便访问
Licsber
2022-05-15 15:28:11 +08:00
@cyndihuifei #3 PHP 第三方库还是太少了 个人项目我现在基本都是 python 用顺手了

@sutra #4 这确实不是语言问题 应该算是我的问题 但我不太相信大家没有碰到相似的问题

@agdhole #5 确实 php 效率低下 但是我还是眼馋它的方便啊

@GeruzoniAnsasu #6 前端确实也非常方便 我也在考虑朝这方面习惯习惯

@westoy #7 php 热修改确实不是最佳实践 但是确实想要类似的平滑热更新功能
k8s 那套确实可以 几乎实现了全自动了 就是开始的那一套配置麻烦
shuimugan
2022-05-15 16:07:06 +08:00
看起来你的需求和 https://unit.nginx.org/ 解决的有些符合
Licsber
2022-05-15 16:23:16 +08:00
@shuimugan #13 看了看 nginx unit 确实挺像 可以考虑试试 不知道 traefik 有没有对标的产品
onion83
2022-05-15 17:01:37 +08:00
天天吹 php 慢的人,请说一下究竟慢在什么地方?等你们花里胡哨一阵操作下来,phper 早已经登上服务器 vim 整完下班了…
Aloento
2022-05-15 18:45:50 +08:00
你是否在找:.NET
DotNet 热重载在 Prod 模式也能开
但是最好的方案是做成插件然后直接动态替换整个程序集
Aloento
2022-05-15 18:48:43 +08:00
DotNet 对于小修小改可以直接替换对应的内存堆栈
大型修改就直接重载程序集即可
连 VM 都不用重开就能完成
最好的例子就是 Orchard Core
msg7086
2022-05-16 10:41:49 +08:00
@onion83 然后 vim 到一半一笔金融交易出错,莫名其妙搞出个几万块钱的生产事故?手动狗头

不是所有人都在搞小作坊式生产的。
正规的企业,正规的项目,至少要走完 CI/CD 让自动化系统来部署。
这不管是 Java 项目还是 PHP 项目还是基于 docker 的项目都是如此。

当然,因为有了自动化系统的部署,所以根本不需要花里胡哨的操作,按下合并分支按钮以后,看着系统把整套东西自动测试完部署上去就行了。

另外,很多其他语言都可以降级运行在热加载模式下,运行速度会变成和 PHP 一样慢(每次刷新页面都要检查文件是否更新),但是同样也能享受到 vim 改改就自动生效的效果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/852891

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX