在Java和PHP之间共享内存?

4

有人可以提供链接或片段,展示PHP进程写入内存并且Java进程从共享内存中读取的情况吗?

非常感谢您的答复。

编辑后的问题: 假设我像这样在PHP中创建了一个共享内存

<?php
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0644, 100);
$shm_bytes_written = shmop_write($shm_id, $my_string, 0);
?>

现在有没有一种方法可以传递$shm_id的值,然后在Java中读取它。


它是什么类型的数据?二进制还是文本?生命周期是多久?Java进程是独立应用程序还是Web应用程序? - gertas
文本数据和数据正在持续从服务器获取。Java进程是一个独立的应用程序。 - ayush
3个回答

8
如果您不需要Java和PHP之间的同步交互 - 我会使用memcachedmembase或其他类型的内存键存储。
另一种处理大量数据流的方法是使用Unix命名管道(FIFO)。这是IPC(进程间通信)中常见的方式。首先使用mkfifo命令创建管道作为普通文件。添加一些合理的访问权限。在PHP中,将管道以r+模式打开为普通文件,并写入,最后关闭。在Java端,您将其保持打开状态,作为普通文件并使用阻塞read/readline或非阻塞NIO进行连续读取。
与SHM相比,您无需使用JNI、共享内存同步、环形缓冲区实现、锁定和内存泄漏。您可以获得简单的读/写和最低开发成本的FIFO队列。
您可以像普通文件一样删除它。不要使用随机访问或seek,因为它是没有历史记录的实际流。

5
为什么不使用一些消息队列呢?你不能直接写入JVM的内存或与其他进程共享它。为了在不同进程之间通信,您可以利用消息队列技术。您可以运行消息队列,PHP可以轻松传输数据。Java应用程序可以读取队列,获取数据并相应处理。

实际上,我有一个共享内存,我的PHP代码在其中写入一些实时数据。这些数据实际上非常庞大。现在我希望我的Java代码能够读取这个内存。 - ayush
@ayush,据我所知,PHP API使用POSIX API来处理共享内存。你可以编写JNI例程并尝试通过它来访问共享内存。如果你坚持使用共享内存,我认为这是唯一的通信方式。 - Abdel Raoof Olakara
2
@ayush,数据有多大?消息队列大多数都是基于数据库的,可以处理相当大的数据。如果你按小时计费而且没有人在计算时间的话,自己编写JNI包装器是个好主意。 - Dan Rosenstark
...而且不包括维护噩梦。 - gertas
@Yar:数据大小就像每秒接收1000个字符。 - ayush

1

为了扩展阿卜杜勒的回答,我建议使用RabbitMQ,它有Java和PHP客户端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接