А зачем писать в файл? Есть 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 котрый бы брал данные напрямую из шаред мемори.
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.
ДА! Код пишет в файл! А я не хочу писать в файл. Я привел часть кода который сейчас фактически работает на контроллере. Он читает далнные из Шаред мемори и пишет их в файл. Но это не правльно. т.е. теоретически контроллер умрет. Тесты никто не проводил и не проведет. Соответсвенно я не хочу быть бета-тестером теста "сколько перезаписей файла выдрежит Eeprom. Тем более если я внедрю несколько десятков таких решений а они начнут умирать... Просто код ведь читает из шаред мемори. почему PHP не может? И еще там есть одна переменная mutex... она служит для разделения потоков заипси/чтения шаред мемори. Может дело в ней? может мне тоже в mutex'е при помощи php что-нибудь намудрить?
рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что 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
Подписывайте долгосрочный договор с заказчиком.
Ставьте его на обслуживания.
Осуществляйте обслуживаание.
Нет, это не варинат. тем более я задумал сделать "серийное" устройство которое сможет купить кто угодно. И если они начнуть умирать (пусть даже не через 174 дня, а года через 2) то это будет очень и очень плохо. (Добавление)
Ch_chov пишет:
Цитата:
Программа на С++ записывает файл 1 раз в секунду.
Может быть есть возможность сделать этот файл "вирутальным"? Разместить на tmpfs и т.д.
рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией... кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
не легче из php вызывать приложение, отдающее всю нужную инфу и тупо ее выводить?
не понимаю о чем Вы?
Мне нужно организовать веб-страничку на которую можно было бы зайти с браузера. Данные для отображения находятся в Shared Memory. Это уже по сути реализовано но через заппись в файл. ПРограмма написана на С++ под линукс выдергивает данные из Shared Memory и записывает их в XML файл. А HMTL страница читает данные из файла и при помощи функции ajax обновляет данные с частотой 1 раз в секунду. НО у данного способа есть ряд минусов:
1. Работает несколько программ для организации веб сервера (так себе минус, но все-же)
2. Производитель контроллера регламентировал 15 млн. перезаписей в EEPROM. Программа на С++ записывает файл 1 раз в секунду. Соответсвенно теоретически производитель гарантирует что такая программа будет работать 174 дня. Далее негарантированно EEPROM начнет умирать. Не хотелось бы чтобы так случилось с уже внедренной системой... (самое страшное что это может вылезти года через 2, когда гарантия закончится... и как тогда я буду выглядеть в глазах заказчика?).
Это плохо - сейчас без ООП никуда, тем более в таком деле, когда на один сегмент памяти нужен один экземпляр для работы с этим сегментом.
Я вообще специлиаст по АСУТП и программирую в основном контроллеры и скада-системы... а не по программированию для ПК (немного этим баловался раньше)... и вот теперь попалась смежная задача - надо программить для АСУТП и знать PHP а также разбираться (хотя бы немного) в Linux... вот и пытаюсь...
что-то я почитал и, честно говоря, ничего не понял.
Не поянл что это такое: $this->semkey = $semkey; (this это "указатель" или что-то другое).
Далее...
В приведенном примере есть функция
shm_attach($this->shmkey,$shmsize,0660);
она соаздает или открывает сегмент Shared памяти. Но у меня нет key чтобы получить доступ к этой памяти, и вот этот key как раз мне и необходимо узнать....
Добрый день!
Не знаю в ту ли тему форума задаю вопрос, и сможет ли кто-нибдуь мне помочь.... Попытаюсь описать свою проблему.
1. Есть такие контроллеры для АСУТП под названием Segnetics SMH2Gi, которые работают под управлением ОС Linux. вот ссылка:http://segnetics[dot]com/smh_2gi
2. Для программирования этих контроллеров есть специализированное программное обеспечение Smlogix и в контроллере для Linux написано программное обеспечение, обеспечивающее работу программы написаннной на SMLogix. Для обмена данными из программы написанной в SMLogix с программами на Linux разработчики использовали технологию Shared Memory.
3. В итоге при использовании переменных задествованный во программе SMLogix и выведенных в Shared Memory я имею перечень таких переменных типа такого:
[Slave]
Instat=0xccc0,65536,2
Coil=0xccc1,65538,2
Inreg=0xccc2,65540,24
ShmSize=65564
[Instat]
var0=0x6f,1,0,65536,status
var1=0x71,1,0,65537,zima_leto
[Coil]
var0=0x51,1,0,65538,pusk_stop_btn
var1=0x52,1,0,65539,zima_leto_btn
[Inreg]
var0=0x19a,2,1,65540,vlazh
var1=0x110,4,3,65544,temp_vnesh
var2=0x124,4,3,65548,temp_vitzh
var3=0x138,4,3,65552,temp_room
var4=0x14c,4,3,65556,temp_kanal
var5=0x160,4,3,65560,temp_vobr
Вот описание того, что означают эти цифры и буквы от производителя:
var1=0x134,4,3,8,Parameter
где:
0x134 – адрес переменной в адресном пространстве ядра «logix»
4 – размер переменной в байтах
3 – тип данных переменной в среде «SMLogix» - float (real)
В среде « SMLogix » встречаются типы данных:
• 0 – bool
• 1 – int (тип short int – 2 байта в «C/С++»)
• 2 – long
• 3 – real (тип float в «C/С++»)
8 – адрес переменной в адресном пространстве разделяемой памяти контроллера «/dev/shm/wsi»
Parameter – имя (идентификатор) переменной
4. Теперь собственно какая стоит задача. Мне нужно эти переменные прочитать при помощи PHP (контроллер имеет установленный веб-сервер апач и есть возможность сделать веб-страницу в которой будет отображаться нужная мне информация о работе технологического процесса). Для этого я пробовал использовать функцию shmop_read. И все бы ничего, но вот как найти "Системный идентификатор блока разделяемой памяти" я не знаю. Пытался сделать вот так:
$shm_key = ftok('/dev/shm/wsi', '6');
echo ($shm_key);
echo ('<br>');
echo ('привет <br>');
$shm_id = shmop_open($shm_key, "w", 0, 0);
$shm_size = shmop_size($shm_id);
echo ($shm_size);
$shm_data = shmop_read($shm_id, 65544, 4);
echo ($shm_data);
shmop_close($shm_id);
Естественно ничего не получилось. Как я понял ftok создает новый системный идентификатор а мне нужно найти тот, который уже создан. В общем я встав в тупик и не знаю что делать дальше.
PS Производитель не знает ответа на мой вопрос.