前回書いたシェルスクリプトでバックアップでメールを送りたかったので、cakephp側からシェルスクリプトを起動させてメールで送ってやった。
添付にはMysqlのバックアップのみ送り、サイトのソースは重いのでダウンロード形式にした。
0.cakephp側にフォルダを作る
webroot以下に「downloads」フォルダをつくる。
1.シェルスクリプトを書き換え
1部分だけ変更、cakephp側にコピーを置くようにした。
backup.sh
#ソース保存 *public_html以下の特定フォルダだけの場合は後ろのパスを変える。
tar cvfz $TARFILE2 $PROGRAM --exclude downloads
#downloadsというフォルダを除外。cakephpにコピーした時に増えるので。
# ファイルのコピー
cp $TARFILE $PROGRAM/app/webroot/downloads/$PREFIX.tar.gz
cp $TARFILE2 $PROGRAM/app/webroot/downloads/$XREAUSERNAME.tar.gz
chmod 777 $PROGRAM/app/webroot/downloads/$PREFIX.tar.gz
chmod 777 $PROGRAM/app/webroot/downloads/$XREAUSERNAME.tar.gz
ファイル名には複数押した時でも上書きされるように日付は入れない。
html側で日付を入れてあげる。
2.cakephpのコントローラーにcakemailを
cakemailを使えるようにしてあげる。
んで、大事なコマンドはこれ
Controller/UsersController.php
// シェルスクリプト起動
shell_exec("sh ~/backup-mysql/backup.sh");
if(preg_match('/backup/', $_GET['mode'])){
// シェルスクリプト起動
shell_exec("sh ~/backup-mysql/backup.sh");
$email = new CakeEmail('default');
$email->from('example@example.xrea.com');
$email->to('example@gmail.com');
$email->subject(date('Ymd').'_example_データバックアップ');
$body = '日次:'.date('Ymd').' / exampleサーバー(XREA)/ データバックアップが成功しました。';
$body_error = '日次:'.date('Ymd').' / exampleサーバー(XREA)/ データバックアップが失敗しています。';
//ファイルの添付
$route = '/virtual/example/backup-mysql/';
$route2 = $_SERVER['CONTEXT_DOCUMENT_ROOT'].'/example/app/webroot/downloads/';
$sqlfilename = 'mysql.'.date("Ymd").'.tar.gz';
$datafilename = 'source.'.date("Ymd").'.tar.gz';
if(file_exists($route.$sqlfilename) && file_exists($route.$datafilename)){
$email->attachments($route2.'mysql.tar.gz');
//メール送信する
$email->send($body);
$download = array(['mysql.tar.gz', $sqlfilename, 'Mysqlバックアップ'], ['source.tar.gz', $datafilename, 'ソースバックアップ']);
$this->set('success', $download);
}else{
$email->send($body_error);
$this->Flash->error(__('ファイルエラーです。失敗しました。'));
}
}
これでシェルが走る。
添付のやり方は前回ので。
3.後はViewを弄るだけ
View/Users/index.ctp
<div>
<p class="btn"><a href="/example/users?mode=backup" onclick="return confirm('データをバックアップしてメールします。');"><button type="button" class="btn btn-outline-primary">全>データをバックアップする<i class="far fa-envelope"></i></button></a></p>
<?php if(!empty($success)): ?>
<?php foreach($success as $value): ?>
<p class="btn"><a href="/example/downloads/<?php echo $value[0]; ?>" download="<?php echo $value[1]; ?>"><button type="button" class="btn btn-outline-primary"><?php echo $value[2]; ?><i class="far fa-arrow-alt-circle-down"></i></button></a></p>
<?php endforeach; ?>
<?php endif; ?>
</div>