Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Shared Memory и PHP [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: проблема
-КРОНОС-
Отправлено: 26 Июня, 2013 - 09:58:21
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




caballero пишет:
Цитата:
рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией...

потому что работа через shared memory сторонним приложением и есть самый настоящий костыль.
какие проблеммы с обменом через обычный файл?

я уже писал. Файл пишется 1 раз в секунду. Заявленный ресурс EEPROM - 15 млн. перезаписей. Таким образом производитель гарантирует что такая программа проработает 174 дня. Дальше - не гарантировано умрет.
(Добавление)
DeepVarvar пишет:
-КРОНОС- пишет:
кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
Кидайте. Но я уже скинул кусок кода для работы с шаред. Или вы не знаете как прикрутить его? Кидайте код на сях.

Я видел Ваш код. Пытался прикрутить - ничего не вышло.
CODE (htmlphp):
скопировать код в буфер обмена
  1. $shm_key = ftok('/dev/shm/wsi', 'b');
  2.  
  3. echo ($shm_key);
  4.  

Вот таким способом я получаю key... он возвращает какое-то значение. Дальше куда бы этот Key я ну пробовал - не возвращает ничего. пробовал Sem_get, sem_attach и прочее - все функции перебрал далее ничего не возвращает. сейчас код на C++ выложу но он большой...
(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. #include "rlsharedmemory.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #ifndef RLWIN32
  7. #include <unistd.h>
  8. #endif
  9.  
  10. #ifdef RLUNIX
  11. #include <sys/ipc.h>
  12. #include <sys/shm.h>
  13. #endif
  14.  
  15. #ifdef __VMS
  16. #include <starlet.h>
  17. #include <lib$routines.h>
  18. #include <descrip.h>
  19. #include <ssdef.h>
  20. #include <syidef.h>
  21. #include <secdef.h>
  22. #include <rms.h>
  23. #include <errno.h>
  24. #include <psldef.h>
  25. #include <dvidef.h>
  26. typedef struct
  27. {
  28.   long start;
  29.   long end;
  30. }
  31. ADD;
  32. #endif
  33.  
  34. #ifdef RLWIN32
  35. #include <windows.h>
  36. #endif
  37.  
  38. static void myinit(pthread_mutex_t *mutex)
  39. {
  40.   int *cnt = (int *) mutex;
  41.   *cnt = 0;
  42. }
  43.  
  44. static void mylock(pthread_mutex_t *mutex, int increment)
  45. {
  46.   int *cnt = (int *) mutex;
  47.   while(1)
  48.   {
  49. retry:
  50.     if(*cnt == 0)
  51.     { // try to lock the counter
  52.       (*cnt) += increment;
  53.       if(*cnt > 1)
  54.       {
  55.         (*cnt) -= increment;
  56.         goto retry; // another process also wanted to lock the counter
  57.       }
  58.       return;       // now we can do it
  59.     }
  60.     rlwthread_sleep(1);
  61.   }
  62. }
  63.  
  64. static void myunlock(pthread_mutex_t *mutex)
  65. {
  66.   int *cnt = (int *) mutex;
  67.   if(*cnt > 0) (*cnt)--;
  68. }
  69.  
  70. rlSharedMemory::rlSharedMemory(const char *shmname, unsigned long Size)
  71. {
  72. #ifdef RLUNIX
  73.   struct shmid_ds buf;
  74.   FILE *fp;
  75.   int file_existed;
  76.  
  77.   status  = OK;
  78.   name = new char[strlen(shmname)+1];
  79.   strcpy(name,shmname);
  80.   size    = Size + sizeof(*mutex);
  81.  
  82.   // create file
  83.   file_existed = 1;
  84.   fp = fopen(name,"r");
  85.   if(fp == NULL)
  86.   {
  87.     file_existed = 0;
  88.     fp = fopen(name,"w");
  89.     if(fp == NULL)    
  90.     {
  91.       int ret;
  92.       char buf[1024];
  93.       sprintf(buf,"could not write shm=%s\n",shmname);
  94.       ret = ::write(1,buf,strlen(buf));
  95.       if(ret < 0) exit(-1);
  96.      sprintf(buf,"you have to run this program as root !!!\n");
  97.      ret = ::write(1,buf,strlen(buf));
  98.      if(ret < 0) exit(-1);
  99.      status=ERROR_FILE;
  100.      exit(-1);
  101.    }
  102.  }
  103.  fclose(fp);
  104.  
  105.  // old stuff, without suggestions from Stefan Lievens
  106.  //shmkey  = ftok(name,0);
  107.  //
  108.  //id  = shmget(shmkey, size, IPC_CREAT);
  109.  
  110.  //shmkey  = ftok(name, 'R');
  111.  shmkey  = ftok(name, 'b');
  112.  
  113.  id  = shmget(shmkey, size, 0666 | IPC_CREAT);
  114.  if(id < 0)           { status=ERROR_SHMGET; return; }
  115.  
  116.  base_adr = (char *) shmat(id,NULL,0);
  117.  if(base_adr == NULL) { status=ERROR_SHMAT;  return; }
  118.  
  119.  if(shmctl(id, IPC_STAT, &buf) != 0) { status=ERROR_SHMCTL; return; };
  120.  
  121.  mutex     = (pthread_mutex_t *) base_adr;
  122.  user_adr  = base_adr + sizeof(*mutex);
  123.  //if(file_existed == 0) rlwthread_mutex_init(mutex,NULL);
  124.  if(file_existed == 0) myinit(mutex);
  125. #endif
  126. #ifdef __VMS
  127.  int file_existed = 0;
  128.  long ret,fd,page_size,pagelets,pagelet_size,file_block_size,flags,item,ident[2];
  129.  FILE *fp;
  130.  ADD  add_in,add_ret;
  131.  struct dsc$descriptor_s section_name;
  132.  struct FAB fab;
  133.  
  134.  status  = OK;
  135.  name = new char[strlen(shmname)+1];
  136.  strcpy(name,shmname);
  137.  size    = Size + sizeof(*mutex);
  138.  // The file block size is fixed
  139.  file_block_size = 512; // Bytes
  140.  // Get the page size
  141.  item = SYI$_PAGE_SIZE;
  142.  ret = lib$getsyi( &item       ,
  143.                    &page_size  ,
  144.                    0           ,
  145.                    0           ,
  146.                    0           ,
  147.                    0
  148.                   );
  149.  if(ret != SS$_NORMAL) { status=ERROR_FILE; return; }
  150.  // Fill descriptor for section name
  151.  section_name.dsc$w_length  = strlen(name);
  152.  section_name.dsc$a_pointer = name;
  153.  section_name.dsc$b_dtype   = DSC$K_DTYPE_T;
  154.  section_name.dsc$b_class   = DSC$K_CLASS_S;
  155.  // The pagelet size is fixed
  156.  pagelet_size = 512; // Bytes
  157.  // Get memory
  158.  if(size % page_size == 0) pagelets = size / pagelet_size;
  159.  else                      pagelets = (size / page_size + 1) * (page_size / pagelet_size);
  160.  ret = sys$expreg(pagelets,&add_ret,0,0);
  161.  if(ret != SS$_NORMAL) { status=ERROR_FILE; return; }
  162.  // Set the addresses
  163.  base_adr = (char *) add_ret.start;
  164.  user_adr = base_adr + sizeof(*mutex);
  165.  mutex    = (pthread_mutex_t *) base_adr;
  166.  if(base_adr == NULL) { status=ERROR_SHMAT;  return; }
  167.  // Fill the fab
  168.  fab = cc$rms_fab;                       // Initialize fab
  169.  fab.fab$b_fac = fab.fab$b_fac | FAB$M_PUT | FAB$M_DEL | FAB$M_GET | FAB$M_UPD;
  170.  fab.fab$l_fna = name;
  171.  fab.fab$b_fns = strlen(name);
  172.  fab.fab$l_fop = fab.fab$l_fop
  173.                      | FAB$M_CIF            // create file if not existent
  174.                      | FAB$M_CTG            // contiguous
  175.                      | FAB$M_UFO;           // user open
  176.  fab.fab$b_shr =   fab.fab$b_shr            // shareble access
  177.                      | FAB$M_SHRPUT
  178.                      | FAB$M_UPI;
  179.  fab.fab$l_alq = pagelets * pagelet_size / file_block_size;
  180.  // Open the section file
  181.  ret = sys$create (&fab);
  182.  if(ret != RMS$_NORMAL && ret != RMS$_CREATED)
  183.  {
  184.    sys$close (&fab);
  185.    status=ERROR_FILE;
  186.    return;
  187.  }
  188.  // Set the channel
  189.  fd = fab.fab$l_stv;
  190.  // Fill the input address
  191.  add_in.start = add_ret.start;
  192.  add_in.end   = add_ret.end;
  193.  // Clear ident
  194.  ident[0] = 0;
  195.  ident[1] = 0;
  196.  // Set flags
  197.  flags = 0;
  198.  flags = SEC$M_GBL | SEC$M_WRT | SEC$M_PERM;
  199.  // Create and map the section
  200.  ret = sys$crmpsc(&add_in ,&add_ret,
  201.                     (long)0       ,  // acmode
  202.                     flags         ,  // flags
  203.                     &section_name ,  // gsdnam
  204.                     &ident        ,  // ident
  205.                     (long)0       ,  // relpag
  206.                     (short)fd     ,  // chan
  207.                     pagelets      ,  // pagcnt
  208.                     (long)0       ,  // vbn
  209.                     (long)0       ,  // prot
  210.                     (long)0          // pfc
  211.                   );
  212.  if(ret != SS$_NORMAL && ret != SS$_CREATED)
  213.  {
  214.    sys$close(&fab);
  215.    status=ERROR_FILE;
  216.    return;
  217.  }
  218.  // Test the section addresses
  219.  if(add_in.start != add_ret.start || add_in.end != add_ret.end)
  220.  {
  221.    sys$close(&fab);
  222.    status=ERROR_FILE;
  223.    return;
  224.  }
  225.  // Close the section file
  226.  ret = sys$close(&fab);
  227.  // rlwthread_mutex_init(mutex,NULL);
  228.  if(file_existed == 0) myinit(mutex);
  229.  return;
  230. #endif
  231. #ifdef RLWIN32
  232.  HANDLE hFile, hShmem;
  233.  int file_existed;
  234.  
  235.  status  = OK;
  236.  name = new char[strlen(shmname)+1];
  237.  strcpy(name,shmname);
  238.  size    = Size + sizeof(*mutex);
  239.  
  240.  file_existed = 1;
  241.  hFile = CreateFile(name,
  242.                     GENERIC_READ | GENERIC_WRITE,
  243.                     FILE_SHARE_READ | FILE_SHARE_WRITE,
  244.                     NULL,
  245.                     OPEN_EXISTING,
  246.                     FILE_ATTRIBUTE_NORMAL,
  247.                     NULL
  248.                     );
  249.  if(hFile ==  INVALID_HANDLE_VALUE)
  250.  {
  251.    file_existed = 0;
  252.    hFile = CreateFile(name,
  253.                       GENERIC_READ | GENERIC_WRITE,
  254.                       FILE_SHARE_READ | FILE_SHARE_WRITE,
  255.                       NULL,
  256.                       CREATE_NEW,
  257.                       FILE_ATTRIBUTE_NORMAL,
  258.                       NULL
  259.                       );
  260.  }
  261.  if(hFile == INVALID_HANDLE_VALUE) { status=ERROR_FILE; return; }
  262.  hShmem = CreateFileMapping(
  263.    hFile,
  264.    NULL,                // no security attributes
  265.    PAGE_READWRITE,      // read/write access
  266.    0,                   // size: high 32-bits
  267.    size,                // size: low 32-bits
  268.    NULL);               // name of map object
  269.  if(hShmem == NULL) { status=ERROR_FILE; return; }
  270.  base_adr = (char *) MapViewOfFile(
  271.    hShmem,              // object to map view of
  272.    FILE_MAP_WRITE,      // read/write access
  273.    0,                   // high offset:  map from
  274.    0,                   // low offset:   beginning
  275.    0);                  // default: map entire file
  276.  if(base_adr == NULL) { status=ERROR_FILE; return; }
  277.  id     = (int) hShmem;
  278.  shmkey = (int) hFile;
  279.  mutex     = (pthread_mutex_t *) base_adr;
  280.  user_adr  = base_adr + sizeof(*mutex);
  281.  if(file_existed == 0) rlwthread_mutex_init(mutex,NULL);
  282. #endif
  283. }
  284.  
  285. rlSharedMemory::~rlSharedMemory()
  286. {
  287.  delete [] name;
  288. #ifdef RLWIN32
  289.  if(status != OK) return;
  290.  CloseHandle((HANDLE) id);
  291.  CloseHandle((HANDLE) shmkey);
  292. #endif
  293. }
  294.  
  295. int rlSharedMemory::deleteSharedMemory()
  296. {
  297. #ifdef RLUNIX
  298.  struct shmid_ds buf;
  299.  if(status != OK) return -1;
  300.  rlwthread_mutex_destroy(mutex);
  301.  shmctl(id, IPC_RMID, &buf);
  302.  size = 0;
  303.  return 0;
  304. #endif
  305. #ifdef __VMS
  306.  int ret;
  307.  ADD add_in,add_ret;
  308.  struct dsc$descriptor_s section_name;
  309.  
  310.  if(status != OK) return -1;
  311.  rlwthread_mutex_destroy(mutex);
  312.  // Fill descriptor for section name
  313.  section_name.dsc$w_length  = strlen(name);
  314.  section_name.dsc$a_pointer = name;
  315.  section_name.dsc$b_dtype   = DSC$K_DTYPE_T;
  316.  section_name.dsc$b_class   = DSC$K_CLASS_S;
  317.  // Delete the section
  318.  ret = sys$dgblsc(0,&section_name,0);
  319.  if(ret != SS$_NORMAL) return -1;
  320.  // Fill the input address
  321.  add_in.start = (long) base_adr;
  322.  add_in.end   = (long) base_adr + size;
  323.  // Free the memory
  324.  ret = sys$deltva(&add_in,&add_ret,0);
  325.  if(ret != SS$_NORMAL) return -1;
  326.  // Test the section addresses
  327.  if(add_in.start != add_ret.start || add_in.end != add_ret.end) return -1;
  328.  return 0;
  329. #endif
  330. #ifdef RLWIN32
  331.  if(status != OK) return -1;
  332.  rlwthread_mutex_destroy(mutex);
  333.  UnmapViewOfFile(base_adr);
  334.  CloseHandle((HANDLE) id);
  335.  CloseHandle((HANDLE) shmkey);
  336.  status = ~OK;
  337.  return 0;
  338. #endif
  339. }
  340.  
  341. int rlSharedMemory::write(unsigned long offset, const void *buf, int len)
  342. {
  343.  void *ptr;
  344.  if(status != OK)      return -1;
  345.  if(len <= 0)          return -1;
  346.  if(offset+len > size) return -1;
  347.   ptr = user_adr + offset;
  348. #ifdef RLWIN32
  349.   rlwthread_mutex_lock(mutex);   // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  350. #else
  351.   mylock(mutex,1);
  352. #endif
  353.   memcpy(ptr,buf,len);
  354. #ifdef RLWIN32
  355.   rlwthread_mutex_unlock(mutex); // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  356. #else
  357.   myunlock(mutex);
  358. #endif
  359.   return len;
  360. }
  361.  
  362. int rlSharedMemory::read(unsigned long offset, void *buf, int len)
  363. {
  364.   void *ptr;
  365.   if(status != OK)      return -1;
  366.   if(len <= 0)          return -1;
  367.  if(offset+len > size) return -1;
  368.   ptr = user_adr + offset;
  369. #ifdef RLWIN32
  370.   rlwthread_mutex_lock(mutex);   // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  371. #else
  372.   mylock(mutex,1);
  373. #endif
  374.   memcpy(buf,ptr,len);
  375. #ifdef RLWIN32
  376.   rlwthread_mutex_unlock(mutex); // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  377. #else
  378.   myunlock(mutex);
  379. #endif
  380.   return len;
  381. }
  382.  
  383. int rlSharedMemory::readInt(unsigned long offset, int index)
  384. {
  385.   int val;
  386.   if(index < 0) return -1;
  387.  read(offset+index*sizeof(val),&val,sizeof(val));
  388.  return val;
  389. }
  390.  
  391. int rlSharedMemory::readShort(unsigned long offset, int index)
  392. {
  393.  short int val;
  394.  if(index < 0) return -1;
  395.  read(offset+index*sizeof(val),&val,sizeof(val));
  396.  return val;
  397. }
  398.  
  399. int rlSharedMemory::readByte(unsigned long offset, int index)
  400. {
  401.  char val;
  402.  if(index < 0) return -1;
  403.  read(offset+index*sizeof(val),&val,sizeof(val));
  404.  return val;
  405. }
  406.  
  407. float rlSharedMemory::readFloat(unsigned long offset, int index)
  408. {
  409.  float val;
  410.  if(index < 0) return -1;
  411.  read(offset+index*sizeof(val),&val,sizeof(val));
  412.  return val;
  413. }
  414.  
  415. int rlSharedMemory::writeInt(unsigned long offset, int index, int val)
  416. {
  417.  int ret;
  418.  if(index < 0) return -1;
  419.  ret = write(offset+index*sizeof(val),&val,sizeof(val));
  420.  return ret;
  421. }
  422.  
  423. int rlSharedMemory::writeShort(unsigned long offset, int index, int val)
  424. {
  425.  int ret;
  426.  short int val2;
  427.  
  428.  if(index < 0) return -1;
  429.  val2 = (short int) val;
  430.  ret = write(offset+index*sizeof(val2),&val2,sizeof(val2));
  431.  return ret;
  432. }
  433.  
  434. int rlSharedMemory::writeByte(unsigned long offset, int index, unsigned char val)
  435. {
  436.  int ret;
  437.  if(index < 0) return -1;
  438.  ret = write(offset+index*sizeof(val),&val,sizeof(val));
  439.  return ret;
  440. }
  441.  
  442. int rlSharedMemory::writeFloat(unsigned long offset, int index, float val)
  443. {
  444.  int ret;
  445.  if(index < 0) return -1;
  446.  ret = write(offset+index*sizeof(val),&val,sizeof(val));
  447.  return ret;
  448. }
  449.  
  450. void *rlSharedMemory::getUserAdr()
  451. {
  452.  return (void *) user_adr;
  453. }
  454.  

вот код описывающий функции работы с Shared Memory. Он сейчас работает на контроллере.
(Добавление)
Со строки 70 идет класс непосредственно работающий с shared memory
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июня, 2013 - 10:19:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.
 
 Top
-КРОНОС-
Отправлено: 26 Июня, 2013 - 10:34:39
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




DeepVarvar пишет:
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.

ДА! Код пишет в файл! А я не хочу писать в файл. Я привел часть кода который сейчас фактически работает на контроллере. Он читает далнные из Шаред мемори и пишет их в файл. Но это не правльно. т.е. теоретически контроллер умрет. Тесты никто не проводил и не проведет. Соответсвенно я не хочу быть бета-тестером теста "сколько перезаписей файла выдрежит Eeprom. Тем более если я внедрю несколько десятков таких решений а они начнут умирать... Просто код ведь читает из шаред мемори. почему PHP не может? И еще там есть одна переменная mutex... она служит для разделения потоков заипси/чтения шаред мемори. Может дело в ней? может мне тоже в mutex'е при помощи php что-нибудь намудрить?
 
 Top
Stierus Супермодератор
Отправлено: 26 Июня, 2013 - 11:26:19
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




А зачем писать в файл? Есть php скрипт, который вызывает некое приложение, написанное вами, получает его вывод и дословно отдает клиенту (либо не дословно - как уж вы захотите). У вас показываются реальные данные на текущий момент + нет никаких файлов

http://www.php.net/manual/en/book.exec.php
(Добавление)
Я никогда не работал с шаред мемори в пхп, не удивлюсь, если этот функционал сырой, глючный или с ограничениями (например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm). Как вариант - вы можете написать свой модуль для php на си, реализующий все то, что вам нужно с доступом из php
 
My status
 Top
caballero
Отправлено: 26 Июня, 2013 - 11:32:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а в линухе разве нельзя изобразить что то типа файла в памяти
или точнее - отобразить обычный файл на память?
(Добавление)
или создать в памяти виртуальный диск например
линух же все равно пишет какие то временные файли и т.д.
(Добавление)
Цитата:
не удивлюсь, если этот функционал сырой, глючный или с ограничениями

я тоже удивляюсь почему юзают всякие там мемкеши если есть такая клевая шиука как shared memory


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
-КРОНОС-
Отправлено: 26 Июня, 2013 - 11:44:20
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Stierus пишет:
А зачем писать в файл? Есть php скрипт, который вызывает некое приложение, написанное вами, получает его вывод и дословно отдает клиенту (либо не дословно - как уж вы захотите). У вас показываются реальные данные на текущий момент + нет никаких файлов

http://www.php.net/manual/en/book.exec.php
(Добавление)
Я никогда не работал с шаред мемори в пхп, не удивлюсь, если этот функционал сырой, глючный или с ограничениями (например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm). Как вариант - вы можете написать свой модуль для php на си, реализующий все то, что вам нужно с доступом из php

Объясняю ще раз. Это свободнопрогрраммируемый промышленный контроллер (ПЛК). Он рабоает на ОС Linux. В Linux крутится ядро SMlogix которое выполянет пользовательские программы. Пользователь пишет программы на языке функциональных блоков (FBD). Данные из этой программы могут быть видны извне линуксу только через Shared Memory. Поэтому других вариантов как не пользоваться Shared Memory не существует. Далее. У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и пишет в файл с периодичностью 1 раз в секунду. Затем HTML страница считывает эти данные и обновляет при помощи функции AJAX без перезагрузки страницы. НО писать файл раз в 1 секунду - память захлопается через 174 дня (может и больше прорабоатет но всее-же это опасно). Я эе хочу написать код на PHP котрый бы брал данные напрямую из шаред мемори.
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июня, 2013 - 11:55:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




caballero пишет:
почему юзают всякие там мемкеши если есть такая клевая шиука как shared memory
Потому что мемкеш работает по протоколу http и засим можно разместить его удаленно.
Stierus пишет:
например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm
Нет, работает из любого инстанса, за исключение если это не модуль апача.
 
 Top
Stierus Супермодератор
Отправлено: 26 Июня, 2013 - 11:57:34
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Объясняю ще раз. Это свободнопрогрраммируемый промышленный контроллер (ПЛК). Он рабоает на ОС Linux. В Linux крутится ядро SMlogix которое выполянет пользовательские программы. Пользователь пишет программы на языке функциональных блоков (FBD). Данные из этой программы могут быть видны извне линуксу только через Shared Memory. Поэтому других вариантов как не пользоваться Shared Memory не существует. Далее.

У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и отправялет на стандартный вывод. Из пхп я с помощью одной из функций http://www.php.net/manual/en/book.exec.php запускаю эту программу и получаю ее вывод. Никаких файлов у меня нет, никакой пхп у меня не работает с разделяемой памятью, есть системный вызов другой программы и отдача его выводау. Затем HTML страница при помощи функции AJAX без перезагрузки страницы обращается раз в секунду к этому скрипту и отрисовывает полученные данные.
 
My status
 Top
caballero
Отправлено: 26 Июня, 2013 - 12:03:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




о в чем трудность написать на С++ маленькую утилитку которая будет писать данные в shared memory и вызыватся из под PHP . Состыковать с контроллером обмен данных будет намного проще чем непосредственно из PHP.

Цитата:
Потому что мемкеш работает по протоколу http.
а в нем что встроенный веб сервер? я думал там конект по TCP идет.

Цитата:
можно разместить его удаленно.

да, если речь об распределеном решении но в большинстве случаев его ставят рядом с сайтом


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июня, 2013 - 12:03:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Stierus пишет:
У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и отправялет на стандартный вывод. Из пхп я с помощью одной из функций ...
Верно. Но зачем, если пых и сам умеет шаред?
Я с ним работал - это намного надежнее мемкеша того же - т.к. не бывает просеров с одновременно пишущими клиентами - все сидят в честной очереди на чтение/запись.
(Добавление)
caballero пишет:
встроенный веб сервер? я думал там конект по TCP идет.
Верно - я опичатался тут.
(Добавление)
caballero пишет:
да, если речь об распределеном решении но в большинстве случаев его ставят рядом с сайтом
Ну так что нагугливается больше, то и юзают. Плюс - в режиме апачемодуля пых не умеет шареды (ну не умел в 5.2 под дебианом, щакс проверять лениво).
 
 Top
Stierus Супермодератор
Отправлено: 26 Июня, 2013 - 12:08:44
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




DeepVarvar, еще раз, я не уверен, что php работает с разделяемой памятью вне адресного пронстранства php-fpm либо веб-сервера
 
My status
 Top
Ch_chov
Отправлено: 26 Июня, 2013 - 12:10:29
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




-КРОНОС-, А чём всё таки не устраивает вариант с tmpfs?
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Июня, 2013 - 12:12:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Stierus пишет:
еще раз, я не уверен, что php работает с разделяемой памятью вне адресного пронстранства php-fpm либо веб-сервера
Он работает именно напрямую с памятью, а не изолировано в клетке. Я в этом уверен - писал такой ф-ционал.
 
 Top
Ch_chov
Отправлено: 26 Июня, 2013 - 12:13:44
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Цитата:
я не уверен, что php работает с разделяемой памятью вне адресного пронстранства php-fpm либо веб-сервера

Вот на гуглил: http://www[dot]raspberry-projects[dot]co[dot][dot][dot]d-php-web-server
 
 Top
Stierus Супермодератор
Отправлено: 26 Июня, 2013 - 12:21:46
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Ch_chov, спасибо, посмотрю
 
My status
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Операционная система и системные вызовы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB