Clasa sesiuni php

am nevoie de o clasa care sa o pot folosi in locul apelului variabilelor de sesiune.
am avut situatii in care sesiunea pe server era disable (sau de exemplu cand vreau sa fac un script php executabil nu exista sesiuni).
gasisem mai demult intr-un framework o astfel de clasa care daca nu putea folosi sesiunile crea fisiere cache pe server, dar nu mai stiu in ce framework am dat de clasa respectiva, daca aveti voi sugestii sunt interesat.

nu am nevoie de ceva complicat (adica cu dependinte sau librarii de instalat), trebuie sa poata fi folosita pe un server in share cu restrictii (cum e asta cu sesiunea disabled)

http://php.net/manual/en/class.sessionhandlerinterface.php

aia vad ca se poate implementa de la 5.4 incolo, eu mai am clienti pe php 4 care nu sunt dispusi sa dea bani pentru actualizarea codului, vreau ceva care sa pot folosi la toti fara sa fiu limitat de versiunea php :smiley:

  • ca aia vad ca e dependenta de sesion handler, dar eu am clienti de exemplu banci unde din motive de siguranta (exagerata zic eu) au disable la multe librarii php (printre care si cea de sesiuni) deci varianta ta pica

  • se pare ca tu nu ai incercat sa faci niciodata un script php executabil (gen winbinder) unde iar la final nu exista sesiuni sau chestii de gen (aceeasi problema la apelul unui script din linie de comanda prin cron, nu exista sesiune)

Nu sunt sigur că îți înțelegi problema, deci nici eu nu ți-o înțeleg.

Sesiunile sunt pentru protocolul HTTP. Au ca scop diferențierea între clienți, deoarece HTTP e un protocol stateless.

În scripturi CLI nu există mai mulți clienți paraleli și cererea nu intră în SAPI via HTTP.

Care e problema pe care încerci să o rezolvi?

Sună a problemă de arhitectură care are ca efect problema pe care încerci tu să o rezolvi.

Ar trebui să abordezi frontal problema care cauzează această “problemă” care e doar un efect secundar.

A avea sesiuni de dragul de a avea sesiuni nu este o problemă. E o necesitate apărută artificial datorită unei abordări greșite undeva mai sus în arborele de abstractizări.

Dacă funcțiile session_ nu sunt definite, le poți defini într-un bloc condițional.

1 Like

Tu vrei o clasa, care de fapt este scrisa in php 4…

Support for PHP 4 has been discontinued since 2007-12-31. Please consider upgrading to PHP 5.

Dupa cum a zis si @flavius in CLI nu ai mai multi clienti, deci ce sesiune vrei acolo? Sau zici de CGI?

Cred ca este prea custom ceea ce vrei, php 4 si restrictii. Poti sa faci un repo pe github si sa-ti creezi propria clasa (eventual pot contribui si altii). In functie de restrictii poti avea “sesiunea” intr-o variabila globala (daca nu ai $_SESSION), o poti salva in fisiere, baza de date, memcache(d), redis (adica implementezi propriul session save_path si handler)… Pe baza de cookie sau token poti face load. Poti folosi librariile la care ai acces pentru criparea datelor si serializarea lor.

Eu aș aborda problema în felul următor:

1) Cum salvezi session_id-ul pentru client
Dacă tot ai o grămadă de restricții ar fi bine să începi să testezi cam ce poți implementa pentru salvarea session id-ului între request-uri. Aici ai două variante din punctul meu de vedere:

  • cookies: vezi dacă setezi un cookie ți se păstrează între request-uri. Nu salva date relevante în cookie! Salvezi doar un session ID.
  • GET parameter: asta e varianta cea mai nasoală. Va trebui să adaugi un parametru GET la toate linkurile/request-urile care le fac (ceva gen &sid=xxxx)

2) Implementarea

Abia după ce rezolvi problema cu salvarea session id-ului poți trece la implementare, care ar trebui să fie cât de cât simplă. Principalele decizii pe care le ai de făcut sunt:

  • Implementezi funcțiile lipsă din php sau ceva propriu. Pentru a înlocui funcțiile PHP poți face ceva de genul (cum a sugerat @flavius):

<?php if (!function_exists('session_init')) { function session_init() { // custom implementation } } ?>

  • Salvezi în fișiere sau în bază de date informațiile

Nu există GET și nici cookies, deoarece nu există HTTP în CLI SAPI.

1 Like

Bun, acum am văzut că e vorba de Winbinder, adică PHP CLI. În cazul ăsta nu văd rostul sesiunii.

Există varianta ca mai mulți clienți să folosească aplicația pe același calculator? Nu e de ajuns o variabilă globală?

Cred ca HttpFoundation de la Symfony


se instaleaza rapid via composer

@Birkoff vrea pt PHP 4, iar Symfony vrea PHP 5.5.9 minim.

Pardon! Scuzele mele ca nu m-am uitat atent. Nu mai stiu ep nimeni cu php < 5.3 :slightly_smiling:
5.5.9 vrea ultimul ragnet de symfony (full-framework)
Da mai sunt si versiuni mai vechi care sunt inca maintained eg. 2.3.x care e LTS
Nu iti trebuie tot framework-ul doar componente
Dar da … Php4 … nu prea ai ce face decat de mana

Totusi daca mai imi aduc aminte bine, la upgrade-urile de la php4 la 5.2 nu am avut necazuri
De munca a fost decat la upgrade-ul de la php3 la 5 dar era cod jalnic de jalnic

ok, deci sa inteleg ca ce vreau eu nu prea e pentru php 4.
ma gandeam sa scriu eu o clasa daca nu se pot folosi variabile de sesiune sa se creeze fisiere text pentru fiecare user/ip/semntatura browser si in fisierul ala sa am un array cu variabilele ce ar fi trebuit sa fie in sesiune si sa le apelez din clasa pe unde e nevoie

adica in loc de
$_SESSION[ceva]
fac
$myclass->ceva (unde clasa va stoca variabila ori in sesiune ori in fisierul respectiv)

si asa scap de problema asta.

Ce vrei tu (sesiuni) nu există în CLI.

@Birkoff: ne poți spune un caz concret în care ai nevoie de sesiuni în CLI?

În cealaltă situație, când serverul are restricții, schimbi serverul. :slightly_smiling:

Bun, in primul rand va trebui sa diferentiezi fiecare request de vine din CLI, cum sessions nu se poate folosi, poti face o clasa care sa stea in fata sessiunilor si va face diferentierea intre tty-urile cli.

Pentru diferentiere poti crea un fisier in calea home a user-ului linux un fisier unde vei salva un pseudo session id cu care vei diferentia-asocia in functie de caz fiecare request. Poti chiar sa il stergi daca e mai vechi de x secunde.

Si daca tot e session, sa spunem ca userul nu poate citi/edita variablele, deci le vei salva intr-un tabel mysql :smiley:

In acea clasa de care spuneam, e destul de simplu, depistezi daca e cli si lucrezi in cauza (creare/citire sau stergere fisier sessionid daca e vechi), iar daca e http mergi direct pe session_start().

Nu stiu sa fie vreo astfel de clasa, @Birkoff. Am impresia ca nu prea gasesti fiindca e-o idee proasta. Oricum, daca-i PHP4, asta e.

Cred ca va trebui s-o implementezi singur. Adica sa acoperi toata gama de facilitati ale sesiunilor native.

Cat despre sesiuni de CLI, uite niste idei: http://stackoverflow.com/questions/7578595/is-it-possible-to-read-cookie-session-value-while-executing-php5-script-through

PS: @iamntz - un GUI cu “profiles”, peste un program in linia de comanda. Dar, da, as prefera REST cu tokens sau oauth ceva.

1 Like

scuze ca nu sunt prea activ, cand am inceput discutia eram sanatos, intre timp bolescsi numai la calculator nu imi vine sa stau (gripa+tensiune+voma+frisoane+temperatura si altele)

ca sa va raspund la unele intrebari puse de voi aici, eu lurez pe un cms propriu si l-am gandit ca anumite3 date sa fie stocate in sesiune ca sa nu interoghez baza de date la fiecare pagina.
totul a fost ok pana am nimerit 2 situatii, rulare script prin cron si a doua situatie la un client (o banca din ro) au sesiunile oprite si din cauza asta anumite pagini nu merg ok (ca depind de sesiunea initializata la login, dar cum nu e sesiune, nici login nu se face)

ei ca sa evit astfel de probleme pe viitor, ma gandeam sa fac o clasa cum am zis mai sus care sa tina variabilele intr-un fisier temporar pe server si fiind clasa, e globala si o pot apela pe unde am nevoie.

oricum, multumesc pentru raspunsurile date, cand ma inzdravenesc ma apuc sa studiez ce mi-ati dat.

Eventual poti incerca un A/B test cu o baza de date SQLite (in loc de fisier), sa vezi daca sunt diferente considerabile (timpul de accesare, puterea de procesare necesara, consumul de resurse, etc.) …asta daca ai SQLite activat, pe acel server.

1 Like

Pai te-ai scos, ca nu-ti trebuie sesiuni pt astea, fiindca ai folosi cache, nu sesiune. Nu?[quote=“Birkoff, post:17, topic:2555”]
rulare script prin cron
[/quote]
Cu toate ca or fi cazuri cand ai nevoie de “state” intre doua rulari, nu este o idee buna sa le cuplezi. Faptul ca NIMENI n-am vazut sa foloseasca sesiuni in cron, si faptul ca nici nu se poate in CLI, ar trebui sa-ti indice ceva. Presupun ca vrei sa eviti race-conditions in rulari de cron? Asta o poti face cu vreun lock in business logic or some shit like that.

Cat despre cea banca - si poate o stii si tu - dar n-ar fi mai bine sa faceti un refactoring la acele pagini decat sa fortezi tehnologii/arhitecturi acolo unde nu le este locul? Pare mai riscanta optiunea ta.

3 Likes

A folosi sesiuni pentru caching e o decizie tristă. Cea mai bună decizie e să faci o interfață pentru adaptoare de caching, și să implementezi diferite realizări ale acelei interfețe.

Unele dintre ele pot fi: apc, memcache.