www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

LINUX PHP in funkcije za Shared Segment
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3311
Aktiv.: 19.60
Kraj: Dragomer

PrispevekObjavljeno: Ned Jan 29, 2012 8:33 pm    Naslov sporočila:  LINUX PHP in funkcije za Shared Segment Odgovori s citatom

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.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Benjamin
Član
Član



Pridružen-a: Tor 10 Jul 2007 11:23
Prispevkov: 116
Aktiv.: 0.77
Kraj: Trebnje, Ljubljana

PrispevekObjavljeno: Ned Jan 29, 2012 9:22 pm    Naslov sporočila:   Odgovori s citatom

Ž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();
?>

_________________
Cessna 152: "Flight Level Three Thousand, Seven Hundred"
Controller: "Roger, contact Houston Space Center"
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3311
Aktiv.: 19.60
Kraj: Dragomer

PrispevekObjavljeno: Ned Jan 29, 2012 10:17 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
piflar
Član
Član



Pridružen-a: Čet 06 Dec 2007 17:56
Prispevkov: 246
Aktiv.: 1.69
Kraj: Krško

PrispevekObjavljeno: Sre Feb 01, 2012 12:09 am    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3311
Aktiv.: 19.60
Kraj: Dragomer

PrispevekObjavljeno: Sre Feb 01, 2012 5:41 pm    Naslov sporočila:   Odgovori s citatom

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

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.35
Kraj: Ljubljana

PrispevekObjavljeno: Sre Feb 01, 2012 6:10 pm    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
piflar
Član
Član



Pridružen-a: Čet 06 Dec 2007 17:56
Prispevkov: 246
Aktiv.: 1.69
Kraj: Krško

PrispevekObjavljeno: Sre Feb 01, 2012 9:23 pm    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.35
Kraj: Ljubljana

PrispevekObjavljeno: Čet Feb 02, 2012 1:17 am    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
piflar
Član
Član



Pridružen-a: Čet 06 Dec 2007 17:56
Prispevkov: 246
Aktiv.: 1.69
Kraj: Krško

PrispevekObjavljeno: Čet Feb 02, 2012 1:46 am    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.35
Kraj: Ljubljana

PrispevekObjavljeno: Čet Feb 02, 2012 1:57 am    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3311
Aktiv.: 19.60
Kraj: Dragomer

PrispevekObjavljeno: Čet Feb 02, 2012 9:05 am    Naslov sporočila:   Odgovori s citatom

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.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MatevzM
Član
Član



Pridružen-a: Ned 02 Jan 2011 23:09
Prispevkov: 40
Aktiv.: 0.37
Kraj: Novo mesto

PrispevekObjavljeno: Čet Feb 02, 2012 11:45 am    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bolha95
Član
Član



Pridružen-a: Pet 14 Dec 2007 21:33
Prispevkov: 296
Aktiv.: 2.04
Kraj: Križe / Tržič

PrispevekObjavljeno: Čet Feb 02, 2012 1:57 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
LP,
Robi
Kjer se znanje konča, se domišljija začne
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3311
Aktiv.: 19.60
Kraj: Dragomer

PrispevekObjavljeno: Čet Feb 02, 2012 5:35 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bolha95
Član
Član



Pridružen-a: Pet 14 Dec 2007 21:33
Prispevkov: 296
Aktiv.: 2.04
Kraj: Križe / Tržič

PrispevekObjavljeno: Čet Feb 02, 2012 5:39 pm    Naslov sporočila:   Odgovori s citatom

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

_________________
LP,
Robi
Kjer se znanje konča, se domišljija začne
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 201 dni


Powered by phpBB © 2001, 2005 phpBB Group