2017-08-01 6 views
0

Désolé pour le texte long.Fonction d'appel PHP dans un processus séparé

Je cherche une idée pour déclencher l'exécution de la fonction php (dans un répertoire différent, testé et dans le même répertoire) lorsqu'un acte spécifique se produit.

Le système est Debian et le framework PHP yii. Avec API, nous recevons de nouvelles données du serveur distant et pour une valeur spécifique dans les données que nous recevons j'ai besoin de démarrer la fonction dans un processus séparé. Pas besoin d'attendre son achèvement. En raison du temps de réponse de l'API, je ne peux pas intégrer cette fonction et l'intégration décompose l'API en la rendant inutilisable. J'ai lu des dizaines de réponses sur Stackoverflow et de nombreux autres exemples. Pour le test, j'ai juste essayé de créer un nouveau dossier à un endroit spécifique et le fichier n'a pas été créé (problème de permission je pense mais ne peut pas confirmer puisqu'il le fait si fait du code principal - API). Il est censé faire ce qui suit:

  • passe 2 arguments reçus API pour fonctionner
  • créer un dossier si elle n'existe pas
  • appel de classe interne qui utilise fpdf pour imprimer le fichier pdf.
  • enregistrer le document et l'envoyer par courrier électronique avec PHPMailer.

Impossible d'utiliser pcntl_fork car il nécessite une installation supplémentaire (ce que je ne suis pas autorisé à faire).

sujets couverts:

  • bifurquent avec pcntl_fork (. Exécution arrête sur l'atteindre)
  • popen/pclose, exec, proc_open/proc_close (absence de réponse et ne peut pas confirmer la fonction effectivement entrée).

Bien entendu cette situation exclut la possibilité d'utilisation d'include et require.

ne peut pas libérer le code api, mais voici ce que je demandais à faire:

background.php

$docs_dir='test_folder'; 
if (!file_exists('/var/www/created_documents/'.$docs_dir)) 
{ 
    mkdir('/var/www/created_documents/'.$docs_dir, 0777, true); 
    chmod('/var/www/created_documents/'.$docs_dir, 0777); 
} 

Et il ne fait rien.

Quelques exemples de ce que j'ai utilisé dans le code api pour y accéder (beaucoup d'autres ont été supprimés au travail).

$proc = popen('php ' . __DIR__ . '/background.php &', 'r'); 
return $proc; 
while (!feof($proc)) 
{ 
    $data = fgets($proc); 
    var_dump($data); 
} 


exec("php background.php"); 


$cmd = "php background.php"; 
$timer = popen("start ". $cmd, "r"); 
pclose($timer); 


exec($cmd . " > /dev/null &"); 
pclose(popen("php background.php &","r")); 
+0

Ressemble à l'utilisation d'une file d'attente, empile les tâches et les traite en arrière-plan. –

+0

Difficile à développer dans le dar, consignez vos erreurs sur un fichier avec ces 2 lignes: ini_set ("log_errors", 1); ini_set ("error_log", chemin_du_fichier); –

Répondre

1

Vous pouvez faire une demande http interne distinct à l'aide curl and its async funcionality. Ou vous pouvez utiliser un mécanisme de file d'attente où une partie déclenche un événement et l'autre partie le consomme. RabbitMQ ou Gearman pourrait le faire pour vous.

+0

Curl ressemble seulement à l'option puisque je ne peux pas installer quelque chose de nouveau. Je vais continuer à essayer avec cette approche. – Aleks

+0

Merci de votre suggestion. Je vais essayer ça plus tard puisque j'ai dû changer de sous-projet en attendant. – Aleks