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]
Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010
Помог: 0 раз(а)
caballero пишет:
Цитата:
рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией...
потому что работа через shared memory сторонним приложением и есть самый настоящий костыль.
какие проблеммы с обменом через обычный файл?
я уже писал. Файл пишется 1 раз в секунду. Заявленный ресурс EEPROM - 15 млн. перезаписей. Таким образом производитель гарантирует что такая программа проработает 174 дня. Дальше - не гарантировано умрет. (Добавление)
DeepVarvar пишет:
-КРОНОС- пишет:
кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
Кидайте. Но я уже скинул кусок кода для работы с шаред. Или вы не знаете как прикрутить его? Кидайте код на сях.
Я видел Ваш код. Пытался прикрутить - ничего не вышло.
Вот таким способом я получаю key... он возвращает какое-то значение. Дальше куда бы этот Key я ну пробовал - не возвращает ничего. пробовал Sem_get, sem_attach и прочее - все функции перебрал далее ничего не возвращает. сейчас код на C++ выложу но он большой... (Добавление)
int rlSharedMemory::writeInt(unsigned long offset, int index, int val)
{
int ret;
if(index < 0)return-1;
ret = write(offset+index*sizeof(val),&val,sizeof(val));
return ret;
}
int rlSharedMemory::writeShort(unsigned long offset, int index, int val)
{
int ret;
short int val2;
if(index < 0)return-1;
val2 =(short int) val;
ret = write(offset+index*sizeof(val2),&val2,sizeof(val2));
return ret;
}
int rlSharedMemory::writeByte(unsigned long offset, int index, unsigned char val)
{
int ret;
if(index < 0)return-1;
ret = write(offset+index*sizeof(val),&val,sizeof(val));
return ret;
}
int rlSharedMemory::writeFloat(unsigned long offset, int index, float val)
{
int ret;
if(index < 0)return-1;
ret = write(offset+index*sizeof(val),&val,sizeof(val));
return ret;
}
void *rlSharedMemory::getUserAdr()
{
return(void *) user_adr;
}
вот код описывающий функции работы с Shared Memory. Он сейчас работает на контроллере. (Добавление)
Со строки 70 идет класс непосредственно работающий с shared memory
DeepVarvar
Отправлено: 26 Июня, 2013 - 10:19:42
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.
Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2010
Помог: 0 раз(а)
DeepVarvar пишет:
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.
ДА! Код пишет в файл! А я не хочу писать в файл. Я привел часть кода который сейчас фактически работает на контроллере. Он читает далнные из Шаред мемори и пишет их в файл. Но это не правльно. т.е. теоретически контроллер умрет. Тесты никто не проводил и не проведет. Соответсвенно я не хочу быть бета-тестером теста "сколько перезаписей файла выдрежит Eeprom. Тем более если я внедрю несколько десятков таких решений а они начнут умирать... Просто код ведь читает из шаред мемори. почему PHP не может? И еще там есть одна переменная mutex... она служит для разделения потоков заипси/чтения шаред мемори. Может дело в ней? может мне тоже в mutex'е при помощи php что-нибудь намудрить?
Stierus
Отправлено: 26 Июня, 2013 - 11:26:19
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
А зачем писать в файл? Есть php скрипт, который вызывает некое приложение, написанное вами, получает его вывод и дословно отдает клиенту (либо не дословно - как уж вы захотите). У вас показываются реальные данные на текущий момент + нет никаких файлов
http://www.php.net/manual/en/book.exec.php (Добавление)
Я никогда не работал с шаред мемори в пхп, не удивлюсь, если этот функционал сырой, глючный или с ограничениями (например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm). Как вариант - вы можете написать свой модуль для php на си, реализующий все то, что вам нужно с доступом из php
caballero
Отправлено: 26 Июня, 2013 - 11:32:53
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
а в линухе разве нельзя изобразить что то типа файла в памяти
или точнее - отобразить обычный файл на память? (Добавление)
или создать в памяти виртуальный диск например
линух же все равно пишет какие то временные файли и т.д. (Добавление)
Цитата:
не удивлюсь, если этот функционал сырой, глючный или с ограничениями
я тоже удивляюсь почему юзают всякие там мемкеши если есть такая клевая шиука как shared memory
Покинул форум
Сообщений всего: 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 котрый бы брал данные напрямую из шаред мемори.
DeepVarvar
Отправлено: 26 Июня, 2013 - 11:55:42
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
caballero пишет:
почему юзают всякие там мемкеши если есть такая клевая шиука как shared memory
Потому что мемкеш работает по протоколу http и засим можно разместить его удаленно.
Stierus пишет:
например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm
Нет, работает из любого инстанса, за исключение если это не модуль апача.
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Объясняю ще раз. Это свободнопрогрраммируемый промышленный контроллер (ПЛК). Он рабоает на ОС Linux. В Linux крутится ядро SMlogix которое выполянет пользовательские программы. Пользователь пишет программы на языке функциональных блоков (FBD). Данные из этой программы могут быть видны извне линуксу только через Shared Memory. Поэтому других вариантов как не пользоваться Shared Memory не существует. Далее.
У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и отправялет на стандартный вывод. Из пхп я с помощью одной из функций http://www.php.net/manual/en/book.exec.php запускаю эту программу и получаю ее вывод. Никаких файлов у меня нет, никакой пхп у меня не работает с разделяемой памятью, есть системный вызов другой программы и отдача его выводау. Затем HTML страница при помощи функции AJAX без перезагрузки страницы обращается раз в секунду к этому скрипту и отрисовывает полученные данные.
caballero
Отправлено: 26 Июня, 2013 - 12:03:10
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
о в чем трудность написать на С++ маленькую утилитку которая будет писать данные в shared memory и вызыватся из под PHP . Состыковать с контроллером обмен данных будет намного проще чем непосредственно из PHP.
Цитата:
Потому что мемкеш работает по протоколу http.
а в нем что встроенный веб сервер? я думал там конект по TCP идет.
Цитата:
можно разместить его удаленно.
да, если речь об распределеном решении но в большинстве случаев его ставят рядом с сайтом
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Stierus пишет:
У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и отправялет на стандартный вывод. Из пхп я с помощью одной из функций ...
Верно. Но зачем, если пых и сам умеет шаред?
Я с ним работал - это намного надежнее мемкеша того же - т.к. не бывает просеров с одновременно пишущими клиентами - все сидят в честной очереди на чтение/запись. (Добавление)
caballero пишет:
встроенный веб сервер? я думал там конект по TCP идет.
Верно - я опичатался тут. (Добавление)
caballero пишет:
да, если речь об распределеном решении но в большинстве случаев его ставят рядом с сайтом
Ну так что нагугливается больше, то и юзают. Плюс - в режиме апачемодуля пых не умеет шареды (ну не умел в 5.2 под дебианом, щакс проверять лениво).
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.