Я хотел бы спросить, возможно ли создать общую память между 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)
Заранее спасибо!
Теоретически это кажется возможным. Однако практически это обычно не выполняется из-за различных реализаций совместно используемой памяти на разных платформах. Qt реализует свою собственную QSharedMemory
класс поверх других специфичных для системы API (которые различаются на разных платформах). PHP может сделать то же самое.
Вам нужно найти технику, которая совместима на обоих концах. Обращайте внимание на наиболее специфичный для ОС подход, поскольку здесь может быть общий знаменатель. Я не настолько опытен на платформе Linux, но:
Для платформы Windows я нашел этот ТАК вопрос который описывает файловую общую память из PHP. На стороне Qt вы можете использовать нормальный Windows API функции. Существует большая вероятность того, что эти два матча.
Другой подход заключается в использовании сокетов. Поначалу использование сетевого стека для межпроцессного взаимодействия может показаться излишним, но это имеет два очевидных преимущества:
memcpy()
вызов.Других решений пока нет …