V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
wo642436249
V2EX  ›  PHP

问一个笑话, PHP 能不能像 Golang 等语言一样获取一个变量的内存地址?

  •  
  •   wo642436249 · Apr 1, 2019 · 6946 views
    This topic created in 2583 days ago, the information mentioned may be changed or developed.

    因为受限于现有项目的逻辑,需要获取一个资源型变量的内存地址,然后在另一个进程中通过内存地址去调取那个资源型变量,找了半天,发现 PHP 中好像没有获取一个变量的内存地址的方法。

    23 replies    2019-04-29 18:40:57 +08:00
    est
        1
    est  
       Apr 1, 2019
    写接口啊。

    LZ 在 golang 里实现过跨进程直接共享内存里的对象?
    changwei
        2
    changwei  
       Apr 1, 2019 via Android
    我猜楼主没有修过操作系统这门课程?两个进程的地址空间是独立的,无法互相调用。除非开辟共享内存。所以你获取了地址也没什么用。
    changwei
        3
    changwei  
       Apr 1, 2019 via Android
    如果非要在 php 实现,我建议用 socket 来跨进程获取资源,或者用 swoole,他也内置提供了好几种跨进程交互数据方式。
    misaka19000
        4
    misaka19000  
       Apr 1, 2019
    楼上+1,所以楼主你在想什么?
    xaxb
        5
    xaxb  
       Apr 1, 2019 via iPhone
    shm
    Actrace
        6
    Actrace  
       Apr 1, 2019
    变量地址传递使用 & 操作符,但是不能像 C 或者其他语言那样,用另外一个变量来存这个地址,而是直接镜像那个变量(虽然本质上是一样)。

    php 本身的设计思想,就是让你不要碰什么内存地址,专心做上层业务。
    跨进程传递资源,如果是全用 PHP 来实现的,可选方法很多,像 shm 之类的都很好用。

    简单点的话,其实可以做成单进程多线程( pthread 库)的程序,这样变量共享会轻松很多。
    zjyl1994
        7
    zjyl1994  
       Apr 1, 2019
    你什么语言都不可以取地址然后在别的进程里使用啊,建议封装一套接口让别人调用
    UFc8704I4Bv63gy2
        8
    UFc8704I4Bv63gy2  
       Apr 1, 2019 via Android
    跨进程共享数据,一般的方案有 共享内存 临时文件 socket 管道,在 windows 上还有消息机制

    显然你努力的方向错了
    lolizeppelin
        9
    lolizeppelin  
       Apr 1, 2019
    你觉得要是能实现的话,操作系统里的进程得崩得有多快....
    kernelreload
        10
    kernelreload  
       Apr 1, 2019 via iPhone
    @changwei 跨进程读写没有问题,而且 LZ 用 go 实现了,作为 workaround 原理上是没有问题的,只是稳定性需要调。参考游戏外挂的基本原理,别说 ring3 下的读写了,ring0 都能搞。
    d5n
        11
    d5n  
       Apr 1, 2019 via iPhone
    你朋友问你几点了,你本可以看一眼手表告诉他时间,但你非要朋友来抓住你的手自己看。
    Rekkles
        12
    Rekkles  
       Apr 1, 2019
    很好笑的笑话
    zjsxwc
        13
    zjsxwc  
       Apr 1, 2019
    操作系统基础啊
    4DAX07B8Kle4Dm6T
        14
    4DAX07B8Kle4Dm6T  
       Apr 1, 2019 via iPhone
    好笑吗?🤭
    yoshiyuki
        15
    yoshiyuki  
       Apr 1, 2019
    建议发一下你用 GOLANG 实现的例子,这样大家比较方便确认 PHP 是否能实现
    whitehack
        16
    whitehack  
       Apr 1, 2019
    @changwei 我猜层主没有了解过 windows 的 OpenProcess ReadProcessMemory. linux 是否有类似的不了解。
    0ZXYDDu796nVCFxq
        17
    0ZXYDDu796nVCFxq  
       Apr 1, 2019 via Android
    该补下大学基础课了
    reus
        18
    reus  
       Apr 1, 2019
    用 socket 暴露,别做傻事。

    PHP 有自动 GC,就算你用什么手段获取到地址,也毫无意义,因为地址可能变…… go 也类似,栈上对象的地址是可能变的,堆上地址未来也不保证不变,拿对象地址给其他进程毫无用处。再说了,各个进程地址是独立的,你给其他进程有啥用。
    Cbdy
        19
    Cbdy  
       Apr 1, 2019
    你需要了解的东西叫做进程间通信( IPC ),找本 OS 书翻翻吧
    xiaotianhu
        20
    xiaotianhu  
       Apr 1, 2019
    wdlth
        21
    wdlth  
       Apr 1, 2019
    用 Go 的 Unsafe ?
    baiguangan
        22
    baiguangan  
       Apr 2, 2019
    进程之间的内存地址不共享,线程之间可以,所以就算你拿到地址了也没有用。
    chen2019
        23
    chen2019  
       Apr 29, 2019 via Android
    楼主都说是笑话了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3200 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 13:40 · PVG 21:40 · LAX 06:40 · JFK 09:40
    ♥ Do have faith in what you're doing.