问一个笑话, PHP 能不能像 Golang 等语言一样获取一个变量的内存地址? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wo642436249
V2EX    PHP

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

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

    因为受限于现有项目的逻辑,需要获取一个资源型变量的内存地址,然后在另一个进程中通过内存地址去调取那个资源型变量,找了半天,发现 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,所以楼主你在想什么?
    xaxb
        5
    xaxb  
       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
    操作系统基础啊
    4DAX07B8Kle4Dm6T
        14
    4DAX07B8Kle4Dm6T  
       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     Solana     864 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 19:20 PVG 03:20 LAX 11:20 JFK 14:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86