2012-12-10 3 views
7

J'essaie actuellement de générer un epub sur demenad à partir de contenu qui est disponible pour moi. Malheureusement, quand il y a beaucoup de contenu pour l'epub, il faut un peu de temps (10 minutes dans certains cas) pour compléter la requête http - ce qui n'est pas idéalPHP - Tâche de fond en cours d'exécution

Je veux suivre une approche similaire à celle de Safari - Générer un epub et e-mail à l'utilisateur lorsque le document est disponible

Ma question est - quelle est la meilleure façon pour l'exécution d'une tâche de fond/thread en PHP qui pourrait prendre beaucoup de temps pour terminer

+1

Notez que si vous utilisez un hôte Web partagé, votre hôte peut ne pas autoriser l'exécution des scripts pendant de longues périodes. Par conséquent, vous devrez peut-être découper le travail (si possible). –

Répondre

16

Vous voulez être prudent avec les processus PHP de longue durée, car un PHP n'est pas très efficace en mémoire (par exemple, un tableau de seulement 100 ints en PHP peut consommer jusqu'à 15KB de mémoire). Ceci est normalement bien pour 99% des cas d'utilisation, car la plupart des gens utilisent PHP pour les sites Web et ces processus s'exécutent pendant une fraction de seconde, donc la mémoire est sacrifiée pour la vitesse. Cependant, pour un processus de longue durée (surtout si vous en avez beaucoup), ce n'est peut-être pas la meilleure solution. Vous devez également faire très attention à appeler les fonctions exec/shell_exec en PHP car elles sont implémentées en interne en tant que flux (c'est-à-dire qu'elles peuvent bloquer le processus parent car elles doivent normalement attendre sur le flux pour retourner les données).

Une option pour l'arrière-plan de la tâche est d'utiliser fork. Cependant, je suggère fortement d'utiliser un gestionnaire de travaux approprié comme gearman (voir php extensions également), ou file d'attente, comme amqp ou zmq, pour gérer ces tâches plus proprement. Lequel est le plus adapté à votre cas d'utilisation, je vous laisse décider.

1

vous pouvez exécuter la commande

$command = 'nohup >/dev/null 2>&1 /your/background/script.php &' 
Questions connexes