2010-03-09 4 views
4

Je tente d'exécuter la commande suivante en PHP (sur Ubuntu):exec() de PHP ne fonctionne pas avec ffmpeg

<?php 
if (exec("/home/johnboy/ffmpeg/ffmpeg -i test1.mp4 -acodec aac -ab 128kb -vcodec mpeg4 -b 1220kb -mbd 1 -s 320x180 final_video.mov")) 
     { echo "Success"; } 
     else { echo "No good"; } 

Et je suis toujours « Incorrect » en écho, et aucun fichier créé. Il est intéressant de noter que si j'exécute exactement la même commande dans Shell, cela ne pose aucun problème.

En outre, lorsque je cours le même code ci-dessus, mais que je remplace "whoami" au lieu de ffmpeg, cela fonctionne. (Il renvoie écho "Succès")

Des idées sur pourquoi cela ne fonctionnerait pas? Merci.

+0

Compris. Apparemment, le répertoire était lisible, mais pas inscriptible. Par conséquent, ffmpeg n'a pas pu créer le nouveau fichier. J'ai créé un répertoire de sortie différent et le chmod 777, voilà! – Dodinas

Répondre

2

L'utilisateur apache/web peut-il atteindre /home/johnboy/ffmpeg/ffmpeg? C'est, peut-être /home/johnboy est 0700 au lieu de 0755?

Peut-être y a-t-il des limites de ressources affectant le chargement d'un programme aussi important et de toutes ses bibliothèques?

Si vous exécutez le script sur php cli sapi, est-ce qu'il se comporte correctement? Même en cours d'exécution en tant qu'utilisateur apache?

Que montre strace -ff lorsque l'utilisateur Web Apache exécute le script PHP à travers le php CLI?

+0

Merci pour votre réponse. Est-ce que je me suis assuré que ffmpeg et johnboy étaient chmod à 755. En outre, j'ai couru la commande de php test.php du shell, et cela a fonctionné bien. Donc, je sais que le script fonctionne. Il ne fonctionnera pas à partir du navigateur Web. Je ne suis pas sûr de ce que strace -ff est, ou où je devrais l'exécuter? – Dodinas

+0

@Dodinas: vous écririez strace -ff php fichier.php> log.txt 2> & 1 et télécharger ce log quelque part (après l'avoir examiné attentivement) Aussi, si PHP est en mode sans échec lorsqu'il est exécuté à partir d'Apache, le script pourrait ne pas fonctionner; Vérifiez votre journal des erreurs apache. – geocar

+1

@Dodinas: Apache at-il un accès en écriture au répertoire/var/www? – geocar

0

Vous utilisez des chemins d'accès relatifs aux noms de fichiers. Êtes-vous sûr d'exécuter la commande dans le bon répertoire?

+0

Oui, parce que dans le shell, je cd à/var/www (l'emplacement du fichier php) et exécuter la commande là. En conséquence, il crée avec succès le final_video.mov dans le directeur/var/www/ – Dodinas

0

La fonction exec() ne renvoie que la dernière ligne de sortie, je suppose que la dernière ligne de cette commande est vide. Si vous voulez tout le contenu de la commande, vous devriez utiliser shell_exec().

également garder une trace de l'endroit où la commande est en cours d'exécution, essayez: print(shell_exec("pwd"));

+0

drôle je reçois un tableau de exec – kezi

1

Il y aurait des problèmes si vous voulez exécuter quelque chose de cette façon.
1. Peut-être que vous avez un problème de permission, le serveur web a des limitations pour gérer une certaine exécution sur le système.
2. Votre fichier de chemin d'accès est peut-être incorrect.
3. vous pouvez essayer d'utiliser shell_exec pour exécuter l'exécution sur le système.

Quoi qu'il en soit, ce que je ferais pour que mon exécution se passe bien est, J'écrirai 2 programmes avec le passage de message inclus entre eux, par exemple le programme du serveur client. Le serveur attendrait quelques messages du client pour exécuter une commande (toutes les commandes, il n'y aurait pas de problèmes d'autorisation). Tout ce que vous avez à faire dans votre web, c'est d'appeler votre application client. Ce que je souligne est de construire une interface à partir du web et du système. Cela résoudrait beaucoup de problèmes avec les problèmes d'autorisation.

espérons cette aide.

4

obtenir le stderr donnera le résultat

essayer

ffmpeg -i inputfile [more_params] 2>&1 
0

Activer safemode et il fonctionnera

2

Utilisez cette

$ffmpeg = "ffmpeg Installed path"; 
$flvfile = "source video file with root path"; 
$png_path " "Destination video file with root path and file type"; 


exec("$ffmpeg -y -i $flvfile -vframes 1 -ss 00:01:60 
    -an -vcodec png -f rawvideo -s 110x90 $png_path"); 
0
$output = shell_exec('/home/person/www/ffmpeg 2>&1'); 
echo "<pre>$output</pre>"; 

avis 2> & 1 partie ...