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: 11 let
|
0