2010-03-13 12 views
3

hy,comment faire une file d'attente en php avec MySQL

dans mon script i exécuter une fonction exec() pour un fichier vidéo avec ffmpeg.

le problème est ffmpeg peut fonctionner seulement 1 fois sur le serveur,

si 2 personnes sont en ligne sur le serveur et premier déjà exécuté ffmpeg je veux le second à attendre jusqu'à ce que la première extrémité du processus

comment coder ceci?

merci

Répondre

3

Définissez un verrou quelque part. Lorsque ffmpeg démarre, définissez un indicateur dans un fichier ou une table de base de données pour le marquer comme étant en cours. Chaque fois que ffmpeg démarre, faites-le vérifier si la valeur de l'indicateur est '1', et si c'est le cas, attendez et réessayez dans 5 ou 10 secondes. Puis, lorsque le processus se termine, mettez le drapeau à '0'. Assurez-vous que s'il se bloque ou si votre script a une erreur, le drapeau est remis à '0'. Vous pouvez également exécuter le processus ffmpeg en tant qu'utilisateur différent et en exécuter plusieurs en même temps.

+0

comment exécuter un processus en tant qu'utilisateur différent de php? – robert

+0

Cela peut fonctionner et est rapide, mais pas efficace. Sur l'hébergement partagé, vous serez banni à coup sûr lorsque vous faites des choses comme ça. – Alfred

+0

@robert Si vous utilisez un hôte partagé, il est très probable que vous ne puissiez pas exécuter un autre utilisateur à moins d'avoir plusieurs comptes. – JAL

3

Pour l'amour de Jebus, don't implement your own queue. Écrivez un démon qui récupère les messages et traite les fichiers.

+3

+1 pour faire glisser Jebus dans ceci :) –

+0

Je ne peux pas compiler et installer librabbitmq! je n'ai pas accès au serveur racine – robert

0

Vous pouvez utiliser une file d'attente asynchrone. Chaque nouvelle requête est ajoutée à la file d'attente sous forme de message. Votre processus lit un message à la fois et gère la demande de conversion.

Pour une file d'attente PHP, vous pouvez essayer Dropr ou similaire.

2
  1. Pourquoi ne vous utilisez video hosting service (gratuit) comme par exemple youtube/vimeo pour ce qui sont beaucoup mieux préparés pour la manipulation ce alors vous pourriez jamais. Youtube a un API pour toutes sortes de choses.
  2. Exécutez-vous exec à partir de shared hosting? Si c'est le cas, soyez averti d'être banni parce que l'hébergement partagé n'aime pas que vous utilisiez le CPU de cette façon. Ils veulent des requêtes Http courtes (dans les 30 secondes). Le reste ne s'applique pas à votre hébergement, vous devriez d'abord mettre à jour.
  3. Comme Ignacio dit que vous devez installer une file d'attente de messages (besoin boîte de linux avec accès shell) comme par exemple:

    1. redis Si vous avez une boîte Linux avec un accès ssh la meilleure façon d'installer serait redis. Ensuite, votre processus fffmpeg à long terme (script php) doit se connecter à redis et récupérer les messages de la file d'attente un par un lorsque vous êtes prêt pour le traitement de la vidéo. Le client devrait simplement mettre un message dans la file d'attente. Je conseillerais de regarder ce rapide video pour obtenir les bases de redis.
    2. beanstalkd
    3. gearman

Espérons que cela vous aide un peu. J'écris aussi une simple file d'attente de tâches en Java, mais je n'ai pas encore terminé complètement. J'espère que dans une semaine, je peux soumettre ma première version sur github.

+0

merci et bonne chance – robert