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

2019-04-01 13:39:42 +08:00
 wo642436249

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

5983 次点击
所在节点    PHP
23 条回复
est
2019-04-01 13:42:36 +08:00
写接口啊。

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

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

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

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

PHP 有自动 GC,就算你用什么手段获取到地址,也毫无意义,因为地址可能变…… go 也类似,栈上对象的地址是可能变的,堆上地址未来也不保证不变,拿对象地址给其他进程毫无用处。再说了,各个进程地址是独立的,你给其他进程有啥用。
Cbdy
2019-04-01 16:42:29 +08:00
你需要了解的东西叫做进程间通信( IPC ),找本 OS 书翻翻吧
xiaotianhu
2019-04-01 19:04:52 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX