
因为受限于现有项目的逻辑,需要获取一个资源型变量的内存地址,然后在另一个进程中通过内存地址去调取那个资源型变量,找了半天,发现 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 xaxb 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 UFc8704I4Bv63gy2 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 4DAX07B8Kle4Dm6T 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 楼主都说是笑话了 |