Skip to content

Commit

Permalink
广告管理,数据备份
Browse files Browse the repository at this point in the history
  • Loading branch information
Fanli2012 committed Nov 10, 2020
1 parent 9fcc353 commit 7efd606
Show file tree
Hide file tree
Showing 24 changed files with 2,456 additions and 16 deletions.
38 changes: 38 additions & 0 deletions app/Common/Helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -429,4 +429,42 @@ public static function filterEmoji($str)

return $str;
}

//判断是移动端访问
public static function is_mobile_access()
{
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
return true;
}
//此条摘自TPM智能切换模板引擎,适合TPM开发
if (isset ($_SERVER['HTTP_CLIENT']) && 'PhoneClient' == $_SERVER['HTTP_CLIENT']) {
return true;
}
//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
if (isset ($_SERVER['HTTP_VIA'])) {
//找不到为flase,否则为true
return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
}
//判断手机发送的客户端标志,兼容性有待提高
if (isset ($_SERVER['HTTP_USER_AGENT'])) {
$clientkeywords = array(
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'
);
//从HTTP_USER_AGENT中查找手机浏览器的关键字
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
return true;
}
}
//协议法,因为有可能不准确,放到最后判断
if (isset ($_SERVER['HTTP_ACCEPT'])) {
// 如果只支持wml并且不支持html那一定是移动设备
// 如果支持wml和html但是wml在html之前则是移动设备
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
return true;
}
}

return false;
}
}
209 changes: 209 additions & 0 deletions app/Common/Utils/Database.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
<?php

namespace App\Common\Utils;

use DB;

//数据导出模型
class Database
{
/**
* 文件指针
* @var resource
*/
private $fp;

/**
* 备份文件信息 part - 卷号,name - 文件名
* @var array
*/
private $file;

/**
* 当前打开文件大小
* @var integer
*/
private $size = 0;

/**
* 备份配置
* @var integer
*/
private $config;

/**
* 数据库备份构造方法
* @param array $file 备份或还原的文件信息
* @param array $config 备份配置信息
* @param string $type 执行类型,export - 备份数据, import - 还原数据
*/
public function __construct($file, $config, $type = 'export')
{
$this->file = $file;
$this->config = $config;
}

/**
* 打开一个卷,用于写入数据
* @param integer $size 写入数据的大小
*/
private function open($size)
{
if ($this->fp) {
$this->size += $size;
if ($this->size > $this->config['part']) {
$this->config['compress'] ? @gzclose($this->fp) : @fclose($this->fp);
$this->fp = null;
$this->file['part']++;
session('backup_file', $this->file);
$this->create();
}
} else {
$backuppath = $this->config['path'];
$filename = "{$backuppath}{$this->file['name']}-{$this->file['part']}.sql";
if ($this->config['compress']) {
$filename = "{$filename}.gz";
$this->fp = @gzopen($filename, "a{$this->config['level']}");
} else {
$this->fp = @fopen($filename, 'a');
}
$this->size = filesize($filename) + $size;
}
}

/**
* 写入初始数据
* @return boolean true - 写入成功,false - 写入失败
*/
public function create()
{
$sql = "-- -----------------------------\n";
$sql .= "-- Think MySQL Data Transfer \n";
$sql .= "-- \n";
$sql .= "-- Host : " . config('database.hostname') . "\n";
$sql .= "-- Port : " . config('database.hostport') . "\n";
$sql .= "-- Database : " . config('database.database') . "\n";
$sql .= "-- \n";
$sql .= "-- Part : #{$this->file['part']}\n";
$sql .= "-- Date : " . date("Y-m-d H:i:s") . "\n";
$sql .= "-- -----------------------------\n\n";
$sql .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
return $this->write($sql);
}

/**
* 写入SQL语句
* @param string $sql 要写入的SQL语句
* @return boolean true - 写入成功,false - 写入失败
*/
private function write($sql)
{
$size = strlen($sql);

//由于压缩原因,无法计算出压缩后的长度,这里假设压缩率为50%,
//一般情况压缩率都会高于50%;
$size = $this->config['compress'] ? $size / 2 : $size;

$this->open($size);
return $this->config['compress'] ? @gzwrite($this->fp, $sql) : @fwrite($this->fp, $sql);
}

/**
* 备份表结构
* @param string $table 表名
* @param integer $start 起始行数
* @return boolean false - 备份失败
*/
public function backup($table, $start)
{
//备份表结构
if (0 == $start) {
$result = Db::query("SHOW CREATE TABLE `{$table}`");
$sql = "\n";
$sql .= "-- -----------------------------\n";
$sql .= "-- Table structure for `{$table}`\n";
$sql .= "-- -----------------------------\n";
$sql .= "DROP TABLE IF EXISTS `{$table}`;\n";
//$sql .= trim($result[0]['Create Table']) . ";\n\n";
$sql .= trim($result[0]['create table']) . ";\n\n";
if (false === $this->write($sql)) {
return false;
}
}

//数据总数
$result = Db::query("SELECT COUNT(*) AS count FROM `{$table}`");
$count = $result['0']['count'];

//备份表数据
if ($count) {
//写入数据注释
if (0 == $start) {
$sql = "-- -----------------------------\n";
$sql .= "-- Records of `{$table}`\n";
$sql .= "-- -----------------------------\n";
$this->write($sql);
}

//备份数据记录
$result = Db::query("SELECT * FROM `{$table}` LIMIT {$start}, 1000");
foreach ($result as $row) {
//$row = array_map('mysql_real_escape_string', $row);
$row = array_map('mysql_escape_string', $row);
$sql = "INSERT INTO `{$table}` VALUES ('" . implode("', '", $row) . "');\n";
if (false === $this->write($sql)) {
return false;
}
}

//还有更多数据
if ($count > $start + 1000) {
return array($start + 1000, $count);
}
}

//备份下一表
return 0;
}

public function import($start)
{
if ($this->config['compress']) {
$gz = gzopen($this->file[1], 'r');
$size = 0;
} else {
$size = filesize($this->file[1]);
$gz = fopen($this->file[1], 'r');
}

$sql = '';
if ($start) {
$this->config['compress'] ? gzseek($gz, $start) : fseek($gz, $start);
}

for ($i = 0; $i < 1000; $i++) {
$sql .= $this->config['compress'] ? gzgets($gz) : fgets($gz);
if (preg_match('/.*;$/', trim($sql))) {
//if(false !== $db->query($sql)){
if (false !== Db::execute($sql)) {
$start += strlen($sql);
} else {
return false;
}
$sql = '';
} elseif ($this->config['compress'] ? gzeof($gz) : feof($gz)) {
return 0;
}
}

return array($start, $size);
}

/**
* 析构方法,用于关闭文件资源
*/
public function __destruct()
{
$this->config['compress'] ? @gzclose($this->fp) : @fclose($this->fp);
}
}
Loading

0 comments on commit 7efd606

Please sign in to comment.