Back to top

Autore Topic: Condivisione variabili di sessione con script in background  (Letto 1695 volte)

Offline utentedisperato

  • Nuovo arrivato
  • *
  • Post: 4
    • Mostra profilo
Ciao a tutti,


in una pagina ho un pulsate che, al click, mi cambia il valore di una variabile di sessione booleana: da 0 a 1 o viceversa. Quando il valore diventa 1 viene richiamato uno script in php che lavora in background e che sfrutta la sessione di joomla.
Questo script ha un ciclo while che resta attivo finchè la variabile booleana è 1 mentre, quando essa diventa 0, lo script esce dal ciclo e lo script termina la sua esecuzione.


Questa è la teoria.


In pratica, riesco a lanciare lo script, riesco a condividere la variabile di sessione ma sembra che, una volta avviato lo script, lo stato di tale variabile resti "congelato". Il loop diventa un ciclo infinito che non riesco più ad interrompere.


Facendo diverse prove ed uscendo dall'ambiente di Joomla, mi sembra che non faccio errori concettuali di php (almeno credo), quindi, non mi resta che pensare che c'è qualcosa che non so su Joomla, per quanto riguarda la gestione delle variabili di sessione.


Io vorrei poter cambiare lo stato di una variabile di sessione, mentre uno script parallelo è in esecuzione sul server.


C'è qualcuno che mi può dare una mano?


Grazie!

Offline rezor

  • Global Moderator
  • Appassionato
  • ********
  • Post: 278
  • Sesso: Maschio
  • If you think education is expensive, try ignorance
    • Mostra profilo
Re:Condivisione variabili di sessione con script in background
« Risposta #1 il: 29 Nov 2014, 14:45:09 »
Sembra che tu abbia una simpatica situazione di deadlock su un ciclo infinito (ovvero il tuo loop è troppo "stretto" perché possa essere interrotto!).  In sostanza, si prende tutto il tempo di cpu e le altre richieste vengono ignorate.  Se stai cercando di fare ajax push probabilmente è meglio avere un ciclo "lasco" ovvero che ogni x millisecondi faccia il controllo, poi si metta in sleep, permettendo al sistema di elaborare le altre richieste.
Architetto e Sviluppatore Senior, ho realizzato oltre 150 siti e portali Joomla, una mezza dozzina di estensioni sul JED e oltre 100 estensioni custom. Pubblico su fasterjoomla.com, e contribuisco su stackoverflow, joomla.org e pasqualoni.it
https://www.fasterjoomla.com/logo.png

Offline utentedisperato

  • Nuovo arrivato
  • *
  • Post: 4
    • Mostra profilo
Re:Condivisione variabili di sessione con script in background
« Risposta #2 il: 29 Nov 2014, 14:51:41 »
Mmm sai non penso: al momento,  per il testing, ho impostato uno sleep di 2 secondi prima di chiudere il ciclo... C'è qualcos'altro che "mura" le variabili..

Offline rezor

  • Global Moderator
  • Appassionato
  • ********
  • Post: 278
  • Sesso: Maschio
  • If you think education is expensive, try ignorance
    • Mostra profilo
Re:Condivisione variabili di sessione con script in background
« Risposta #3 il: 29 Nov 2014, 15:31:09 »
No, ho un paio di componenti che fanno un uso intensivo di jSession, ma giusto per toglierti ogni dubbio, fatti un

Codice: [Seleziona]
error_log(var_export($_SESSION,true));
così puoi vedere direttamente il contenuto delle sessioni; il tuo script con il ciclo è dentro Joomla, oppure inizializzi correttamente il framework con negli script che si trovano in /cli ?
Architetto e Sviluppatore Senior, ho realizzato oltre 150 siti e portali Joomla, una mezza dozzina di estensioni sul JED e oltre 100 estensioni custom. Pubblico su fasterjoomla.com, e contribuisco su stackoverflow, joomla.org e pasqualoni.it
https://www.fasterjoomla.com/logo.png

Offline utentedisperato

  • Nuovo arrivato
  • *
  • Post: 4
    • Mostra profilo
Re:Condivisione variabili di sessione con script in background
« Risposta #4 il: 29 Nov 2014, 17:57:21 »
Allora, i miei script in php sono nella cartella "scripts", contenuta nella directory principale del mio sito Joomla!.


Ho provato a seguire il tuo consiglio, ma non so se l'ho applicato correttamente: ho inserito
echo error_log(var_export($_SESSION, true));
mi visualizza sempre 1...non so cosa significhi...sicuramente non ho capito come usare la funzione.


Cmq avevo fatto a modo mio dei monitor sullo stato della variabile e ti riporto un risultato dei vari test ripetuti. Per capirci chiamo "fileA" quello che contiene il pulsante che fa lo switch di stato e "fileB" lo script che effettua il loop, la variabile che cambia stato la chiamo VAR.


1) Lancio la pagina che legge il fileA. VAR = 0.
2) Clicco sul pulsante => Si aggiorna la pagina e VAR = 1.
3) Lancio separatamente il fileB (nel test lo faccio manualmente e, dato che non funziona, ho impostato un numero di cicli pari a 4 per non renderlo infinito).
4) Mentre il ciclo si esegue, prima che si concluda il 4° ciclo, torno sulla pagina del fileA e clicco sul pulsante => la pagina si riaggiorna e VAR = 0.
5) fileB conclude i suoi cicli e nel browser viene visualizzato:

VAR: 1
N. di ciclo: 0

VAR: 1
N. di ciclo: 1

VAR: 1
N. di ciclo: 2

VAR: 1
N. di ciclo: 3

...praticamente non si osserva il cambio di stato di VAR da 1 a 0.
Per di più, se riclicco il pulsante (ricordiamoci che VAR era diventata 0) VAR non diventa 1 ma 0, e solo se clicco ancora diventa 1: questo significa che, al termine del ciclo, VAR ha ripreso il valore che possedeva all'interno di fileB (mi immagino che rilasciando le risorse, VAR si sia sovrascritta).
Spero di essere stato chiaro nella descrizione!
« Ultima modifica: 29 Nov 2014, 18:10:04 da utentedisperato »

Offline rezor

  • Global Moderator
  • Appassionato
  • ********
  • Post: 278
  • Sesso: Maschio
  • If you think education is expensive, try ignorance
    • Mostra profilo
Re:Condivisione variabili di sessione con script in background
« Risposta #5 il: 29 Nov 2014, 20:14:44 »
allora error_log scrive nei log! non a video. Per scrivere a video, usa:
Codice: [Seleziona]
var_dump($_SESSION);
Ora probabilmente il tuo script carica la sessione al suo avvio, e le modifiche fatte esternamente non le rileva finché gira. Oppure non salvi correttamente la variabile (ovvero la salvi con uno scope locale e non globale).  Ma non riesco a capire, se stai usando Joomla o meno per questa funzione, sei evidentemente fuori dal componente, ma il framework te lo inizializzi? come si fa negli script che trovi nella cartella /cli?
Architetto e Sviluppatore Senior, ho realizzato oltre 150 siti e portali Joomla, una mezza dozzina di estensioni sul JED e oltre 100 estensioni custom. Pubblico su fasterjoomla.com, e contribuisco su stackoverflow, joomla.org e pasqualoni.it
https://www.fasterjoomla.com/logo.png

Offline utentedisperato

  • Nuovo arrivato
  • *
  • Post: 4
    • Mostra profilo
Re:Condivisione variabili di sessione con script in background
« Risposta #6 il: 30 Nov 2014, 09:35:47 »
Allora, premettendo che utilizzo Sourcerer, il sistema è come segue. Ti anticipo che il codice è frammentato perchè l'ho reso molto modulare.

Un modulo Joomla chiede il require di script1.php: in esso non è inizializzata alcuna sessione perchè, essendo poi incorporato nel modulo, la sessione è già attiva.
Al click del pulsante è associata una chiamata ajax a script2.php, esterno a Joomla, il quale si occupa di effettuare lo switch del valore, attendendone l'esito: al termine di script2 (e, quindi, quando "VAR" è switchata) viene riletto il <div> di script1 che contiene il pulsante (per caricare il nuovo stato di VAR).
Script2.php contiene il codice di avvio di sessione come segue:

<?php
// Starting session
define( '_JEXEC', 1 );
define( 'JPATH_BASE', '../../' );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

$mainframe = JFactory::getApplication('site');
$mainframe -> initialise();

$session =& JFactory::getSession();
$database_system = $session -> get('database_system');
....

dove, all'interno di $database_system, un array, ho VAR che, dopo la sua modifica, setto così:

$session -> set('database_system', $database_system);

Questo flusso si porta a compimento perchè, quando viene riletto il div di script1, effettivamente lo stato di VAR è cambiato.
Sempre all'interno di script2, dopo la modifica di VAR, c'è un controllo: se VAR = 1 lancia un exec:

exec('wget -q UrlDelFileFileB.php > /dev/null 2>&1 &');

Questo funziona (l'ho testato), lanciando lo script in background che contiene il ciclo while (nei precedenti post era appunto fileB).
Quindi anche fileB è esterno a joomla, per questo, inizializzo la sessione così come ho fatto pet script2, usando la stessa sintassi, e caricando il valore di VAR così:

$session =& JFactory::getSession();
$database_system = $session -> get('database_system');

il suo valore è la condizione del ciclo while. Subito dopo aver inizializzato il ciclo, chiedo nuovamente di caricare VAR, come appena mostrato, in modo che ad ogni inizio ciclo si sfrutti il suo valore aggiornato. Ma qui c'è il cuore del problema e il valore non si aggiorna. Anche se, parallelamente, sto lì a giocare con script1 e script2, cambiando il valore di VAR diverse volte.

Ora non so se il while è un codice chiuso...io comunque richiedo il valore di VAR direttamente dalla sessione Joomla.......STO IMPAZZENDO!!!
 :D


« Ultima modifica: 30 Nov 2014, 09:37:54 da utentedisperato »

 



Web Design Bolzano Kreatif