[RESOLU] Demand d'aide sur la commande Exec sur macOS

Eléphant du PHP | 70 Messages

14 déc. 2015, 14:03

Bonjour à tous,

je suis une personne ayant un handicap (parmi d'autres) au niveau de la parole. Mon empreinte vocale est très particulière et parfois inintelligible. Membre d'une radio associative, je n'ai jamais pu faire d'émission à cause de ceci.
Toutefois, je suis amené, dans d'autre contextes, d'avoir besoin de voix, notamment pour mes tutoriels de mon site web, traitant des actualités culturelles de ma région.
Pour monter ces tutoriel, avec une voix intelligible, j'utilise la commande say (en ligne de commande) sur mon mac et n'ai pas trouvé d'IHM pour faciliter son utilisation. Actuellement, malgré mes compétences en programmation, je n'ai pu que faire un fichier openoffice calc me générant des lignes de commandes à copier-coller dans la console du mac

(vous trouverez un execple ici : http://www.cjoint.com/c/ELolq13Ln3A)

J'ai commencé le développement d'une petite page php qui me ferai ceci, donc voici une parti du code, loorsque je clique sur ne bouton submit (qui fonctionne puisque mon echo fonctionne)

Code : Tout sélectionner

if ($_POST["valider"] == "valider") { if (isset($_POST["nom_fic"])) { echo "Toto"; //Exemple : say -r 175 "Un message de validation vous informe de la bonne prise en compte de la saisie de votre événement." -o 37.aiff $ligne = 'say -r ' . $_POST["rapidite"] . ' "' . $_POST["texte"] . '" -o ' . '/Users/sebastien/temp/voix/' . $_POST["nom_fic"] . '.aiff'; echo $ligne; exec($ligne); } }
Le dossier comporte les droits 777 donc on peut écrire dedans. L'affichage de la ligne fonctionne donc on passe bien dans la boucle.
Je me heurte à un problème, la commande ne me genere pas de fichier, alors que sur X11 (ligne de commande) le fichier est bien généré

Y'a t il des blocages Exec au niveau de la config PHP ? et si oui, où changer cela ? a moins qu'il y ait autre chose
J'ai aissi essaye avec la commande system à la place de exec, même punition

J'ai aussi vérifier que la fonction n'était pas désactivé ds le php.in (disable_functions=), mon safe_mode est a off

Merci à vous pour votre aide

ynx
Eléphant du PHP | 289 Messages

15 déc. 2015, 15:48

Salut,

L'instruction exec() accepte deux paramètres supplémentaires qui seront automatiquement remplis par le retour de la commande exécutée.
Essaye de modifier ton utilisation de exec() comme ceci pour voir les messages de retour :
exec($ligne, $output, $return_var);

echo 'output :<br />';
var_dump($output);

echo 'return_var :<br />';
var_dump($return_var);
Il s'agit peut être d'un problème de droit sur l'exécutable say. Il faut effectivement que l'utilisateur du serveur web (Apache je suppose) ait les droits d’exécution sur le programme say (quitte à passer également cet exécutable en 777 pour faire simple).

Bonne journée,

Eléphant du PHP | 70 Messages

17 déc. 2015, 14:00

Merci de ta réponse, je n'ai eu la notification mail de ta réponse et donc je ne me reconnecte que maintenant.
Effectivement, sous la douche ce matin, avant de voir ta réponse, c'est ce à quoi je viens de penser.

Avec les echo, voila ce que ca donne

Code : Tout sélectionner

output : array(0) { } return_var : int(5)
JE voulais te,nter ton idée mais pour faire un chmod sur Say, encore faut il le trouver ;-) Je v ais investiguer....

Eléphant du PHP | 70 Messages

17 déc. 2015, 14:19

J'ai trouvé, 15 min apres ma premiere réponse, le passage de say en 777 mais ca ne donne rien de mieux, la création de fichiers ne fonctionnent pas non plus. Toutefois, je viens de me rendre compte que l'utilisateur (chose a laquelle je n'avais pas pensé) n'a pas les droits pour écrire dans le dossier de destination. Je l'ai aussi changé en 777 mais ca n'a rien apporté de mieux.

Bon, je conçois que PHP n'est pas le meilleur langage pour faire ce genre de truc mais ca devrait marcher qd meme :-)

ynx
Eléphant du PHP | 289 Messages

17 déc. 2015, 15:21

D'après le manuel de la commande say, celle-ci retourne une valeur différente de 0 si une erreur est survenue : https://developer.apple.com/library/mac ... say.1.html

Le var_dump($return_var); indique que la commande retourne la valeur 5, il semble donc bien qu'il y ai une erreur lors de l’exécution de la commande say.
Toujours d'après la doc, "Diagnostic messages will be printed to standard error". Mais ne connaissant pas bien MAC, je ne sais pas où trouver ces erreurs (dans un fichier log ?).

Eléphant du PHP | 70 Messages

17 déc. 2015, 16:52

D'accord je comprends mieux. Mais en ligne de commande ca marche, il y a donc blocage à un endroit (droits ?)

Eléphanteau du PHP | 23 Messages

27 déc. 2015, 15:13

Bonjour,

Peux tu rajouter ces instructions à ton script :
exec("pwd",$dir);
var_dump($dir);
Et vérifier quels sont les droits à cet emplacement?

Eléphant du PHP | 70 Messages

27 déc. 2015, 19:30

Bonsoir et merci de se pencher sur mon problème

Voila les derniers tests demandés. Le var_dump me sort :
array(1) { [0]=> string(41) "/Applications/XAMPP/xamppfiles/htdocs/say" } output :
array(0) { } return_var :
int(5)
Pour les droits, le répertoire qui contient le fichier php est en
drwxrwxrwx 7 sebastien admin 238 27 déc 17:56 say
et le répertoire de destination, qui n'est pas dans le sous répertoire du serveur Apache mais dans mon home, est en
drwxr-xr-x 42 sebastien staff 1428 22 déc 19:06 voix
Je l'ai passé en 777 pour voir mais pas mieux :-(
drwxrwxrwx 42 sebastien staff 1428 22 déc 19:06 voix
Le fichier n'est toujours pas généré.

Voici mon code corrigé :

Code : Tout sélectionner

<?php session_start(); $t = array(); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <?php if (@$_POST["valider"] == "valider") { exec("pwd",$dir); echo "<hr>Voici le dump<br>"; var_dump($dir); echo "<hr>"; if (isset($_POST["nom_fic"])) { // say -r 175 "Un message de validation vous informe de la bonne prise en compte de la saisie de votre événement." -o 37.aiff $ligne = 'say -r ' . $_POST["rapidite"] . ' "' . $_POST["texte"] . '" -o ' . '/Users/sebastien/temp/voix/' . $_POST["nom_fic"] . '.aiff'; //passthru("/Applications/Calculator.app"); exec($ligne, $output, $return_var); echo 'output :<br />'; var_dump($output); echo 'return_var :<br />'; var_dump($return_var); } } ?> <h1>SAY</h1> <form name="saisie" method="post" action="index.php"> Saisir votre texte :<br /> <textarea name="texte" style="width:80%;height:120px;"></textarea><br> Rapidité : <input type="text" name="rapidite" value="175"> Nom du fichier (sans extension) : <input type="text" name="nom_fic" value=""> <input type="submit" name="valider" value="valider"> </form> </body> </html>
et le résultat dans le navigateur

Code : Tout sélectionner

[color=#000000]Voici le dump array(1) { [0]=> string(41) "/Applications/XAMPP/xamppfiles/htdocs/say" } output : array(0) { } return_var : int(5) [/color]
je me demande s'il n'y a pas des sécurités au niveau de XAMPP

Eléphanteau du PHP | 23 Messages

27 déc. 2015, 20:54

Peux tu temporairement faire sortir le fichier dans le répertoire xampp au lieu de ton répertoire User?

Soit :
$ligne = 'say -r ' . $_POST["rapidite"] . ' "' . $_POST["texte"] . '" -o ' . '' . $_POST["nom_fic"] . '.aiff';
Et regarder si l'écriture du fichier est effectuée.

Eléphant du PHP | 70 Messages

27 déc. 2015, 21:02

oups, j'ai oublié de préciser mais j'avais déjà essayé, c'est même le premier test que j'ai fait :-

Code : Tout sélectionner

Voici le dump array(1) { [0]=> string(41) "/Applications/XAMPP/xamppfiles/htdocs/say" } output : array(0) { } return_var : int(5)

Eléphanteau du PHP | 23 Messages

27 déc. 2015, 23:24

Et un test en gardant le répertoire user mais en mettant le texte en dur et en retirant le réglage de rapidité?

Quelque chose comme ça :
$ligne = "say \"Test voix\" -o /Users/sebastien/temp/voix/". $_POST["nom_fic"].".aiff";

Eléphant du PHP | 70 Messages

28 déc. 2015, 14:27

TTest effectué sans grands résultats

Code : Tout sélectionner

Voici le dump array(1) { [0]=> string(41) "/Applications/XAMPP/xamppfiles/htdocs/say" } output : array(0) { } return_var : int(5)
voici l'integralité du code (à force de changements, je vois eut être plus des évidences qui me sauteraient aux yeux d'habitude)

Code : Tout sélectionner

<?php session_start(); $t = array(); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <?php if (@$_POST["valider"] == "valider") { exec("pwd",$dir); echo "<hr>Voici le dump<br>"; var_dump($dir); echo "<hr>"; if (isset($_POST["nom_fic"])) { // say -r 175 "Un message de validation vous informe votre événement." -o 37.aiff // $ligne = 'say -r ' . $_POST["rapidite"] . ' "' . $_POST["texte"] . '" -o ' . '/Users/sebastien/temp/voix/' . $_POST["nom_fic"] . '.aiff'; // $ligne = 'say -r ' . $_POST["rapidite"] . ' "' . $_POST["texte"] . '" -o ' . $_POST["nom_fic"] . '.aiff'; $ligne = "say \"Test voix\" -o /Users/sebastien/temp/voix/". $_POST["nom_fic"].".aiff"; //passthru("/Applications/Calculator.app"); exec($ligne, $output, $return_var); echo 'output :<br />'; var_dump($output); echo 'return_var :<br />'; var_dump($return_var); } } ?> <h1>SAY</h1> <form name="saisie" method="post" action="index.php"> Saisir votre texte :<br /> <textarea name="texte" style="width:80%;height:120px;"></textarea><br> Rapidité : <input type="text" name="rapidite" value="175"> Nom du fichier (sans extension) : <input type="text" name="nom_fic" value=""> <input type="submit" name="valider" value="valider"> </form> </body> </html>
et pour rappel, voici un ls -l du dossier

Code : Tout sélectionner

drwxrwxrwx 7 sebastien admin 238 28 déc 13:20 say

Eléphanteau du PHP | 23 Messages

29 déc. 2015, 01:50

Bonsoir,

Avant
if (@$_POST["valider"] == "valider")
Placer les lignes suivantes :
exec('unset DYLD_LIBRARY_PATH ;');
putenv('DYLD_LIBRARY_PATH');
putenv('DYLD_LIBRARY_PATH=/usr/bin');
Puis tester.

Eléphant du PHP | 70 Messages

29 déc. 2015, 16:08

Bonjour et merci, je viens de le faire et ça marche. Mais j'avoue que là le ne comprends pas du tout à quoi correspond ces lignes, mais ca marche !
Je suppose que putenv est pour changer des variables d'environnement mais (si c'est le cas) j'en comprends pas beaucoup plus.
Pourrais je en savoir plus ?
Et si c'est le cas, y'a t il des modifications a remettre, après coups (donc après mon return var) pour retrouver un état initial ?

Eléphanteau du PHP | 23 Messages

29 déc. 2015, 17:55

Bonjour,

Pour reproduire le problème j'ai fait tourner le script dans les mêmes conditions (OSX et XAMPP).

Ensuite j'ai changé la commande exec pour rediriger le flux d'erreur vers le flux de sortie standard ce qui m'a permis de récupérer le message d'erreur via PHP.
exec("say \"test\" 2>&1",$output,$return);
var_dump($output);
var_dump($return);
Dans mon cas le message (abrégé) était le suivant :
dyld: Symbol not found

Avec un peu de recherche Google on arrive à cette page : https://stackoverflow.com/questions/249 ... doest-work

La variable DYLD_LIBRARY_PATH contient l'emplacement où chercher les bibliothèques et XAMPP réécrit cette variable (dans ce fichier /Applications/XAMPP/xamppfiles/bin/envvars) pour pointer sur les siennes au lieu du répertoire /usr/bin d'OSX.

Pas de modifications nécessaires à mon avis puisque le changement de valeur de DYLD_LIBRARY_PATH n'est valable que pour la durée du script d'après la documentation PHP (https://secure.php.net/manual/fr/function.putenv.php).