[php] lanciare exec ed aggiornare la pagina php

8 risposte [Ultimo messaggio]
Ritratto di kalla
kalla
(Junior)
Offline
Junior
Iscritto: 30/06/2008
Messaggi: 11

Buongiorno a tutti!
sto scrivendo una pagina php che lancia un eseguibile presente sull'HD. Nel farlo però ho il seguente problema: non riesco a lanciarlo in background. Se lo faccio, la pagina php di fermae non posso più usarla (ed il processo parte stando a quello che mi dice la shell con il TOP).
Ho letto sia sulle reference che sulla rete ed ho scoperto che questo è un problema incontrato da molti. Stando alla reference dovrei indirizzare l'output della exec verso un file o uno stream.
Solo che non ho trovato nessun pezzo di codice che sembri funzionare e dare l'effetto desiderato.
qualcuno sa come si fa?
Questo è il mio codice:
<br />print($_POST[&#039;sceltaFileParametri&#039;]);<br /><br /><br /> $rigaDiComando=&quot;./myprogram &quot;.$_POST[&#039;sceltaFileParametri&#039;];<br /><br />    //lancio la registrazione<br /><br />   print(&quot;&lt;br&gt;&lt;b&gt;&quot;.$rigaDiComando.&quot;&lt;/b&gt;&lt;br&gt;&quot;);<br /><br />     $comandoLanciato=exec($rigaDiComando);<br /><br />      print(&quot;&lt;br&gt;&lt;b&gt;&quot;.$comandoLanciato.&quot;&lt;/b&gt;&lt;br&gt;&quot;);<br /><br /><br />     print(&quot;Inizio della registrazione!&quot;);<br />

Ritratto di wal7er
wal7er
(Guru)
Offline
Guru
Iscritto: 21/09/2007
Messaggi: 568

Leggendo questo http://it2.php.net/function.exec
mi viene da suggerirti (se non hai gia' provato):

<br />$rigaDiComando=&quot;./myprogram &quot;.$_POST[&#039;sceltaFileParametri&#039;]<b>.&quot;&gt;log&quot;</b>;<br />

anzi, dalla pagina, del manuale:

<br />exec($rigaDiComando,$file_output);<br />

Posso solo suggerire perche' non posso testare.

Come hai scritto tu in $comandoLanciato c'e' l'ultima riga di output del comando.

HP Pavilion dv5-1110el powered by OpenSUSE 13.1 64bit

http://linuxcounter.net/cert/432576.png

Ritratto di kalla
kalla
(Junior)
Offline
Junior
Iscritto: 30/06/2008
Messaggi: 11

Ho voluto riprovare ma il risultato è lo stesso.
Mi sto chiedendo se si possa trovare una soluzione creativa per aggirare il problema.

Ritratto di filotux
filotux
(Monster)
Offline
Monster
Iscritto: 26/11/2006
Messaggi: 307

Dovresti reindirizzare tutti gli stream di output (stdout e stderr) e non solo stdout.

Comunque, hai letto tutti i commenti nell'help della funzione exec()? Hai provato tutte le strade?

Quella suggerita qui mi sembra la migliore.

filotux

Debian Lenny on BeagleBoard

Ritratto di kalla
kalla
(Junior)
Offline
Junior
Iscritto: 30/06/2008
Messaggi: 11

se ho capito bene l'idea sarebbe quella, visto che siamo sotto linux, di crearsi un file bash che lancia la registrazione. Dopodichè nel file php si mette la riga di comando per lanciare il file bash. In questo modo la funzione exec tornerà il valore di successo per aver lanciato il file bash (invece del mio programma).
Nel frattempo il bash ha lanciato il mio programma in background giusto?
Dovrò giusto assicurarmi che il file bash accetti un parametro al lancio, così posso passargli il secondo file.

Ritratto di filotux
filotux
(Monster)
Offline
Monster
Iscritto: 26/11/2006
Messaggi: 307

Quote:

kalla ha scritto:
se ho capito bene l'idea sarebbe quella, visto che siamo sotto linux, di crearsi un file bash che lancia la registrazione. Dopodichè nel file php si mette la riga di comando per lanciare il file bash. In questo modo la funzione exec tornerà il valore di successo per aver lanciato il file bash (invece del mio programma).
Nel frattempo il bash ha lanciato il mio programma in background giusto?

Esattamente.

Quote:

Dovrò giusto assicurarmi che il file bash accetti un parametro al lancio, così posso passargli il secondo file.

.....???.... Sei tu che programmi, sei tu che decidi. Non vedo il problema...

Comunque, prova e facci sapere.

filotux

Debian Lenny on BeagleBoard

Ritratto di kalla
kalla
(Junior)
Offline
Junior
Iscritto: 30/06/2008
Messaggi: 11

Buongiorno!
Sono passati un po' di giorni, ma finalmente ho buone notizie. Lo stratagemma funziona! Smile
Per riuscire a lanciare un programma grazie al codice php e poi farsi aggiornare la pagina si può procedere come segue:

Creo uno script di bash che è in grado di lanciare l'applicativo

Creo la pagina php con il comando che fa partire lo script bash

Creo una seconda pagina php con una scritta "Comando Lanciato" o simili.

Inserisco l'eseguibile che va lanciato

In questo modo l'interfaccia grafica lancerà lo script di bash e aggiornerà la pagina alla fine dello script stesso (1 riga di codice)

Lo script bash invece lancerà realmente il programma che mi serve in maniera indipendente dall'interfaccia PHP.
Per usare questo trucco bisogna assicurarsi di dare alla cartella che contiene i file i permessi giusti per lanciare le applicazioni.
Questo è tutto!

P.S. Stavo quasi valutando di scrivere un tutorial di un paio di paginette per spiegare, con un esempio, nel dettaglio la faccenda. Che ne pensate?

Ritratto di orion
orion
(Guru)
Offline
Guru
Iscritto: 11/07/2006
Messaggi: 2922

Quote:

kalla ha scritto:

P.S. Stavo quasi valutando di scrivere un tutorial di un paio di paginette per spiegare, con un esempio, nel dettaglio la faccenda. Che ne pensate?

Male non fa, e puo` essere d'aiuto ad altri. Magari potrebbe servire anche a te in futuro, chi puo` saperlo...

openSUSE 12.1 on Acer Aspire 1810tz - LXDE ultima versione dal repo x11:/lxde

Ritratto di kalla
kalla
(Junior)
Offline
Junior
Iscritto: 30/06/2008
Messaggi: 11

Buongiorno a tutti!
in questi giorni mi è capitata una cosa strana che mi sta facendo dannare: ho copiato ifile della mia interfaccia grafica su un secondo computer perchè mi serve anche lì ma non riesco a farla andare mentre nella macchina dove l'ho progettata funziona.
Ho fatto un po' di prove e sono arrivato alla seguente conclusione:
se lancio il programma da terminale sia reindirizzando che senza reindirizzare l'output il risultato appare nel terminale ed il processo è nel top.
se lancio il programma con il file bash da terminale il programma funziona ed il processo appare nel top.
se uso l'interfaccia grafica invece non ne vuol sapere di partire e non mi restituisce nessun errore. tra l'altro mi sembra che la mia interfaccia php non riesca neppure a creare dei file di testo di log.
Dove può essere il problema?