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
Форумы портала PHP.SU :: Версия для печати :: Shared Memory и PHP [2]
Форумы портала PHP.SU » » Операционная система и системные вызовы » Shared Memory и PHP

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

16. -КРОНОС- - 26 Июня, 2013 - 09:58:21 - перейти к сообщению
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
17. DeepVarvar - 26 Июня, 2013 - 10:19:42 - перейти к сообщению
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.
18. -КРОНОС- - 26 Июня, 2013 - 10:34:39 - перейти к сообщению
DeepVarvar пишет:
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.

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

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

я тоже удивляюсь почему юзают всякие там мемкеши если есть такая клевая шиука как shared memory
21. -КРОНОС- - 26 Июня, 2013 - 11:44:20 - перейти к сообщению
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 котрый бы брал данные напрямую из шаред мемори.
22. DeepVarvar - 26 Июня, 2013 - 11:55:42 - перейти к сообщению
caballero пишет:
почему юзают всякие там мемкеши если есть такая клевая шиука как shared memory
Потому что мемкеш работает по протоколу http и засим можно разместить его удаленно.
Stierus пишет:
например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm
Нет, работает из любого инстанса, за исключение если это не модуль апача.
23. Stierus - 26 Июня, 2013 - 11:57:34 - перейти к сообщению
Объясняю ще раз. Это свободнопрогрраммируемый промышленный контроллер (ПЛК). Он рабоает на ОС Linux. В Linux крутится ядро SMlogix которое выполянет пользовательские программы. Пользователь пишет программы на языке функциональных блоков (FBD). Данные из этой программы могут быть видны извне линуксу только через Shared Memory. Поэтому других вариантов как не пользоваться Shared Memory не существует. Далее.

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

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

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

да, если речь об распределеном решении но в большинстве случаев его ставят рядом с сайтом
25. DeepVarvar - 26 Июня, 2013 - 12:03:14 - перейти к сообщению
Stierus пишет:
У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и отправялет на стандартный вывод. Из пхп я с помощью одной из функций ...
Верно. Но зачем, если пых и сам умеет шаред?
Я с ним работал - это намного надежнее мемкеша того же - т.к. не бывает просеров с одновременно пишущими клиентами - все сидят в честной очереди на чтение/запись.
(Добавление)
caballero пишет:
встроенный веб сервер? я думал там конект по TCP идет.
Верно - я опичатался тут.
(Добавление)
caballero пишет:
да, если речь об распределеном решении но в большинстве случаев его ставят рядом с сайтом
Ну так что нагугливается больше, то и юзают. Плюс - в режиме апачемодуля пых не умеет шареды (ну не умел в 5.2 под дебианом, щакс проверять лениво).
26. Stierus - 26 Июня, 2013 - 12:08:44 - перейти к сообщению
DeepVarvar, еще раз, я не уверен, что php работает с разделяемой памятью вне адресного пронстранства php-fpm либо веб-сервера
27. Ch_chov - 26 Июня, 2013 - 12:10:29 - перейти к сообщению
-КРОНОС-, А чём всё таки не устраивает вариант с tmpfs?
28. DeepVarvar - 26 Июня, 2013 - 12:12:33 - перейти к сообщению
Stierus пишет:
еще раз, я не уверен, что php работает с разделяемой памятью вне адресного пронстранства php-fpm либо веб-сервера
Он работает именно напрямую с памятью, а не изолировано в клетке. Я в этом уверен - писал такой ф-ционал.
29. Ch_chov - 26 Июня, 2013 - 12:13:44 - перейти к сообщению
Цитата:
я не уверен, что php работает с разделяемой памятью вне адресного пронстранства php-fpm либо веб-сервера

Вот на гуглил: http://www[dot]raspberry-projects[dot]co[dot][dot][dot]d-php-web-server
30. Stierus - 26 Июня, 2013 - 12:21:46 - перейти к сообщению
Ch_chov, спасибо, посмотрю

 

Powered by ExBB FM 1.0 RC1