2010-10-07 10 views
3

Oh mon Dieu. Je n'ai jamais pensé que j'aurais besoin de te demander ça. Mais malheureusement oui, j'en ai besoin!Comment isoler un script de désastre de serveur en PHP?

J'ai un script écrit en PHP de mon cru qui utilise ffmpeg-php. Et ffmpeg-php est un bâtard. Pour certaines entrées cela fonctionne bien, mais pour certains cela plante tout mon PHP et le serveur lance l'erreur interne du serveur 500. J'ai essayé plusieurs fois de mettre à jour ffmpeg-php, ffmpeg lui-même et ainsi de suite, mais quand ça marche 0.5 à 0.6 ça ne marchera pas. Et ce dont j'ai besoin c'est de m'assurer que le reste du script sera traité correctement. Et maintenant, il ne le fait pas, parce que quand il s'agit de courir àGDImage() sur la trame de film, j'ai Erreur Server interne 500 et pas de commentaires pourquoi à partir de n'importe quelle source.

Donc, pour la tranquillité d'esprit de mes utilisateurs, j'ai décidé que je devais isoler cette partie du script qui gâte avec ffmpeg-php. J'ai besoin d'un moyen d'assurer que si quelque chose va terriblement mal dans cette partie, le repos continuera.

Essayez la capture ne fonctionne pas parce que ce n'est pas un avertissement, ni une erreur fatale, c'est un horrible serveur-catastrophe. Alors, quelles sont vos suggestions?

Je pense à mettre ce script dans un autre fichier appelé ffmpeg-php-process.php et l'appeler via HTTP et lire le résultat, si elle est Erreur Server interne 500 - Je sais que ce n'était pas correct.

Ou y a-t-il d'autres moyens, plus soignés, d'isoler les scripts de désastre en PHP?

Ps. N'écrivez pas que j'ai besoin de diagnostiquer ou déboguer ou trouver la source de l'erreur. Je ne suis pas un foutu débutant et je ne suis pas un développeur de ffmpeg à gâcher son code, j'ai besoin de sécuriser mes utilisateurs maintenant, et c'est tout ce dont j'ai besoin maintenant.

Répondre

2

Si vous obtenez une erreur 500, c'est parce qu'une exception quelconque est levée à un niveau inférieur à celui de PHP lui-même. A moins que votre code ne tourne dans une boucle infinie ou n'atteigne une limite de récursivité (et surtout qu'il fonctionne avec la version 0.5), il y a de fortes chances que ffmpeg ou ffmpeg-php plante et prenne l'instance de PHP il. Franchement, il n'y a rien que vous puissiez faire avec PHP. Votre meilleur pari serait, puisque vous avez déjà accès au serveur, d'écrire le script en question en utilisant un langage comme Python. Il y a une tonne de plugins ffmpeg python, donc vous ne devriez pas avoir du mal à le configurer. Appelez votre script Python depuis PHP et récupérez la sortie d'un fichier. Qu'est-ce que cela va faire est d'isoler PHP de votre script échouant. Ça va aussi vous éloigner de ffmpeg-php (qui, au moins pour moi, semble être une combinaison malsaine). Si vous ne voulez pas utiliser PHP (ce que je ne recommande pas), vous pouvez lancer un autre script PHP en utilisant php-cli depuis votre script PHP externe et faire le travail à partir de là (comme vous le feriez avec Python). Encore une fois, je vous recommande fortement d'éviter cela.

Espérons que cela aide!

1

J'ai quelque chose de similaire avec un système de courrier électronique php hérité volumineux, volumineux et encombrant. Quand il est devenu évident que le système de messagerie devenait sa propre bête, nous l'avons séparé en tant que son propre serveur virtuel entièrement. Il n'y a pas de séparation comme une séparation PHYSIQUE. Et bon, les serveurs virtuels sont bon marché ....

Du côté positif, vous pouvez démarrer, redémarrer, et généralement détruire le serveur séparé avec peu d'effet sur le reste de votre code. Il peut également avoir des implications de sauvegarde améliorées (isoler les médias et la logique) Depuis cette route, nous n'avons jamais pris le serveur d'application principal vers le bas.

Cependant, cela crée un problème de connexion comme maintenant plutôt que de vous local de travail allez avoir votre serveur parler à un autre séparés par au moins un peu de fil dans la même armoire (je l'espère)

2

Vous pourriez générer un nouveau processus contenant votre script php-ffmpeg. Il y a quelques fonctions pour faire cela: proc_open() comme instance.

La documentation a un exemple pas mal à son sujet: http://php.net/proc_open

+0

serait le meilleur isolement. Vous pourriez même automatiser les travailleurs avec 'gearman' &' multiwatch' – Wrikken