2017-10-19 35 views
0

Ceci est mon fichier cronjob.php et dans la base de données mysql j'ai un row['cronjob'] et sa valeur est test1.php et qui est juste le nom d'un de mes fichiers PHP doivent être exécutées lorsque la ligne de date/heure est égale ou inférieure à l'heure actuelle, pendant l'exécution du travail cron. Je pensais que je peux faire un while-loop puis obtenir le nom du fichier à partir du cronjob row puis l'exécuter si le datetime est égal ou inférieur à l'heure actuelle lorsque le travail du maïs est exécuté. S'il vous plaît voir ci-dessous:Comment puis-je exécuter plusieurs fichiers php dans un cron job et une boucle

while($row = mysqli_fetch_array($result)){ 
     $detime = strtotime($row['date']); 
     $id = $row['id']; 
     $phpfile = $row['cronjob']; 

      if($detime <= time()){ 
        include $phpfile; 
        $sql2 = "UPDATE my-table SET cronstatus = 1 WHERE id = $id "; 
        $result2 = mysqli_query($conn, $sql2); 
      } 
    } 

Cependant, j'ai une erreur Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean dès comprennent include $phpfile; (avant que la boucle fonctionne sans erreur !. En ajoutant au code comprennent, seule la première ligne va être exécuté (alors qu'il y a une erreur!) et while-loop ne fait pas son travail Quelle est la meilleure façon d'exécuter tous mes fichiers php en utilisant un job cron qui s'exécute toutes les x-minutes en vérifiant le datetime par rapport au courant Appréciez si vous pouvez écrire le bon code!

Répondre

0

Je vous suggérerais de changer un peu de tactique. Considérez la structure de fichier suivante:

  • /emploi
  • /jobs/JobInterface.php
  • /jobs/MyFirstJob.php
  • /jobs/MySecondJob.php
  • /emploi/< .. plus d'emplois ..>
  • /cron.php

Chaque fichier qui se termine dans Job dans les emplois dossier contient une classe qui implémente l'interface trouve dans JobInterface.php. Cette interface nécessite que tous les Jobs aient une méthode "run".

Vous utilisez ensuite autoloading ou vous incluez simplement tous les fichiers dans le dossier des tâches manuellement en haut de cron.php, qui est toujours le fichier que vous exécutez.

Dans le champ "cronjob" de votre base de données, vous avez le nom du travail (c'est-à-dire le nom de classe), pas le nom du fichier.

$job_class_name = $row['cronjob']; 
if (false === class_exists($job_class_name)) throw new Exception("No such job"); 
$job = new $job_class_name; 
if (false === $job instance JobInterface) throw new Exception("Not a job"); 
$job->run(); // since the interface requires all jobs to have this method