www.elektronik.si
LINUX PHP in funkcije za Shared Segment
Pojdi na stran 1, 2  Naslednja  :||:
www.elektronik.si -> Linux, unix razprave

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jan 29, 2012 8:33 pm    Naslov sporočila:  LINUX PHP in funkcije za Shared Segment
----------------------------------------------------------------------------
Pozdravljeni,

V C-u mi je uspelo kreirati, pisati in brati na shared segment memory. V ta namen sem moral v C-u vključiti biblioteko
#include <sys/shm.h>

Verjetno bi moral tudi pri PHP-u narediti kaj podognega, ker mi funkcij, s katerimi želim brati taisti shared segment ne prepozna. Da sem v to prepričan sem v drugem primeru pokvaril ime funkcije (shmop_open sem pokvaril v shxxxmop_open) in je diagnostika točno enaka.

Citiram:
Fatal error: Call to undefined function shmop_open() in /home/vilko/php/ss.php on line 9
beagleboard-svetosavska:~/php$ ./ss.php

Fatal error: Call to undefined function shxxxmop_open() in /home/vilko/php/ss.php on line 9
beagleboard-svetosavska:~/php$


Kako se pri PHPu vključi biblioteke funkcij kot pri C-u?
Za pomoč se toplo priporočam.

Avtor: BenjaminKraj: Trebnje, Ljubljana PrispevekObjavljeno: Ned Jan 29, 2012 9:22 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Živjo!

Najprej poglej, če imaš podporo za shm.

Uporabi funkcijo phpinfo(), ki ti izpiše podatke o tvoji inštalaciji PHP.
Išči po "shm" ali "shmop".

Koda:
<?php
phpinfo();
?>

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jan 29, 2012 10:17 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Hvala. Sem se že pogovoril s sistemcem, pravi, da bo jutri uredil podporo za Shared Memory.

Novo vprašanje.
V Shared memory segment sem vpisal v C-u array struktur, ki sem jih v C-u definiral tako:
Koda:
struct okno
   {     char id;             // Id okna znak med 1 in B
      time_t timestamp;       // Linux timestamp, kdaj je bil podatek osvežen
                        // Če je podatek star več kot 10 minut, je padla komunikacija s tem oknom
      int om,os,rm,rs,inh;    // oknomax,oknostanje,roletamax,roletastanje,ihnibit
      int rezera1,rezerva2;   // Nekateri krmilniki bodo sem dalo še kakšne podatke
                        // morda temperaturo, vlago, veter
      // Sledi področje, kamor po potrebi sestavimo ukaz, ki ga je potrebno poslati temu krmilniku                  
      time_t  kdaj;          // kdaj najbolj zgodaj izvesti ukaz ki sledi
      char ukaz[30];          // ukaz
      int  du;              // dolžina ukaza
   };


Kolikor sem bral tutorial za PHP, se iz shared segmenta bere z funkcijo
Koda:
shmop_read($shmid, 0, 11);

kjer je prvi parameter id segmenta, drugi naslov začetka branja in tretji dolžina branja.
Tako bi lahko v PHP prebral celotno strukturo v enem zamahu. A kam, v kakšno variablo v PHP-u, in kako potem elegantno pobrati iz tako prebrane strukture posamične variable?

Če tako v enem zamahu ne bo šlo, si bom moral narediti funkcijo za izračun starta in dolžine za vsako variablo strukture posebej in brati vsako variablo strukture posebej.

Se priporočam za namig.
Prisrčna hvala.

Avtor: piflarKraj: Krško PrispevekObjavljeno: Sre Feb 01, 2012 12:09 am    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdravljeni!

Sicer ne vem kaj počnete pa vendar odsvetujem podajanje podatkov preko shared memory. Sploh, če tukaj postavljate vprašanja glede tega. Predvidevam, da ste v Cju spisali nek driver, ki pobira podatke s krmilnika in jih nato posreduje PHPju ipd. Tudi sam sem pred kratkim (in že večkrat) kaj takega delal. Prvi poizkusi so bili z named pipe-i (na win32), ista stvar kot shared memory. Pri tem pristopu je potrebno poznati svojo podatkovno strukturo. Ker enkrat, ko preneseš nek array ali bognedaj class binarno prek bilokakšne pipce, na drugi strani dobiš ven le bite in je potrebno računati offsete v strukturo. Če je aplikacija na obeh straneh napisana v C++ se da fino castat in nato spet dostopaš do strukture normalno npr. Q.w.

Kar hočem povedati je, da je velikokrat bolje uporabiti navadno tekstovno datoteko (ali std_out) ali še bolje SQL bazo za prenos podatkov. Skriptni jeziki so zelo spretni z bazami. Priporočam SQLite. Zelo enostavna tudi v Cju. Govorim iz lastnih izkušenj.

Lep pozdrav in veliko uspeha.

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Sre Feb 01, 2012 5:41 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Hvala Piflar,

(ma kako si si izbral tak nickname?!)

Ja, sem že sam prišel na občitek, da z shared memory ne bo šlo. Med C programi ni problem, to sem realiziral, ne morem pa php programirati, da bi gledal v shared memory.
Moj administrator pravi, da ne more instalirati na BeagleBoard PHP s podporo shared memory, da nima potrebnih bibliotek za to.
Sedaj je dilema, kako napreprosteje ampak efektno zbrane podatke dati na razpolago PHP skriptu.
Ena varianta je preko datoteke na disku, a mi ta rešitev nekako ni všeč.
Pipinga tudi še ne znam uporabljati, in težko si predstavljam sinhronizacijo obeh procesov tako, da bo en proces bral točno takrat, ko bo drugi proces pisal v pipico.
Premalo poznam linux, da bi vedel, kakšna orodja so najbolj popularna za interaktivno izmenjavo podatkov med procesi.
če mi lahko namigneš tvoje izkušnje in kake url lokacije, ki bi me naučile, kako se tej reči streže.

Hvala
Vilko

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Sre Feb 01, 2012 6:10 pm    Naslov sporočila:  
----------------------------------------------------------------------------
to kar iščeš je "php ipc" (inter process communication)

omenja se trift vendar bi ga verjetno moral prevesti in namestiti na tvoj beagleboard, kar pa mogoče ne bo izvedljivo.

Druga varianta je povezava preko "mreže" (tvoj C program) odpre socket in čaka.
Uporabiš IP naslov 127.0.0.1 ki vedno pomeni lokalno mašino.

C stran:
1. socket()
2. bind()
3. listen()
4. accept()

PHP stran:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 65001);

potem php pošlje zahtevo in c odgovarja, lahko pa c na x sekund pošlje podatke.
v vsakem primeru boš moral razmisliti:
- ali boš konvertiral v tekt in nazaj
- ali boš prenašal številke v binarni obliki
- ali bodo vedno ista polja v sporočilu
- bo sporočilo dinamično (polja ločena recimo s podpičji (temp=-12.0;veter=23.98;vlaga=99.99;cas=2012.02.01 12:12:12;)


LP, G

Avtor: piflarKraj: Krško PrispevekObjavljeno: Sre Feb 01, 2012 9:23 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Jaz skriptam podajam podatke kar preko baze podatkov http://www.sqlite.org/. Za sqlite ne potrebuješ nobenega SQL serverja, pišeš in bereš iz navadne datoteke. Obe aplikaciji odpreta isto datoteko in to je to.

Pa še podatki ti ostajajo za nazaj, če je treba kaj pogledat ali grafe izrisat, uptime računat blah blah...
Lahko pa si tudi izbereš "memory" način. Takrat je pa tabela s tvojimi podatki narejena v spominu in bo po uporabi izginila.

Mislim, da bo tako še najbolj enostavno. Poguglaj za C sqlite3 library http://www.sqlite.org/capi3ref.html in pravtako za PHP.

Drugače pa vprašaj, ali pa na zs.

Lp

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Čet Feb 02, 2012 1:17 am    Naslov sporočila:  
----------------------------------------------------------------------------
Vilko dela na beagleboardu ki ima sicer za embedded sisteme kar precej rama (WikiPedia pravi 128MB), in ima lahko sd kartico kamor zapisuje.

Zato razne baze, kjer se bo moral učiti poleg vsega še sql in design baz verjetno odpadejo.

Glede na količino pomnilnika bi sicer bazo lahko imel v pomnilniku, samo mu verjetno ne poleg komplikacij ne bo prinesla nič takega kar ne more narediti s precej bolj enostavnimi prijemi.

Pisanje baz ena SD kartico pa razen če želi zelo hitro uničiti kartico ne priporočam.
Sicer bi bilo možno izbrati bazo ki bi pazljivo pisal po kartici ampak po mojem nepotrebno kompliciranje.

Če bi lahko uporabil shared memory v php bi to bila čisto dobra izbira.

Skoraj nujno pa bo moral delati serializacijo in deserializacijo podatkov.
Kot sem že napisal:
- separated values: x=1;y=2;z=3
- vnaprej definirana struktura: 010203 (eg. po dva byta za vsako vrednost pri čemer je vrstni red podatkov vedno enak)
- xml serializacija: <root x='1' y='2' z='3' />

Glede na znanje bi verjetno najhitreje naredil:
1) shared memory
2) kak drug "low level" mehanizem
3) network sockets
4) sql baza (konfiguracija, design baze, znanje sql, ...)

LP, Gregor

Avtor: piflarKraj: Krško PrispevekObjavljeno: Čet Feb 02, 2012 1:46 am    Naslov sporočila:  
----------------------------------------------------------------------------
Kolikor se spoznam na zadevo, ni problem v samem mehanizmu prenosa, ampak v prensenem messageu. Če se ukvarjaš z lowlevelom moraš presneto dobro premisliti v kakšni obliki podatke prenašaš in po možnosti imeti kakšen error checking. Kar je po navadi kar zalogaj.

Pri bazi to ni nek problem pa tudi sql znanje ni potrebno. Saj ne postavljaš business modela z raznimi joini in normalizacijo podatkov pa še kaj. Jaz osebno ne vem veliko o sqlu pa bazo v takšne namene precej uporabljam. Če si omejen s hardverom, je drugo. Bo treba zavihat rokave.

Drugače pa:
- ustvariš eno tabelo (CREATE TABLE podatki_krmlnik id INTEGER PRIMARY KEY, vrednost_X INTEGER, vrednost_Y INTEGER...)
- pišeš v njo (INSERT INTO podatki_krmilnik (vrednost_X,vrednost_Y) values(?,?)) <- podatki iz Cja
- bereš (SELECT * FROM podatki_krmilnik) ali kaj podobnega
- delaš s podatki naprej

To ni sveti gral IPCja, le nekaj, kar se mi zdi precej učinkovito. Sqlite je pa zapovrh zelo "light" baza. Lahko se tabela ustvari v spominu, če je kartica problem.

LP

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Čet Feb 02, 2012 1:57 am    Naslov sporočila:  
----------------------------------------------------------------------------
Ni neke triviale rešitve.

Tudi če bo delal z bazo mu serializacija ne uide, saj bo moral sestavljati sql stavke (insert, select, delete, update verjetno ne bo rabil).
No saj bi tudi z bazo šlo, samo jaz nebi uporabil baze kadar bi rabil samo prenos podatkov.

Če bi jih tudi shranjeval v bazi je pa to nekaj drugega, potem ti baza omogoča poleg prenosa podatkov mnogo mnogo več kot pa prenos po socketu v php.

Če jih bi potem iz php pisal v bazo je pa sploh boljše da jih iz Cja direkt v bazo piše.

Samo vilko je spraševal za prenos iz C procesa v php proces.

Če si programer potem uporaba shared memory ali pa network socketov ni nevem kakšna umetnost (sploh kadar imaš samo enega klienta in počasen prenos podatkov).

Ja kakorkoli obrneš bo moral zavihat rokave Smile.

LP, G

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Čet Feb 02, 2012 9:05 am    Naslov sporočila:  
----------------------------------------------------------------------------
Joj, ste mi natresli receptov, bom videl, kaj bom lahko skuhal!
Najprej grem guglat na vaše namige, potem bom verjetno, (gotovo) imel še več vprašanj, saj očitno veste, kaj pišete.
Hvala.

Zadeva se je zapletla, ker PHP (menda) ne more brati/pisati serijskega RS232 vhoda. Zato sem napisal C program, ki tako zbira podatke in predaja ukaze, a prava logika obdelave podatkov naj bi oprabil PHP.

Sedaj sem v dilemi, ali res PHP ne more delati z serijskim portom? V tem slučaju so mi podtaknili gnilo jajce.

Avtor: MatevzMKraj: Novo mesto PrispevekObjavljeno: Čet Feb 02, 2012 11:45 am    Naslov sporočila:  
----------------------------------------------------------------------------
PHP lahko dela z serijskim portom. Najprej boš rabil DIO, potem pa si lahko pogledaš ta tutorial, kjer je narejeno sprejemanje in oddajanje datoteke preko serijskega porta.

Avtor: bolha95Kraj: Križe / Tržič PrispevekObjavljeno: Čet Feb 02, 2012 1:57 pm    Naslov sporočila:  
----------------------------------------------------------------------------
vilko je napisal/a:

Zadeva se je zapletla, ker PHP (menda) ne more brati/pisati serijskega RS232 vhoda. Zato sem napisal C program, ki tako zbira podatke in predaja ukaze, a prava logika obdelave podatkov naj bi oprabil PHP.


Jaz v bližnji prihodnosti nameravam narediti podobno zadevo. Preko web vmesnika pošiljati podatke naprej na RS232. Rešitev, ki jo jaz vidim je kombinacija obojega.

1. Narediš program v C-ju, ki zna poslati podatke na RS232. Npr: poslji 1234
2. V PHP-ju uporabiš ukaz shell_exec('poslji 1234');


Dokumentacija:
http://php.net/manual/en/function.shell-exec.php

Podobno sem naredil programček za generiranje certifikatov z uporabo openssl in mi je zadeva prav lepo delovala.

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Čet Feb 02, 2012 5:35 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Trenutno iščemo pot v smeri, da PHP kliče v C-u napisan podprogram, le ta bo posredoval podatke iz PHP-jem na shared memory in nazaj.

Najbrž misli bolha nekaj podobnega.

prvi poizkusi so vzpodbudni.

Avtor: bolha95Kraj: Križe / Tržič PrispevekObjavljeno: Čet Feb 02, 2012 5:39 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ja točno tako mislim

Najbolj enostaven test v php kodi:
shell_exec('echo "123" > /var/tmp/test.txt');

Vsakič, ko pokličeš funkcijo se vpiše 123 v datoteko

Stran 1 od 2

Powered by phpBB © 2001,2002 phpBB Group