Делитесь переменными между python и php

У меня есть скрипт на python, постоянно получающий данные с датчиков.

Мне нужно опубликовать последние данные по запросу на веб-странице с помощью php.

Apache, php и python находятся в одной и той же установке Linux (фактически на малине).

Меня не интересует сохранение предыдущих данных, и меня немного беспокоит повреждение данных при записи на SD. Я бы предпочел уменьшить сложность и увеличить скорость обновления (избегайте sql).

Может ли текстовый файл, написанный на ramfs / tmpfs, решить проблему? или есть способ совместного использования памяти, такой как memcache, чтобы совместно использовать глобальные переменные?

введите здесь описание изображения

Любой практический пример или руководство будет действительно хорошо принят.


person Andrea Zannoni    schedule 10.09.2017    source источник
comment
вы можете отправить как значение HTTP-сообщения для php   -  person scaisEdge    schedule 10.09.2017
comment
Это было первоначальное решение, но на самом деле от него отказались.   -  person Andrea Zannoni    schedule 10.09.2017
comment
Данные скрипта Python постоянно изменяются и должны быть доступны пользователю (веб-странице php) только по запросу. На мой взгляд, php-страница должна читать данные в системном общем кеше (отсюда идея файла на виртуальном диске)   -  person Andrea Zannoni    schedule 10.09.2017


Ответы (4)


Вы можете использовать любой совместимый формат, такой как json или msgpack. Всякий раз, когда вы генерируете данные в python, добавляйте их в слой кэширования, такой как memcache/redis, используя формат json (и предпочтительно сжатую версию gzip), тогда ваш PHP-скрипт может десериализовать данные json и отображать их в приложении.

person DhruvPathak    schedule 11.09.2017

Ясно, что memcache как средство обмена данными подойдет для разных приложений. У вас точно не будет поврежденных данных, так как все операции memcache являются атомарными. Обсуждение memcache atomic может быть полезным.

В FAQ по memcached:

Является ли memcached атомарным? Помимо любых ошибок, с которыми вы можете столкнуться, да, все команды внутренне атомарны. Выдача нескольких наборов одновременно не имеет вредного эффекта, за исключением того, что последний из них является тем, который прилипает.

Примечание. Запуск службы кэша памяти может потреблять значительный объем памяти.

Надеюсь, поможет!

person arunk2    schedule 13.09.2017

Я думаю, вы можете попробовать разделяемую память 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);

Я могу успешно получить $test_string как «1234» в PHP.

person super_ylam    schedule 20.12.2018

Вот решение с использованием memcached, которое работает на Raspbian 10 (buster), PHP 7.3.19 и Python 3.7.3:

<сильный>1. Установить memcached

apt-get install memcached php-memcached
pip install pymemcache

Эти команды устанавливают серверные и клиентские модули memchached для PHP и Python.

<сильный>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.

person Mike    schedule 24.12.2020