[PHP][R] exec() ou system() en continu

Bonjour à tous,

Bon je vais essayer de faire simple ! (pas gagné !)

le projet :
créer une interface web pour le logiciel R (prog évolué de statistiques) complétement guidée à destination des biologistes qui comprennent/connaissent pas R afin d’analyser leurs zolis petites puces à ADN

Actuel:
php lance en ligne de commande via exec() (sytème linux) le logiciel avec comme paramètre un fichier txt contenant les instructions R. Chargement au début des instructions des résultats déjà obtenus à l’étape d’avant et sauvegarde à la fin des nouveaux résultats.
j’ai aussi essayé de faire quelquechose avec proc_open() mais l’essai n’a pas été concluant …

Problème:
le chargement des données existante peut devenir super long, comme on en a besoin pour chaque étapes pas moyen de passer outre, -> entre 1 à 5 mn par page rien que pour recharger les données

Désir:
la possibilité de garder le logiciel en “tache de fond” et pouvoir lui envoyer des commandes au fur et à mesure de la navigation entre les pages comme ça plus besoin de charger les données, juste de faire les nouveaux calculs

Merci d’avance de votre aide si vous voyez une solution à ce problème sinon ben dites le moi aussi pour qu’on puisse prendre une décision !

Yoan

en php seul y’a pas moyen (enfin ça m’a pas l’air trivial). M’enfin j’ai pas la panacée universelle, y’a ptet quelqu’un qui va pouvoir te sortir un truc de derrière les fagots B)

a grand coup d’ajax c’est pas possible ? mais sinon, ca a pas l’air super adapté php, c’est un client lourd qu’il te faudrait (de loin comme ca a premiere vue)

Client lourd ? tu veux dire coder dans un langage quelconque pour obtenir un exécutable ?
Et puis sinon je vais essayer ajax … éventuellement si quelqu’un a un tuto qui poutre à mort … ceux que j’avais trouvé n’était pas forcément ultimes …
merci

Non mais si le logiciel est pas prevu pour des appels asynchrones c’est mort, surtout en php qui base presque tout sur la notion de requete. C’est effectivement un client lourd qu’il te faudrait (et pas dans un langage quelconque, dans un langage facile a utiliser B))

Re coucou juste pour info j’ai trouvé une solution :

en fait il suffit de lancer php en ligne de commande par derrière et d’avoir une boucle quasi infinie :
les fonctions d’appels :

[code]function start_R()
{
exec("/usr/lib/cgi-bin/php5 /var/www/eufori/execR.php “.$_SESSION[‘idsession’].” >/var/www/eufori/retour.txt &");
}
function stop_R()
{
$rep=$_SESSION[‘idsession’];
$chemin="./sessions/".$rep."/instructions.php";
$f=fopen($chemin,“w”);
fwrite($f,’<?$continue=0;?>’);
fclose($f);
}

  • une fonction qui écrit dans instructions.php ce qu’on veut faire avec R (en l’occurence)[/code]

et le fichier exécuté par php en cli :

$continue=1; $instructionp=""; $descriptorspec = array( 0 => array("pipe", "r"), // // stdin est un pipe où le processus va lire 1 => array("pipe", "w"), // stdout est un pipe où le processus va écrire 2 => array("file", "/var/www/eufori/sessions/".$rep."/errors.txt", "a") // stderr est un fichier ); set_time_limit(0); $process = proc_open('R --save', $descriptorspec, $pipes, NULL, NULL); while($continue) { if(include("/var/www/eufori/sessions/".$rep."/instructions.php")) { if($instructionp!=$instruction) { fwrite($pipes[0],$instruction); $instructionp=$instruction; } } } //on ferme tout ds le bon ordre ! fclose($pipes[0]); fclose($pipes[1]); proc_close($process);
voili voilo merci de votre aide !
@+