wo642436249
V2EX  ›  PHP

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

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

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

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

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

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

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

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

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