因为受限于现有项目的逻辑,需要获取一个资源型变量的内存地址,然后在另一个进程中通过内存地址去调取那个资源型变量,找了半天,发现 PHP 中好像没有获取一个变量的内存地址的方法。
1
est 2019-04-01 13:42:36 +08:00
写接口啊。
LZ 在 golang 里实现过跨进程直接共享内存里的对象? |
2
changwei 2019-04-01 13:59:48 +08:00 via Android
我猜楼主没有修过操作系统这门课程?两个进程的地址空间是独立的,无法互相调用。除非开辟共享内存。所以你获取了地址也没什么用。
|
3
changwei 2019-04-01 14:01:10 +08:00 via Android
如果非要在 php 实现,我建议用 socket 来跨进程获取资源,或者用 swoole,他也内置提供了好几种跨进程交互数据方式。
|
4
misaka19000 2019-04-01 14:01:29 +08:00
楼上+1,所以楼主你在想什么?
|
5
alex8 2019-04-01 14:12:57 +08:00 via iPhone
shm
|
6
Actrace 2019-04-01 14:15:24 +08:00
变量地址传递使用 & 操作符,但是不能像 C 或者其他语言那样,用另外一个变量来存这个地址,而是直接镜像那个变量(虽然本质上是一样)。
php 本身的设计思想,就是让你不要碰什么内存地址,专心做上层业务。 跨进程传递资源,如果是全用 PHP 来实现的,可选方法很多,像 shm 之类的都很好用。 简单点的话,其实可以做成单进程多线程( pthread 库)的程序,这样变量共享会轻松很多。 |
7
zjyl1994 2019-04-01 14:19:27 +08:00
你什么语言都不可以取地址然后在别的进程里使用啊,建议封装一套接口让别人调用
|
8
weiqk 2019-04-01 15:21:31 +08:00 via Android
跨进程共享数据,一般的方案有 共享内存 临时文件 socket 管道,在 windows 上还有消息机制
显然你努力的方向错了 |
9
lolizeppelin 2019-04-01 15:56:59 +08:00
你觉得要是能实现的话,操作系统里的进程得崩得有多快....
|
10
kernelreload 2019-04-01 15:59:10 +08:00 via iPhone
@changwei 跨进程读写没有问题,而且 LZ 用 go 实现了,作为 workaround 原理上是没有问题的,只是稳定性需要调。参考游戏外挂的基本原理,别说 ring3 下的读写了,ring0 都能搞。
|
11
d5n 2019-04-01 16:03:35 +08:00 via iPhone
你朋友问你几点了,你本可以看一眼手表告诉他时间,但你非要朋友来抓住你的手自己看。
|
12
Rekkles 2019-04-01 16:05:10 +08:00
很好笑的笑话
|
13
zjsxwc 2019-04-01 16:05:23 +08:00
操作系统基础啊
|
14
wispx 2019-04-01 16:08:45 +08:00 via iPhone
好笑吗?🤭
|
15
yoshiyuki 2019-04-01 16:10:09 +08:00
建议发一下你用 GOLANG 实现的例子,这样大家比较方便确认 PHP 是否能实现
|
16
whitehack 2019-04-01 16:16:06 +08:00
@changwei 我猜层主没有了解过 windows 的 OpenProcess ReadProcessMemory. linux 是否有类似的不了解。
|
17
0ZXYDDu796nVCFxq 2019-04-01 16:36:10 +08:00 via Android
该补下大学基础课了
|
18
reus 2019-04-01 16:36:25 +08:00
用 socket 暴露,别做傻事。
PHP 有自动 GC,就算你用什么手段获取到地址,也毫无意义,因为地址可能变…… go 也类似,栈上对象的地址是可能变的,堆上地址未来也不保证不变,拿对象地址给其他进程毫无用处。再说了,各个进程地址是独立的,你给其他进程有啥用。 |
19
Cbdy 2019-04-01 16:42:29 +08:00
你需要了解的东西叫做进程间通信( IPC ),找本 OS 书翻翻吧
|
20
xiaotianhu 2019-04-01 19:04:52 +08:00
|
21
wdlth 2019-04-01 23:29:11 +08:00
用 Go 的 Unsafe ?
|
22
baiguangan 2019-04-02 09:46:15 +08:00
进程之间的内存地址不共享,线程之间可以,所以就算你拿到地址了也没有用。
|
23
chen2019 2019-04-29 18:40:57 +08:00 via Android
楼主都说是笑话了
|