【问题标题】:Share variables between python & php在 python 和 php 之间共享变量
【发布时间】:2017-09-10 13:01:23
【问题描述】:

我在 python 中有一个脚本,可以连续接收来自传感器的数据。

我需要使用 php 在网页上根据请求发布最后的数据。

Apache、php 和 python 都在同一个 linux 安装上(实际上是在树莓上)。

我对存储以前的数据不感兴趣,我有点担心在 SD 上写入时数据损坏。我更愿意降低复杂性并提高刷新速度(避免使用 sql)。

ramfs / tmpfs 编写的文本文件可以解决问题吗?或者有像 memcache 这样共享内存的方法来共享全局变量?

任何实际示例或操作方法都会被广泛接受。

【问题讨论】:

  • 你可以作为 php 的 HTTP post 值发送
  • 这是最初的解决方案,但实际上已被丢弃。
  • python 脚本数据不断变化,只能通过请求提供给用户(php 网页)。在我看来,php 页面必须读取“系统共享缓存”中的数据(从这里是 ramdisk 中文件的想法)

标签: php python linux memcached tmpfs


【解决方案1】:

我想你可以试试 System V 共享内存。

例如:

在 Python 方面: python -m pip install sysv_ipc

然后在 python 脚本的某个地方:

import sysv_ipc
...
KEY=20171220
sysv_memory=sysv_ipc.SharedMemory(KEY, sysv_ipc.IPC_CREAT, 0666, 256)
...
sysv_memory.write('1234'+'\0')

然后在PHP端:

$SHARED_MEMORY_KEY = 20171220;
...
$shmId = shmop_open($SHARED_MEMORY_KEY, 'a', 0666, 256);
...
$test_string = shmop_read($shmId, 0, 0);

我可以在 PHP 中成功获取 $test_string 为 '1234'。

【讨论】:

    【解决方案2】:

    这是一个使用 memcached 的解决方案,适用于 Raspbian 10 (buster)、PHP 7.3.19 和 Python 3.7.3:

    1.安装 memcached

    apt-get install memcached php-memcached
    pip install pymemcache
    

    这些命令为 PHP 和 Python 安装 memchached 服务器和客户端模块。

    2。 PHP代码

    $m = new Memcached();
    
    // connect
    $m->addServer('127.0.0.1', 11211);
    
    // get a value
    $value = $m->get('key');
    
    // set a value
    $m->set('key', 'value');
    
    // clean up
    $m->quit();
    

    3. Python 代码

    from pymemcache.client import base
    
    # connect
    m = base.Client(('127.0.0.1', 11211))
    
    # get a value
    value = m.get('key')
    
    # set a value
    m.set('key', 'value')
    
    # clean up
    m.close()
    

    注意:

    我在这里使用了默认的 memcached 设置。如果您需要更改它们,请编辑 sudo nano /etc/memcached.conf 并重新启动守护程序:sudo /etc/init.d/memcached restart

    【讨论】:

      【解决方案3】:

      您可以使用任何可互操作的格式,例如 json 或 msgpack。 每当您在 python 中生成数据时,使用 json 格式(最好是 gzip 压缩版本)将其添加到 memcache/redis 等缓存层,然后您的 PHP 脚本可以反序列化 json 数据并将其显示在应用程序中。

      【讨论】:

        【解决方案4】:

        显然,memcache 作为不同应用程序共享数据的一种方式是可行的。 您肯定不会有任何损坏的数据,因为所有 memcache 操作都是原子的。 memcache atomic 讨论可能很有用。

        关于 memcached 的常见问题解答:

        memcached 是原子的吗?除了您可能遇到的任何错误之外,是的,所有命令都是内部原子的。同时发行多套并没有任何不良影响,除了最后一套会粘住。

        注意:运行 memcache 服务可能会消耗大量内存。

        希望对你有帮助!

        【讨论】:

          最近更新 更多