Ankündigung

Einklappen
Keine Ankündigung bisher.

Cronjob per PHP erstellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Cronjob per PHP erstellen

    Hallo
    Ich versuche grade mit einem Kolegen von mir cronjobs zu erstellen mit PHP
    aller dings haut das nicht so ganz hin.
    Entweder verstehen wir das falsch oder die funktion ist kaputt

    Also der fehler ist einfach er erstellt keine Cronjobs
    Und ja ich gucke bei den Richtigen benutzer nach (www-data)

    Übrigends haben wir ein Root server der auf Debian Wheezy basiert.


    Wir haben das bis jetzt so aufgebaut:

    PHP-Code:
    function timestamp_mysql2german($date) {
            
        
    $stamp['min']    =    sprintf("%02d",
                                 
    substr($date142));
                                                
        
    $stamp['std']    =    sprintf("%02d",
                                 
    substr($date112));
                                 
        
    $stamp['days']    =    sprintf("%02d",
                                 
    substr($date82));
                                                
        
    $stamp['month']    =    sprintf("%02d",
                                 
    substr($date52));
                                 
        
    $stamp['date']    =    sprintf("%02d %02d",
                             
    substr($date82),
                             
    substr($date52));
                                            
        
    $stamp['time']    =    sprintf("%02d %02d",
                             
    substr($date112),
                             
    substr($date142));
        
        return 
    $stamp;
        }
        
    $dateTime    =    timestamp_mysql2german($ende);
        
    $crontab = new Crontab();
        
    //$crontab->add($dateTime['min'].' '.$dateTime['std'].' '.$dateTime['days'].' '.$dateTime['month'].' * /var/www/virtual/tld-domain.de/htdocs/sh/stopserver.sh '.$_POST['port']);
        //$crontab->add(array($dateTime['min'] , $dateTime['std'] , $dateTime['days'] , $dateTime['month'] , "*" , "/var/www/virtual/tld-somian.de/htdocs/sh/stopserver.sh ".$_POST['port'])); 
        
    $sexy = array($dateTime['min'] , $dateTime['std'] , $dateTime['days'] , $dateTime['month'] , "*" "/var/www/virtual/tld-domain.de/htdocs/sh/stopserver.sh ".$_POST['port']);
        
    $crontab->add($sexy);
        
    $crontab->save(); 
    Fehler:
    Code:
    Warning: tempnam(): open_basedir restriction in effect. File(/tmp) is not within the allowed path(s): (/var/www/virtual/tld-domain.de/:/var/www/virtual/tld-domain.de/phptmp/:/usr/share/php/) in /var/www/virtual/tld-domain.de/htdocs/templates/cronjob.php on line 162
    
    Warning: fopen(): Filename cannot be empty in /var/www/virtual/tld-domain.de/htdocs/templates/cronjob.php on line 163
    
    Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/virtual/tld-domain.de/htdocs/templates/cronjob.php on line 165
    
    Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/virtual/tld-domain.de/htdocs/templates/cronjob.php on line 167
    
    Warning: unlink(): open_basedir restriction in effect. File() is not within the allowed path(s): (/var/www/virtual/tld-domain.de/:/var/www/virtual/tld-domain.de/phptmp/:/usr/share/php/) in /var/www/virtual/tld-domain.de/htdocs/templates/cronjob.php on line 169
    Fehler Datei:
    Fehler ist bei der Save Funktion
    PHP-Code:
     <?php
    /**
     * @author Mark Wecke <mark.wecke@googlemail.com>
     */
    class Crontab {
        
    /**
         * Speichert die geparsten Einträge aller eingetragenen Cronjobs des Users
         *
         * @var array
         */
        
    protected $rows = array();

        public function 
    __construct() {
            
    $this->_parse();
        }

        
    /**
         * Liest alle eingetragenen Cronjobs des Users aus und parst sie in ein Array
         */
        
    protected function _parse() {
            
    $rows = array();
            
    exec('crontab -l'$rows);
            
            if(!empty(
    $rows))
            {        
              if(
    substr($rows[0], 010) == 'no crontab') {
                 return;
              }
              foreach(
    $rows AS $row) {
                  
    $this->rows[] = $this->_parseRow($row);
              }
            }
        }  

        
    /**
         * Splittet eine Zeile der Crontab in ein Array auf
         *
         * @param String $row
         * @return Array
         */
        
    protected function _parseRow($row) {
            return 
    preg_split('/\s+/'trim($row), 6);
        }

        
    /**
         * Entfernt alle Whitespaces aus dem Hinzugefügten Cronjob
         * Wird auf alle Felder bis auf das Command Feld angewendet
         *
         * @see Cronjob::add()
         * @param string $cell
         * @return string
         */
        
    protected function _sanitize($cell) {
            return 
    preg_replace('/\s+/'''$cell);
        }

        
    /**
         * Liefert alle Cronjobs als Array
         *
         * @return array
         */
        
    public function getAll() {
            return 
    $this->rows;
        }

        
    /**
         * Findet alle eingetragen Cronjobs die mit den Suchparameters übereinstimmen
         * <dl>
         *  <dt>minute, hoer, dom(day of month), month, dow(day of week), command</dt>
         *  <dd>Sucht in dem entsprechenden Feld, find nur komplette übereinstimmungen</dd>
         *  <dt>commadSW</dt>
         *  <dd>Findet alle Einträge die mit dem übergebenen Wert anfangen</dd>
         *  <dt>commandPM</dt>
         *  <dd>Findet alle Einträge auf die der übergebene RegEx passt(muss mit delimiter übergeben werden)<br />Beispiel:<br />
         *  /# Comment ID1$/ - findet alle Einträge mit dem Kommentar '# Comment ID1' am Ende
         *  </dd>
         * </dl>
         * Beispiel:<br />
         * <pre>
         * $crontab = new Crontab();
         * $crontab->find(array(
         *     'hour' => 12,
         *     'commandSW' => 'php '
         * ));
         * </pre>
         * Findet alle Cronjobs die zwischen 12 und 12:59 aufgerufen werden und des Befehl mit 'php ' startet
         *
         * @param array[optional] $spec
         * @return array
         */
        
    public function find(array $spec=array()) {
            
    $result = array();
            foreach(
    $this->rows AS $i => $row) {
                if((!isset(
    $spec['minute'])  || $spec['minute'] == $row[0])
                && (!isset(
    $spec['hour'])    || $spec['hour'] == $row[1])
                && (!isset(
    $spec['dom'])     || $spec['dom'] == $row[2])
                && (!isset(
    $spec['month'])   || $spec['month'] == $row[3])
                && (!isset(
    $spec['dow'])     || $spec['dow'] == $row[4])
                && (!isset(
    $spec['command']) || $spec['command'] == $row[5])
                && (!isset(
    $spec['commandSW']) || $spec['commandSW'] == substr($row[5], 0strlen($spec['commandSW'])))
                && (!isset(
    $spec['commandPM']) || preg_match($spec['commandPM'], $row[5]))
                ) { 
                    
    $result[$i] = $row;
                }
            }
            return 
    $result;
        }

        
    /**
         * Entfernt alle Cronjobs die mit den Suchparameters übereinstimmen<br />
         * gleiche Suchparameter wie Crontab::find() und zusätzlich 'row' damit kann gezielt eine Zeile gelöscht werden
         *
         * @param array $spec
         * @return int Anzahl der gelöschten Zeilen
         * @see Crontab::find()
         */
        
    public function remove(array $spec) {
            if(isset(
    $spec['row'])) {
                    unset(
    $this->rows[$spec['row']]);
                    return 
    true;
            }
            
    $rows $this->find($spec);
            foreach(
    $rows AS $i => $row) {
                unset(
    $this->rows[$i]);
            }
            return 
    count($rows);
        }

        
    /**
         * Benötigt eine Zeile der Crontab als String oder numerisches Array. <br />
         * Minute, Stunde, Tag im Monat, Monat, Tag der Woche, Befehl
         *
         * @param array|string $row
         * @return boolean
         */
        
    public function add($row) {
            if(
    is_string($row)) {
                
    $row $this->_parseRow($row);
                if(
    count($row) != 6) {
                    return 
    false;
                }
            } else if(
    is_array($row)) {
                if(
    count($row) != 6) {
                    return 
    false;
                }
                
    $command array_pop($row);
                
    $row array_map(array($this'_sanitize'), $row);
                
    $row[] = $command;
            } else {
                return 
    false;
            }
            
    $this->rows[] = $row;
            return 
    true;
        }

        
    /**
         * Speichert alle Cronjobs in die Crontab Datei des Users
         *
         * @return boolean 
         */
        
    public function save() {
            
    $file tempnam(sys_get_temp_dir(), 'PHP_CRONTAB');
            
    $handle fopen($file'w');
            foreach(
    $this->rows AS $row) {
                
    fwrite($handleimplode(' '$row).PHP_EOL);
            }
            
    fclose($handle);
            
    exec("crontab $file");
            
    unlink($file);
            
    $tmp $this->rows;
            
    $this->_parse();
            return (
    $tmp === $this->rows);
        }
    }

    ?>
    MfG
    HoneyKing


  • #2
    ne oder ?
    http://www.php.de/php-fortgeschritte...erstellen.html

    Kommentar


    • #3

      Also ich dachte ihr helft anderen Usern und schreibt nicht sowas

      "ne oder?"


      Was soll das?

      Ich und mein Kolege wollen doch nur hilfe

      Kommentar


      • #4
        Das ne oder soll bedeuten "Lesen bildet":

        Code:
        open_basedir restriction in effect. File(/tmp) is not within the allowed path(s):
        https://translate.google.de
        GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

        Kommentar


        • #5
          Ja wow

          Und wieso kommt der fehler wieso ist der weg nicht zulässig? Das ist ja meine frage. Wieso darf er das nicht? was muss ich noch einstellen

          Kommentar


          • #6
            also mit suchmaschinen habt ihr es nicht so?
            was muss ich noch einstellen.
            was du eimngestellt hast weiss ich ja nicht. nikosch war der, der in die zukunft sehen kann
            und wie hast du die crontag von www-data angeschaut?

            //OT:
            und kommentarlos den selben thread unter ner anderen uid aufzumachen, find ich auch nicht so toll.

            Kommentar


            • #7
              Zitat von HoneyKing Beitrag anzeigen
              Ja wow

              Und wieso kommt der fehler wieso ist der weg nicht zulässig? Das ist ja meine frage. Wieso darf er das nicht? was muss ich noch einstellen

              Naja, mit der Fehlermeldung und etwas Hirn (sorry für den Ausdruck), sowie einer Suchmaschine (Google?) lässt sich die Fehlermeldung locker beheben. Wobei ich evt. eher davon abrate, das einfach so zu beheben...
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar


              • #8
                Also ich habe das ja mit crontab -l -u www-data abgefragt

                und ahm ja das hauptproblem ist ja das er nix einträgt.

                Kommentar

                Lädt...
                X