0

I want to execute a PHP script automatically every day that make a database backup and sent it to an email. Everything it good when I execute it in my web browser by calling its URL. But when I define a Cron job in my server, I got this error:

sh: /Viana-BackupMailer/mehravar_news_20161204_192302.sql.gz: No such file or directory mysqldump: Got errno 32 on write X-Powered-By: PHP/5.4.45 Content-type: text/html

I use this below command in cron job:

php /home/mehravar/public_html/Viana-BackupMailer.php

and this is my PHP codes:

<?php 
    $TimeZone = "Asia/Tehran";              // Your location time zone
    $SiteName = "Mysite.com";               // Your site name
    $SiteTitle = "My Site Title";           // Your site title
    $DeleteBackup = false;                  // Delete Backup file after send it by email

    $DB_Server = "localhost";               // MySQL server name
    $DB_Name = "DB_Name";                   // MySQL database name
    $DB_Username = "DB_User";               // MySQL database Username
    $DB_Password = "DB_Pass";               // MySQL database Password

    $Mail_To = "[email protected]";         // Receiver email
    $Mail_From = "[email protected]";        // Sender email (Your host email)

    $LogText = "";
    $StorageDir = "Viana-BackupMailer";
    if(!is_dir($_SERVER['DOCUMENT_ROOT']."/".$StorageDir)){
        mkdir($_SERVER['DOCUMENT_ROOT']."/".$StorageDir, 0755);
    }

    date_default_timezone_set($TimeZone);
    $BackupDate = date("Ymd_His");
    $LogDate = date("Ym");
    $Path = $_SERVER["DOCUMENT_ROOT"]."/".$StorageDir."/";
    $LogFile = $Path.$LogDate."_Viana-BackupMailer.log";

    function WriteLog($LogText){
        $Handle = fopen($GLOBALS['LogFile'], (file_exists($GLOBALS['LogFile'])) ? 'a' : 'w');
        fwrite($Handle, "                                   Viana-BackupMailer Log File                                  \n");
        fwrite($Handle, "================================================================================================\n");
        fclose($Handle);
        file_put_contents($GLOBALS['LogFile'], $LogText, FILE_APPEND | LOCK_EX);
    }

    $DB_BackupFile = ($DB_Name == "" ? "all_databases" : $DB_Name)."_$BackupDate.sql.gz";
    $CMD = "mysqldump -u $DB_Username -h $DB_Server --password='$DB_Password' ".($DB_Name == "" ? "--all-databases" : $DB_Name)." | gzip > ".$Path.$DB_BackupFile;
    passthru($CMD);
    $LogText = date("[Y/m/d H:i:s] (").$DB_BackupFile.") Backup file was CREATED.";
    WriteLog($LogText);

    $Mail_Subject = "[$SiteName] Database Backup";
    $Mail_Message = "\nYour database backup detail : \n";
    $Mail_Message .= "----------------------------------------------------------\n";
    $Mail_Message .= "You Site Name : $SiteName\n";
    $Mail_Message .= "Your Site Title : $SiteTitle\n";
    $Mail_Message .= "Your Database Name : ".($DB_Name == "" ? "All Databases" : $DB_Name)."\n";
    $Mail_Message .= "Your Backup File : $DB_BackupFile\n";
    $Mail_Message .= "----------------------------------------------------------\n";
    $Mail_Message .= "Powered by Yousef Rahimy Akhondzadeh\n\n";
    $AttachFile = $Path.$DB_BackupFile;

    $AttachContent = file_get_contents($AttachFile);
    $AttachContent = chunk_split(base64_encode($AttachContent));
    $Separator = md5(time());
    $EOL = "\r\n";

    $MailHeader = "From: $Mail_From".$EOL;
    $MailHeader .= "MIME-Version: 1.0".$EOL;
    $MailHeader .= "Content-Type: multipart/mixed; boundary=\"".$Separator."\"".$EOL;
    $MailHeader .= "Content-Transfer-Encoding: 7bit".$EOL;
    $MailHeader .= "This is a MIME encoded message.".$EOL;

    $MainBody = "--".$Separator.$EOL;
    $MainBody .= "Content-Type: text/plain; charset=\"iso-8859-1\"".$EOL;
    $MainBody .= "Content-Transfer-Encoding: 8bit".$EOL;
    $MainBody .= $Mail_Message.$EOL;
    $MainBody .= "--".$Separator.$EOL;
    $MainBody .= "Content-Type: application/octet-stream; name=\"".$DB_BackupFile."\"".$EOL;
    $MainBody .= "Content-Transfer-Encoding: base64".$EOL;
    $MainBody .= "Content-Disposition: attachment".$EOL;
    $MainBody .= $AttachContent.$EOL;
    $MainBody .= "--".$Separator."--";

    if (mail($Mail_To, $Mail_Subject, $MainBody, $MailHeader)){
        if ($DeleteBackup) {
            unlink($Path.$DB_BackupFile);
            $LogText = date("[Y/m/d H:i:s] (").$DB_BackupFile.") Backup file was REMOVED from disk.\n";
            WriteLog($LogText);
        }
        $LogText = date("[Y/m/d H:i:s] (").$DB_BackupFile.") Backup file was SENT to email.\n";
        WriteLog($LogText);
    } 
    else{
        $LogText = date("[Y/m/d H:i:s]")."Error on sending email.\n";
        WriteLog($LogText);
        $LogText = date("[Y/m/d H:i:s]").error_get_last()."\n";
        WriteLog($LogText);
    }
?>

Please help me. Thanks.

0

1 Answer 1

0

Can you share the code in Viana-BackupMailer? There are probably two reasons why it couldn't be executed (both with permissions):

  1. Access permissions - there are no rights to execute this php file by you/cron owner

  2. User who executes this php file doesn't have rights to access folder /Viana-BackupMailer/ or create there the file / OR to run mysqldump command

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.