【问题标题】:Sharing memory between Java and PHP?在 Java 和 PHP 之间共享内存?
【发布时间】:2011-03-02 06:54:15
【问题描述】:

谁能提供链接或sn-ps,其中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 应用程序?
  • 它的文本数据和数据正在从服务器连续获取。 Java 进程是一个独立的应用程序。

标签: java php communication shared-memory


【解决方案1】:

如果您不需要 Java 和 PHP 之间的同步交互 - 我会使用 memcachedmembase 或其他类型的内存密钥存储。

对于大量数据流,另一种方法是使用 Unix 命名管道 (FIFO)。这是IPC(进程间通信)中的常用方式。 首先使用mkfifo 命令将管道创建为普通文件。添加一些合理的访问权限。在 PHP 中以r+ 模式打开管道作为普通文件并写入,最后关闭。在 Java 方面,您将其作为普通文件保持打开状态,并由 FileInputStream 使用阻塞 read/readline 或非阻塞 NIO 连续读取。

与 SHM 相比,您不必使用 JNI、共享内存同步、环形缓冲区实现、锁定和内存泄漏。您以最低的开发成本获得简单的读/写和 FIFO 队列。

您将其作为普通文件删除。不要使用随机访问或seek,因为它是没有历史记录的真实流。

【讨论】:

    【解决方案2】:

    为什么不使用一些消息队列?您不能从字面上写入 JVM 的内存或与其他进程共享它。

    为了在其他人之间进行交流,您可以使用Message Queue 技术。您可以运行消息队列,PHP 可以轻松传输数据。 java应用程序可以读取队列,获取数据并进行相应的处理。

    【讨论】:

    • 实际上我有一个共享内存,我的 php 代码在其中写入了一些实时数据。这个数据实际上是巨大的。现在我想让我的 java 代码读取这个内存。
    • @ayush,据我了解,PHP API 使用 POSIX api 来处理共享内存。您可以做的是拥有 JNI 例程并尝试通过它访问共享内存。如果你坚持使用共享内存,我认为这是唯一的沟通方式
    • @ayush,数据有多大?消息队列大多由数据库支持,可以处理大量数据。如果您按小时计费并且没有人计算,那么制作自己的 JNI 包装器才是一个好主意。
    • ...不算维护噩梦。
    • @Yar : 数据大小相当于每秒接收 1000 个字符。
    【解决方案3】:

    为了扩展 Abdel 的答案,我推荐 RabbitMQ,它有 Java 和 PHP 客户端。

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 2023-03-31
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      相关资源
      最近更新 更多