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

已经启动的 PHP 的进程,访问不到启动之后,新设置的环境变量,请问除了杀死进程,重启之外,还有什么解决办法吗?

  •  
  •   xiaoyanbot · 2022-05-07 16:27:14 +08:00 · 867 次点击
    这是一个创建于 959 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举例子,比如:

    ( 1 )首先当前的系统中不包含 AA 的系统变量,

    ( 2 )使用 nohup php -S localhost:80 启动的 PHP 进程,当某个 php 的文件中存在比如 getenv('AA') 和 getenv('AA',true)均获取不到 AA 的值。

    ( 3 )此时在 shell 里,执行 export AA=haha 的时候,新启动的 php 进程可以通过 getenv 访问到这个 AA 的值,

    但是前面第(2)步,已经启动的这个 php 进程,访问网页形式依然获取不到 新设置的 AA 的值,

    请问 除了杀死( 2 )中的进程,重启之外,还有什么办法可以让( 2 )的进程访问到 AA 的值吗?
    8 条回复    2022-05-07 18:07:40 +08:00
    heyjei
        1
    heyjei  
       2022-05-07 16:32:03 +08:00
    https://stackoverflow.com/questions/205064/is-there-a-way-to-change-the-environment-variables-of-another-process-in-unix

    (gdb) attach process_id

    (gdb) call putenv ("env_var_name=env_var_value")

    (gdb) detach
    weegc
        2
    weegc  
       2022-05-07 16:57:43 +08:00
    AA 的值不要缓存, 每次读取都是最新的环境变量值, 就不用重启进程
    有利有弊
    xiaoyanbot
        3
    xiaoyanbot  
    OP
       2022-05-07 17:01:55 +08:00
    了解了
    xiaoyanbot
        4
    xiaoyanbot  
    OP
       2022-05-07 17:02:21 +08:00
    @weegc 请问怎么每次读取最新的值?
    ysc3839
        5
    ysc3839  
       2022-05-07 17:03:58 +08:00
    用 IPC 之类的方法把新值传递给已经启动的进程。
    不过我怀疑这是个 X-Y Problem https://coolshell.cn/articles/10804.html 建议直接说原始需求。
    reneiw
        6
    reneiw  
       2022-05-07 17:22:57 +08:00
    环境变量在你命令行启动的一瞬间就会获取的,建议丢 redis 去取
    keepeye
        7
    keepeye  
       2022-05-07 17:25:37 +08:00
    干脆你就别用环境变量了吧,单独弄个 ini 文件,每次获取的时候对比文件修改时间,有更新就重新读取
    weegc
        8
    weegc  
       2022-05-07 18:07:40 +08:00
    @xiaoyanbot getenv('AA') 不行吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.