2017-03-27 11 views
0

Ich habe einen Cronjob 'cron_parent.php' in meinem Wurzelverzeichnis eingerichtet. Es funktioniert wie folgt:Ein Cronjob für mehrere Subdomains

  1. prüfen, welche Kundenordner vorhanden sind (dh Sub-Domains.)
  2. Mit foreach(), umfassen die cron_child.php für jeden relevanten Sub-Domain
  3. Die eigentliche Arbeit in jeder Subdomain zu cron_child.php erfolgt .

Alle Subdomains enthalten identische PHP-Dateien und Funktionen. So natürlich, lief ich in Schwierigkeiten, wenn diese unter Verwendung von auf mehr als eine Sub-Domain, weil

<b>Fatal error</b>: Cannot redeclare fserror() (previously declared in 
/home/***hidden***/public_html/demo/dbconfig.php:28) 
in <b>/home/***hidden***/public_html/dev/dbconfig.php</b> on line <b>44</b><br /> 

Ich weiß, dass include() ist wahrscheinlich nicht die richtige Option hier. Gibt es eine Möglichkeit, die cron_child.php von cron_parent.php getrennt zu starten?

Edit: Hinzugefügt Code aus cron_parent.php:

<?php 
date_default_timezone_set("Europe/Oslo"); 
header('Content-Type: text/html; charset=utf-8'); 

$root = dirname(dirname(__FILE__)); 
$directories = glob($root . '/*' , GLOB_ONLYDIR); 

foreach($directories as $path) 
{ 
    if(is_file("$path/cron_child.php")) 
    { 
    include("$path/cron_child.php"); 
    } 
} 

Zu Testzwecken enthält cron_child.php nur dieses Recht jetzt:

<?php 
include "functions.php"; 
return false; 
+0

Zeigen Sie Ihren Code! Es gibt auch 'require_once' und' include_once'. Aber ich schätze, Sie müssen sich Muster anschauen;). –

+0

Ja können Sie! Sie können einen neuen PHP-Prozess mit 'exec ('php /path/to/script.php')' starten, der dann als untergeordneter Prozess ausgeführt wird. – JensV

+0

@E_p Sie haben wahrscheinlich recht, wenn Sie sich Designmuster ansehen. Ich könnte natürlich einen Cronjob für jede meiner Subdomains einrichten, aber ich dachte, es wäre einfacher, einfach eine Parent-PHP-Datei zu haben, die das cron_child in jeder Subdomain ausführt. Gibt es einen anderen Weg, dies zu tun? – aanders77

Antwort

2

auf DirectoryIterator Lesen Sie up, Classes

So etwas sollte funktionieren (nur Struktur):

// main.php 
<?php 

    require_once('jobHandler.php'); 

    foreach (new DirectoryIterator('your/folder') as $fileInfo) { 
     // If it is not folder skip; 
     if($fileInfo->isDot() || ! $file->isDir) continue; 

     $worker = new jobHandler($folderToProcess); 
     $worker->run(); 
    } 


// jobHandler.php  
<?php 

    class jobHandler 
    { 
     public function __construct($folder) 
     { 
      // validation here 
     } 

     public function run() 
     { 
      echo $this->folder . PHP_EOL; 
      // Do your work here. 
     } 

     private $folder = null;   
    } 

Und Sie können Jobkonfiguration in den Kundenordnern speichern.

+0

Ich glaube nicht, dass dies die Ursache des Problems ist. Die Verwendung von glob zum Auflisten der Verzeichnisse funktioniert genauso gut. – JensV

+1

@JensV Das Problem ist 'includes'. Ich habe den Weg gezeigt, die Logik mehrfach zu vermeiden. –

+0

oh ja, wenn der Fall ist, dass Sie die gleiche Arbeit in jedem Unterverzeichnis tun müssen, ist ein solcher Ansatz viel klüger. – JensV