Autor Zpráva
w2009
Profil
Zdravím všechny,

nastal mi zajímavý problém. Na webu jsem spustil následující skript pro pravidelné zálohy sql db:

http://stackoverflow.com/questions/15197798/auto-mail-backup-of-mysql-database-using-php

<?php
$db_host="localhost";   //mysql host  
$db_user="*******";  //databse user name
$db_pass="*******";  //database password
$db_name="******";  //database name
$tables="*";   // use * for all tables or use , to seperate table names
$email="*******";     //your email id
///////////////////////////////////////////////////////////////////////////////////////////

/////////don't need to change bellow //////

backup($db_host,$db_user,$db_pass,$db_name,$tables,$email);
function backup($db_host,$db_user,$db_pass,$db_name,$tables = '*',$email)
{

  $con= mysql_connect($db_host,$db_user,$db_pass);
  mysql_select_db($db_name,$con);

  //get all of the tables
  if($tables == '*')
  {
    $tables = array();
    $result = mysql_query('SHOW TABLES');
    while($row = mysql_fetch_row($result))
    {
      $tables[] = $row[0];
    }
  }
  else
  {
    $tables = is_array($tables) ? $tables : explode(',',$tables);
  }

  //cycle through
  foreach($tables as $table)
  {
    $result = mysql_query('SELECT * FROM '.$table);
    $num_fields = mysql_num_fields($result);

    $return.= 'DROP TABLE '.$table.';';
    $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
    $return.= "\n\n".$row2[1].";\n\n";

    for ($i = 0; $i < $num_fields; $i++) 
    {
      while($row = mysql_fetch_row($result))
      {
        $return.= 'INSERT INTO '.$table.' VALUES(';
        for($j=0; $j<$num_fields; $j++) 
        {
          $row[$j] = addslashes($row[$j]);
          $row[$j] = ereg_replace("\n","\\n",$row[$j]);
          if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
          if ($j<($num_fields-1)) { $return.= ','; }
        }
        $return.= ");\n";
      }
    }
    $return.="\n\n\n";
  }

  //save file
  $filename='db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql';
  $handle = fopen($filename,'w+');
  fwrite($handle,$return);
  fclose($handle);
  compress($filename);
  send_mail($filename.".zip",$email);
}

function send_mail($filepath,$email)
{

$from = "Backup <cepheisys.com/mac>";
$subject = "Database backup";
$message="This attachment contains the backup of your database.";
$separator = md5(time());

// carriage return type (we use a PHP end of line constant)
$eol = PHP_EOL;

// attachment name
$filename = "backup.zip";

//$pdfdoc is PDF generated by FPDF
$attachment = chunk_split(base64_encode(file_get_contents($filepath)));

// main header
$headers  = "From: ".$from.$eol;
$headers .= "MIME-Version: 1.0".$eol; 
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"";

// no more headers after this, we start the body! //

$body = "--".$separator.$eol;
$body .= "Content-Transfer-Encoding: 7bit".$eol.$eol;
$body .= "This is a MIME encoded message.".$eol;

// message
$body .= "--".$separator.$eol;
$body .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $message.$eol;

// attachment
$body .= "--".$separator.$eol;
$body .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment".$eol.$eol;
$body .= $attachment.$eol;
$body .= "--".$separator."--";

// send message
if (mail($email, $subject, $body, $headers)) {
    echo "Your backup sent to your email id";
    header("refresh: 1; main.php");
} else {
    echo "Oops mail can not be send";
}
}
function compress($filepath)

     {

         $zip = new ZipArchive();
  $file=$filepath.".zip";
 if($zip->open($file,1?ZIPARCHIVE::OVERWRITE:ZIPARCHIVE::CREATE)===TRUE)
 {
   // Add the files to the .zip file
   $zip->addFile($filepath);

   // Closing the zip file
   $zip->close();
 }
     }   

Skript funguje bezvadně, spouštím-li ho ručně (načtením url skriptu) - na e-mail dorazí zazipovaná záloha. Avšak nechám-li skript spuštět cronem (na pipni.cz), dorazí pouze soubor, který má 0b a žádnou zálohu tudíž neobsahuje... Moje otázky:

1) Nevíte, jak lépe nastavit cron, aby dělal svoji práci pořádně?
2) Nemáte někdo nějaké zkušenosti s nějakým skriptem, který v kombinaci s cronem na pipni.cz funguje?

Mnohokrát Vám děkuji, hezký Boží hod!


P.
aDAm
Profil
co nějaký error log hostingu? mlčí?
w2009
Profil
aDAm, aDAm, aDAm:
Popravdě nevím, jak bych se k němu dostal... Skript se ale provede bez problémů... Jediné co, že neobsahuje tu relevantní přílohu... cronem se provede odesílání, ale někde je chyba buď ve výpisu db nebo v zipování nebo nevím...
Taps
Profil
w2009:
ještě mě napadlo, že jsi pro to odeslání příloho na email mohl vyzkoušet phpmailer. Sice nevím jestli to odstraní tvůj problém, ale za pokus to stojí
juriad
Profil
w2009:
Při spuštění úlohy pomocí cronu se používá jiný php.ini než při PHP běžícím v Apachi. Nejspíš se bude nějaké nastavení lišit.
Buď se podívej do logu(http://manual.pipni.cz/read.php?id=86) nebo kontaktuj podporu.
Zamysli se také nad poznámkou v http://manual.pipni.cz/read.php?id=65.
w2009
Profil
Ahoj všem,

k tomu logu se opakovaně nemůžu dostat... Myslím, že to bude dostupné pro placené programy a nikoliv pro program FREE... (tzn. i ten tip s kontaktováním podpory je bohužel pasé)...

Ta poznámka (Často je potřeba použít i jiné skripty, např. ty co používáte pro přihlášení do DB. Pro tyto "includy" používejte např: (neboť cron neví, kde je zrovna Váš adresář) require_once(dirname(__FILE__).'/neco.php');. )
mi popravdě leží v hlavě... Přihlášení k DB je součástí skriptu. Potřebuju naincludovat ještě nějaký soubor, aby to fungovalo? Já o žádném nevím... Díky za tipy.
aDAm
Profil
Bylo by dobré si ověřit to ukládání souboru, zda je ok a do dobré složky. A taky koukám je tam nějaký zip, takže by to chtělo ověřit zda ext zip je povolena pro cron.
w2009
Profil
Kdyby byla chyba ve skriptu, tak by mi nefungovalo to ruční spouštění... Ale pokud bude mít cron problém s něčím takovým jako .zip, tak to nikdy na pipni free nerozchodím;-)
Davex
Profil
Zkus si upravit 63. řádek na

$filename=dirname(__FILE__).'/db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql';
poustevníček
Profil *
Davex:
Celkem mě to také zajímá protože bych ten script také rád použil.
Tvá rada nepomohlo.
Davex
Profil
poustevníček:
Ten skript neošetřuje žádné chybové stavy, takže chyba může být kdekoliv mezi připojením k databázi a odesláním e-mailu s přílohou.

Po nastavení správných přihlašovacích údajů do databáze a e-mailu odesílatele na řádku č. 74 mi to při spuštění z příkazového řádku (nebo cronem) funguje (PHP 5.5.7 se zapnutými moduly mysql a zip). Do adresáře se skriptem musí být pochopitelně povolen zápis.
poustevnicek
Profil *
To vše samozřejmě vím a mam i správně nastaveno, když přes url to zálohu bez problémů udělá.
poustevníček
Profil *
Zdravím,

takže mohu říct že se to vyřešilo samo, spíše chyba byla v nastavení cronu.
Při nastavení cronu jsem dával nejbližší čas zpracování a to byla podle všeho chyba. Včera jsem nastavil cron na čas vzdalený od nastavení a záloha se v noci udělala.
Takže potvrzuji script je funkční.
Děkuji za tvůj Davex čas.
w2009
Profil
Velmi dobře, Davex! s úpravou na 63. řádku to šlape jako hodinky! Díky za Tvůj čas!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0