V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wo642436249
V2EX  ›  PHP

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

  •  
  •   wo642436249 · 2019-04-01 13:39:42 +08:00 · 6236 次点击
    这是一个创建于 2099 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    23 条回复    2019-04-29 18:40:57 +08:00
    est
        1
    est  
       2019-04-01 13:42:36 +08:00
    写接口啊。

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

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

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

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

    PHP 有自动 GC,就算你用什么手段获取到地址,也毫无意义,因为地址可能变…… go 也类似,栈上对象的地址是可能变的,堆上地址未来也不保证不变,拿对象地址给其他进程毫无用处。再说了,各个进程地址是独立的,你给其他进程有啥用。
    Cbdy
        19
    Cbdy  
       2019-04-01 16:42:29 +08:00
    你需要了解的东西叫做进程间通信( IPC ),找本 OS 书翻翻吧
    xiaotianhu
        20
    xiaotianhu  
       2019-04-01 19:04:52 +08:00
    wdlth
        21
    wdlth  
       2019-04-01 23:29:11 +08:00
    用 Go 的 Unsafe ?
    baiguangan
        22
    baiguangan  
       2019-04-02 09:46:15 +08:00
    进程之间的内存地址不共享,线程之间可以,所以就算你拿到地址了也没有用。
    chen2019
        23
    chen2019  
       2019-04-29 18:40:57 +08:00 via Android
    楼主都说是笑话了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:42 · PVG 22:42 · LAX 06:42 · JFK 09:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.