MetaModels Workshop in Berlin
Ergebnis 1 bis 14 von 14

Thema: Dateisynchronisation von files und Datenbank triggern

  1. #1
    Contao-Fan
    Registriert seit
    09.05.2011.
    Ort
    Hamburg
    Beiträge
    296

    Standard Dateisynchronisation von files und Datenbank triggern

    Hallo,

    ich versuche gerade die Dateisynchronisation zwischen den Dateien im Ordner "files" und der Datenbank anzustoßen. Es gibt dafür im Backend ja einen Button im Bereich "Dateiverwaltung".
    Aber ich möchte das Ganze gern über ein Script realisieren. Ich finde nur einfach nicht die Richtige Methode den dazugehörigen Aufruf dafür. Mein Überlegung war die Funktion "sync" aus DC_Folder.php zu nutzen, nur weiß ich nicht so recht wie ich diese Funktion aufrufen soll, oder ob es überhaupt die richtige Funktion ist.

    Ich wollte das Ganze erst einmal ganz simple von einer externen Datei aus starten und habe ich an der cron.php orientiert und folgendes geschrieben:

    PHP-Code:
    <?php

    /**
     * Initialize the system
     */
    define('TL_MODE'BE');
    require '
    ../initialize.php';


    class Synchronisation extends Backend
    {

      /**
       * Initialize the object (do not remove)
       */
      public function __construct()
      {
        parent::__construct();

        // See #4099
        define('
    BE_USER_LOGGED_IN', false);
        define('
    FE_USER_LOGGED_IN', false);
      }


      public function start()
      {
        $dc = new DC_Folder("");
        $dc->sync();
      }

    }


    /**
     * Instantiate controller
     */
    $sync = new Synchronisation();
    $sync->start();
    Könnt ihr mir einen Denkanstoß geben, was ich falsch mache

    Vielen Dank
    Robert

  2. #2
    Contao-Fan
    Registriert seit
    09.05.2011.
    Ort
    Hamburg
    Beiträge
    296

    Standard

    Mal abgesehen das mein Ansatz, den ich oben geschrieben habe nicht wirklich Sinn machen kann, wie verarbeitet eigentlich Contao die Synchronisation?
    In der URL für die Synchronisation stecken ja "do=files" und "act=sync". Mit "do=files" wird die Ansicht der Dateiverwaltung geladen und ich finde im Code auch "\Input::get('do') == 'files'" welches das Abfängt und verarbeitet. Aber wo wird "act=sync" abgefangen und verarbeitet? Wenn ich wüsste wo das geschieht könnte ich ja auch sehen wie genau die Dateisynchronisation angestoßen wird.

    Könnt ihr mir sagen an welcher Stelle auf "act=sync" reagiert wird?

    Vielen Dank
    Robert

  3. #3
    Contao-Fan Avatar von Zero
    Registriert seit
    25.05.2010.
    Ort
    Korntal
    Beiträge
    520
    User beschenken
    Wunschliste

    Standard

    Also wenn das von dir oben beschriebene funktioniert hätte, dann hätte Contao aber eine Nette Sicherheitslücke gehabt

    Du musst Contao Admin sein um die Funktion auzuführen.
    Hier mal der Anfang der Funktion aus der DC_Folder.php
    PHP-Code:
        /**
         * Synchronize the file system with the database
         * @return string
         */
        
    public function sync()
        {
            if (!
    $this->blnIsDbAssisted)
            {
                return 
    '';
            }

            
    $this->import('BackendUser''User');

            
    // Stop if a regular user manually triggers the file synchronisation
            
    if (!$this->User->isAdmin)
            {
                return 
    '<p class="tl_error">You have to be an administrator to run the file synchronisation.</p>';
            }
    [...] 
    Ich denke mal, dass es daran liegt. Innerhalb von Contao die Funktion als Admin aufrufen, sollte kein Problem sein. Evtl. muss man noch das DCA laden. Da kenne ich mich dann zu wenig aus
    Mein Blog -> brothers-project.de

  4. #4
    Contao-Fan Avatar von Schlauchbeutelmaschine
    Registriert seit
    16.06.2009.
    Ort
    Wiesbaden
    Beiträge
    668

    Standard

    Für alle die noch auf der Suche nach der Antwort sind, der Befehl um die Synchronisation aus einem Modul zu starten lautet:

    PHP-Code:
    $strLog Dbafs::syncFiles(); 

  5. #5
    Contao-Urgestein Avatar von Kahmoon
    Registriert seit
    22.06.2009.
    Ort
    München
    Beiträge
    4.130

    Standard

    Zitat Zitat von Schlauchbeutelmaschine Beitrag anzeigen
    Für alle die noch auf der Suche nach der Antwort sind, der Befehl um die Synchronisation aus einem Modul zu starten lautet:

    PHP-Code:
    $strLog Dbafs::syncFiles(); 
    Ich muss mich hier mal einklinken.

    Ich habe einen Cronjob der mir auch Ordner im Dateisystem anlegt. Da ich in späteren Schritten per Cron auf die uuid des Ordners zugreifen muss, muss ich auch die neuen Ordner synchronisieren. Was muss ich hier includen damit der Befehl Dbafs::syncFiles(); funktioniert? Sorry..Dummyfrage

    Edit:
    Hat sich erledigt

    VG
    Geändert von Kahmoon (15.12.2014 um 16:52 Uhr)

  6. #6
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.390
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Übrigens, soll das per CronJob gemacht werden, kann es auch einfach mit den Kommandozeilen-Tools von Contao selbst erreicht werden.
    Der entsprechende Befehl sieht so aus:

    Code:
    php absoluter/pfad/zur/contao/installation/system/bin/filesync
    terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.

  7. #7
    Contao-Nutzer Avatar von vienneva
    Registriert seit
    13.01.2011.
    Ort
    Wien
    Beiträge
    80

    Standard

    Zitat Zitat von Toflar Beitrag anzeigen
    Übrigens, soll das per CronJob gemacht werden, kann es auch einfach mit den Kommandozeilen-Tools von Contao selbst erreicht werden.
    Der entsprechende Befehl sieht so aus:

    Code:
    php absoluter/pfad/zur/contao/installation/system/bin/filesync
    Hi Toflar,

    die PHP-Datei system/bin/filesync gibt's erst ab Version 3.3 oder? Wie können wir das für 3.2.19 mit einem Cronjob lösen?
    Gibt's das was Entsprechendes?
    Aktuell haben unsere Redakteure hochauflösende Bilder für den Download. Die sollen ab einer bsteimmten Größe automatisch verkleinert und gegen webtaugliche ausgetauscht werden, wobei die Hochauflösenden für den Download erhalten bleiben. Da wir die verkleinerten Bilder in einen neuen Ordner packen, müsste der Cronjob die Synchronisation anstoßen.

    Liebe Grüße aus Wien
    Eva

  8. #8
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.390
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Ziemlich sicher kannst du einfach das "filesync" bin von der 3.3 oder 3.4 kopieren und es tut auch in der 3.2. Hab's nicht getestet, aber ich denke es müsste gehen.
    terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.

  9. #9
    Contao-Nutzer Avatar von vienneva
    Registriert seit
    13.01.2011.
    Ort
    Wien
    Beiträge
    80

    Standard

    Hi Toflar,

    Danke für die schnelle Antowrt. Wir haben es probiert, aber es tut sich nix. Scheint noch was zu fehlen.
    Brauchen wir noch weitere Dateien?
    Funktioniert das Ganze ohne Backend-Login, oder müssen wir vielleicht noch irgendwelche Zugangsdaten mit übergeben?

    Liebe Grüße
    Eva

  10. #10
    Contao-Nutzer
    Registriert seit
    28.01.2011.
    Ort
    Winterthur, Schweiz
    Beiträge
    168

    Standard

    Zitat Zitat von Toflar Beitrag anzeigen
    Übrigens, soll das per CronJob gemacht werden, kann es auch einfach mit den Kommandozeilen-Tools von Contao selbst erreicht werden.
    Der entsprechende Befehl sieht so aus:

    Code:
    php absoluter/pfad/zur/contao/installation/system/bin/filesync
    Sollte das mit der Extension "cron" gehen?
    Habe den relativen Pfad im Feld "job" so eingetragen:
    system/bin/filesync

    Oder muss ich ein System wie in diesem Thread aufbauen?

    Nick

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    20.559
    User beschenken
    Wunschliste

    Standard

    Der relative Pfad wird nur funktionieren, wenn das Working Directory des Cron Aufrufs in deiner Contao Installation liegt.

  12. #12
    Contao-Nutzer
    Registriert seit
    28.01.2011.
    Ort
    Winterthur, Schweiz
    Beiträge
    168

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Der relative Pfad wird nur funktionieren, wenn das Working Directory des Cron Aufrufs in deiner Contao Installation liegt.

    Nun, ist das etwa nicht der relative Pfad?
    system/bin/filesync

  13. #13
    Contao-Urgestein
    Registriert seit
    22.10.2013.
    Beiträge
    7.884
    User beschenken
    Wunschliste

    Standard

    Das ist der relative Pfad von deinem Installationsverzeichnis aus. Das würde nur funktionieren, wenn das working directory des Cronjobs auch tatsächlich dein Installationsverzeichnis wäre. Das ist aber in der Regel nicht der Fall. Deshalb gib den absoluten Pfad an, wie Toflar bereits geschrieben hat.

  14. #14
    Contao-Nutzer
    Registriert seit
    28.01.2011.
    Ort
    Winterthur, Schweiz
    Beiträge
    168

    Standard

    Nun mein absoluter Pfad (cyon-Server) zur filesync-Datei würde lauten:
    Code:
    https://server46.cyon.ch/~sonjaund/system/bin/filesync
    Nun ergibt das aber quasi eine Verdoppelung der Basis-URL, da '/home/sonjaund/public_html' das Root des Webhosts darstellt:
    Code:
    ... Warning: include(): Failed opening '/home/sonjaund/public_html/https://server46.cyon.ch/~sonjaund/system/bin/filesync' ...
    filesync1.PNG

    Weswegen ich dann wieder den relativen Pfad verwende:
    Code:
    system/bin/filesync
    Beim sofortigen Ausführen des crons führt das aber zu folgender Fehlermeldung:
    Code:
    #!/usr/bin/env php 
    Warning: in_array() expects parameter 2 to be array, null given in system/bin/filesync on line 22
    #0 [internal function]: __error(2, 'in_array() expe...', '/home/sonjaund/...', 22, Array)
    #1 system/bin/filesync(22): in_array('-h', NULL)
    #2 system/modules/cron/public/CronStart.php(169): include('/home/sonjaund/...')
    #3 system/modules/cron/public/CronStart.php(131): CronStart->runJob(Object(Contao\Database\Mysqli\Result))
    #4 system/modules/cron/public/CronStart.php(181): CronStart->run()
    #5 {main}
    
    Fatal error: Cannot redeclare __error() (previously declared in /home/sonjaund/public_html/system/helper/functions.php:21) in /home/sonjaund/public_html/system/helper/functions.php on line 21
    Und hier verstehe ich zu wenig...

    Wichtigste Frage:
    Ist das Aufrufen (ganz allgemein gesprochen) der Datei "filesync" überhaupt korrekt, wenn man die Synchronisation anstossen will?

    Zweite Frage:
    Kann die Extension [cron] die Synchronisation bzw. filesync überhaupt anstossen?

    Lg Nick

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •