2016-01-18 3 views
1

Я хотел бы спросить, возможно ли создать общую память между qt-приложением и php-скриптом.Общая память между 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 on windows/qt ver.5.5)

Заранее благодарим!

ответ

2

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

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

Для платформы Windows я нашел this SO question, которая описывает файловую общую память из PHP. На стороне Qt вы можете использовать функции normal Windows API. Есть большая вероятность, что эти два матча.

Alternative

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

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

Благодарим за быстрый ответ. Мысль QSharedMem строится поверх Windows API. Я уже пробовал комьютер, но хотел ускорить свою задачу, используя разделяемую память. Но ваш пост мне очень помог. Спасибо. –

+0

Я уверен, что QSharedMem «как-то» построен поверх Windows API. Здесь важны детали. Если вы изучаете Windows API, вы видите, что существует несколько способов создания разделяемых областей памяти. Все они как-то связаны, но не обязательно совместимы. – user23573

Смежные вопросы