| Autor | Zpráva | ||
|---|---|---|---|
| w2009 Profil |
#1 · Zasláno: 26. 12. 2013, 16:39:38
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 |
#2 · Zasláno: 26. 12. 2013, 20:10:50
co nějaký error log hostingu? mlčí?
|
||
| w2009 Profil |
#3 · Zasláno: 27. 12. 2013, 11:10:05
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 |
#4 · Zasláno: 27. 12. 2013, 15:01:26
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 |
#5 · Zasláno: 27. 12. 2013, 15:17:43
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 |
#6 · Zasláno: 27. 12. 2013, 16:58:57
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 |
#7 · Zasláno: 27. 12. 2013, 17:53:49
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 |
#8 · Zasláno: 27. 12. 2013, 18:06:57
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 |
#9 · Zasláno: 27. 12. 2013, 19:06:17
Zkus si upravit 63. řádek na
$filename=dirname(__FILE__).'/db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql'; |
||
| poustevníček Profil * |
#10 · Zasláno: 27. 12. 2013, 19:33:51
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 * |
#12 · Zasláno: 27. 12. 2013, 22:19:29
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 * |
#13 · Zasláno: 28. 12. 2013, 11:16:01
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 |
#14 · Zasláno: 28. 12. 2013, 12:32:36
Velmi dobře, Davex! s úpravou na 63. řádku to šlape jako hodinky! Díky za Tvůj čas!
|
||
|
Časová prodleva: 12 let
|
|||
0