Newsgroup: it.comp.www.php
Titolo: Mostrare subito la pagina

Ho pagina che serve solo per mandare un paio di mail e subito dopo appare un link da clikkare per proseguire la 
navigazione.
 
il codice con il testo da visualizzare è posto prima dei comandi mail, ma fintanto che che le mail non sono partite non 
appare nulla.
 
C'è un modo per visualizzare subito la pagina senza aspettare l'esito delle mail? Grazie
 
-- 
Greg


Anzichè inviare le email direttamente crei dei job, li metti in una queue 
e servi la pagina, nel frattempo con calma un queue worker (processo 
batch) può occuparsi dell'invio delle suddette.
 
Per esempio in laravel: 
https://laravel.com/docs/5.7/queues
 
 
g4b0
 

Il 25/01/19 09:04:42 g4b0 ha scritto:

Grazie, mi rendo conto che mi hai suggerito una soluzione definitiva e molto elegante, ma le mie conoscenze purtroppo 
non arrivano a tanto
 
-- 
Greg


Ma non è così difficile, provo a spiegarla più facile: anzichè inviare 
l'email salvi nel db quanto necessario a farlo: subject, body, indirizzi 
vari, ecc. e restituisci la pagina come se avessi inviato.
 
Lo script batch è un semplice script php lanciato via cronjob ogni x 
minuti, il quale se trova nel DB delle email da spedire lo fa, con lo 
stesso codice che usi attualmente.
 
In sostanza aggiungi 2 query, una insert ed una select, e splitti il 
codice in 2 file. Niente di complicato.
 
Poi si può rifinire in mille modi, per esempio evitando che lo script 
batch giri se non ha finito il giro precedente, così eviti di inviare due 
volte le email, però per cominciare quanto ti ho detto prima basta ed 
avanza.

 stesso codice che usi attualmente.
 
Adesso vedo se trovo qualche esempio in rete su cui lavorarci intorno...
 
Una cosa che mi ingarbuglia molto è che la mail deve partite da una pagina che contenga solo codice php e non htlm.
Ho provato ad inserire il codice della mail direttamente nella futura pagina di arrivo in vari posti, prima, dopo, 
dentro head ma invariamente compare tutto a video ...altrimenti avrei già risolto
 
-- 
Greg

Il 25/01/19 15:51:25 g4b0 ha scritto:
 
Ho risolto metà del problema con questa riga:
header( "Location: index.php" );
 
Quando la mail è stata inviata non appare piu la pagina bianca con scritto "clicca qui" ma subito alla pagina dove 
voglio che vada.
 
Mi resta un problemino che lo spiego in apposito post piu sopra.
 
Grazie:)
 
-- 
Greg


Il sistema più semplice **e portabile** è farlo in AJAX.
 
Hai la pagina di partenza in HTML. In questa ci metti il pulsante che fa
partire le mail, ma gli fai effettuare una chiamata AJAX. Dopo che lei è
partita, puoi fare quel che ti pare: far comparire il link da cliccare o
qualcos'altro e magari un cursore di "attendere prego".
 
Il file chiamato via AJAX lo proteggi con ignore_user_abort(), e gli fai
restituire lo stato dell'invio magari in JSON via json_encode().
 
Quindi:
	- l'utente clicca
	- succede subito qualcosa (decidi tu cosa)
	- quando le mail sono davvero partite succede qualcos'altro,
	  o anche nulla
 
Leonardo
-- 
 
"You all presumably know why" :-) :-(

 ...altrimenti avrei già risolto
 
PHP non dovrebbe più essere inglobato dentro al codice HTML, è una bad 
practice che era molto in voga negli anni 90. 
 
Io fossi in te mi fermerei un attimo e partirei con un libro, giusto per 
chiarirti le idee. Per esempio ultimamente sono usciti un paio di libri 
(che non ho letto) che potrebbero fare a caso tuo:
 
Beginning PHP and MySQL 5th Edition [2]
Learning PHP, MYSQL & JavaScript: With jQuery, CSS & HTML5 [3]
 
Ripeto, non li ho letti, ma per una visione d'insieme dello sviluppo web 
direi che l'importante è che siano recenti (questi sono entrambi del 
2018).
 
g4b0
 
 
[1] 
https://www.phparch.com/magazine/2018-2/march/
 
[2] 
https://www.amazon.it/Beginning-PHP-MySQL-Jason-Gilmore/dp/1430260432/
 
ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=
[3] 
https://www.amazon.it/Learning-PHP-MYSQL-JavaScript-jQuery/
 
dp/1491978910/ref=sr_1_1?s=english-
books&ie=UTF8&qid=1548681653&sr=1-1&keywords=learning+php%2C+mysql+and
+javascript

 non è l'articolo gratuito per quella issue.
 
Non ho letto l'articolo in questione ma sarebbe interessante una review
dei concetti di base.  In ogni caso, ho risolto il problema dei processi
batch su Windows e su Linux con una classe apposta:
 
http://www.icosaedro.it/phplint/phplint2/library.html?i=it/icosaedro/web/OfflineJob
 
 
Basilarmente:
 
- Creando un nuovo oggetto, viene creata una dir. temporanea di lavoro
e viene restituito un ticket (una stringa alfanumerica che identifica
il job).
 
	$job = new OfflineJob();
	$ticket = $job->getTicket();
 
- Nella dir. temporanea si possono mettere i file di lavoro e leggere
i risultati:
 
	$mydata = $job->propertyPath("mydata.csv");
	file_put_contents($mydata, ".....");
 
- Si può lanciare un processo di shell che esegue quindi comandi
arbitrari all'interno della dir. di lavoro:
 
	$job->start("c:\\myprogram.exe mydata.csv myresults.xml");
 
Il "detaching" dal processo PHP che lo lancia viene realizzato sotto
Linux con il comando "at", mentre sotto Windows ho dovuto scrivere un
launcher apposta scritto in C altrimenti il processo PHP rimane appeso
inesorabilmente. Questa è la parte tricky di tutto il discorso e che
rende l'implementazione fortemente dipendente dal sistema.
 
- Dato il ticket, si può ricostruire l'oggetto OfflineJob
 
	$job = new OfflineJob($ticket);
 
e sondare lo stato del processo batch (starting, running, finished),
recuperare lo stato di avanzamento, il codice di uscita, lo stdout,
stderr e gli eventuali file prodotti, oppure si può fermare il processo.
Ovviamente, questo può tornare utile per mostrare in modo asincrono
all'utente lo stato di avanzamento dei suoi jobs e per consentire di
stoppare quelli voluti.
 
 
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it
 
 

inesorabilmente.
 
Sotto Windows forse si può usare l'interfaccia CLI di SCHTASKS:
 
$date = date('H:i:s', time() + 5);
 
SCHTASKS /CREATE /RU utente /RP password /TN "nome task" /TR "COMANDO" /SC
ONCE /ST {$date}
 
Leonardo (non sono sicuro di /SC)
