1

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

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

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

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

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

在此处输入图像描述

任何实际的例子或howto都会被很好地接受。

4

4 回答 4

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'。

于 2018-12-20T10:09:33.423 回答
1

这是一个使用 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.

于 2020-12-24T10:28:14.940 回答
0

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

在 memcached 的常见问题解答中:

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

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

希望能帮助到你!

于 2017-09-13T06:35:57.503 回答
0

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

于 2017-09-11T09:32:06.453 回答