c ++ — общая память между PHP и QT

Я хотел бы спросить, возможно ли создать общую память между qt-приложением и php-скриптом.

Я оглянулся вокруг и выдвинул следующую (довольно простую) идею:

Qt — сторона

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

unsigned char data[5] = {1,2,3,4,5};
QSharedMemory smem;
smem.setNativeKey("12345");
qDebug() << smem.nativeKey();

if(smem.create(4096)){
qDebug() << "SharedMemory created.";
char *to = (char*)smem.data();
memcpy(to,data,5);
}
return a.exec();
}

php — сторона

<?php
$shm_ = shmop_open("12345", "w", 0,0);

if($shm_==FALSE){
echo "SHM Open Failed!";
}else{
$shm_s = shmop_size($shm_);
echo "SHM Open Succ! [Size : ".$shm_s."]<br>";
$data_read = shmop_read($shm_,0,5);
shmop_close($shm_);
}

?>

Но этот подход терпит неудачу. shmop_open () говорит: невозможно подключить или создать общую память. (работает xampp на windows / qt ver.5.5)

Заранее спасибо!

1

Решение

Теоретически это кажется возможным. Однако практически это обычно не выполняется из-за различных реализаций совместно используемой памяти на разных платформах. Qt реализует свою собственную QSharedMemory класс поверх других специфичных для системы API (которые различаются на разных платформах). PHP может сделать то же самое.

Вам нужно найти технику, которая совместима на обоих концах. Обращайте внимание на наиболее специфичный для ОС подход, поскольку здесь может быть общий знаменатель. Я не настолько опытен на платформе Linux, но:

Для платформы Windows я нашел этот ТАК вопрос который описывает файловую общую память из PHP. На стороне Qt вы можете использовать нормальный Windows API функции. Существует большая вероятность того, что эти два матча.

Другой подход заключается в использовании сокетов. Поначалу использование сетевого стека для межпроцессного взаимодействия может показаться излишним, но это имеет два очевидных преимущества:

  1. Связь через localhost быстрая. Я лично делал тесты на машине с Windows, сравнивая ее с реальной общей памятью. Затраты на сетевое решение были сопоставимы с затратами одного memcpy() вызов.
  2. Сетевой код по своей природе совместим, и оба, Qt и PHP, хорошо подходят для этого типа связи.
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector