V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Licsber
V2EX  ›  问与答

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

  •  
  •   Licsber · 2022-05-15 04:33:45 +08:00 · 1937 次点击
    这是一个创建于 683 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    期待的想法:

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

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

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

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

    甚至 Zend 搞的 phpcloud, 修改代码 push 上去, 直接上去刷新, 会提示你正在重启项目的, 应该没人比 Zend 更了解 PHP 吧........
    Licsber
        10
    Licsber  
    OP
       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
        11
    Licsber  
    OP
       2022-05-15 15:22:45 +08:00
    @eason1874 #2 确实很像微服务 可能我在这方面没啥研究 总觉得现有方案还是太复杂了
    lnmp 那一套实在是太方便了 单接口像文件一样部署 也不用手动指定一个宿主机上没用的端口
    只有 nginx 需要一个 443 端口 放在下面的所有 php 文件就可以用路径来方便访问
    Licsber
        12
    Licsber  
    OP
       2022-05-15 15:28:11 +08:00
    @cyndihuifei #3 PHP 第三方库还是太少了 个人项目我现在基本都是 python 用顺手了

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

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

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

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

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

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

    另外,很多其他语言都可以降级运行在热加载模式下,运行速度会变成和 PHP 一样慢(每次刷新页面都要检查文件是否更新),但是同样也能享受到 vim 改改就自动生效的效果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2373 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:11 · PVG 00:11 · LAX 09:11 · JFK 12:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.