mainwp-child/class/class-mainwp-backup.php

721 lines
20 KiB
PHP
Raw Normal View History

2015-10-15 22:52:37 +10:00
<?php
2020-05-05 20:13:38 +07:00
namespace MainWP\Child;
2020-05-14 19:43:10 +07:00
// phpcs:disable WordPress.WP.AlternativeFunctions -- to custom functions.
2015-10-15 22:52:37 +10:00
class MainWP_Backup {
protected static $instance = null;
protected $excludeZip;
protected $zip;
protected $zipArchiveFileCount;
protected $zipArchiveSizeCount;
protected $zipArchiveFileName;
protected $file_descriptors;
protected $loadFilesBeforeZip;
protected $timeout;
protected $lastRun;
/**
* @var Tar_Archiver
*/
protected $archiver = null;
public static function get() {
if ( null === self::$instance ) {
2020-05-07 01:03:56 +07:00
self::$instance = new self();
2015-10-15 22:52:37 +10:00
}
return self::$instance;
}
/**
* Create full backup
*/
2020-05-06 20:22:11 +07:00
public function create_full_backup( $excludes, $filePrefix = '', $addConfig = false, $includeCoreFiles = false, $file_descriptors = 0, $fileSuffix = false, $excludezip = false, $excludenonwp = false, $loadFilesBeforeZip = true, $ext = 'zip', $pid = false, $append = false ) {
2015-10-15 22:52:37 +10:00
$this->file_descriptors = $file_descriptors;
$this->loadFilesBeforeZip = $loadFilesBeforeZip;
2020-05-06 00:47:59 +07:00
$dirs = MainWP_Helper::get_mainwp_dir( 'backup' );
2015-10-15 22:52:37 +10:00
$backupdir = $dirs[0];
if ( ! defined( 'PCLZIP_TEMPORARY_DIR' ) ) {
define( 'PCLZIP_TEMPORARY_DIR', $backupdir );
}
if ( false !== $pid ) {
$pid = trailingslashit( $backupdir ) . 'backup-' . $pid . '.pid';
}
2020-04-15 19:23:05 +02:00
// Verify if another backup is running, if so, return an error.
2015-10-15 22:52:37 +10:00
$files = glob( $backupdir . '*.pid' );
foreach ( $files as $file ) {
2015-12-09 20:32:56 +01:00
if ( basename( $file ) == basename( $pid ) ) {
2015-10-15 22:52:37 +10:00
continue;
}
if ( ( time() - filemtime( $file ) ) < 160 ) {
2016-10-24 20:33:37 +02:00
MainWP_Helper::error( __( 'Another backup process is running. Please, try again later.', 'mainwp-child' ) );
2015-10-15 22:52:37 +10:00
}
}
$timestamp = time();
if ( '' !== $filePrefix ) {
$filePrefix .= '-';
}
2015-12-09 20:32:56 +01:00
if ( 'zip' == $ext ) {
2015-10-15 22:52:37 +10:00
$this->archiver = null;
$ext = '.zip';
} else {
$this->archiver = new Tar_Archiver( $this, $ext, $pid );
2020-05-06 20:22:11 +07:00
$ext = $this->archiver->get_extension();
2015-10-15 22:52:37 +10:00
}
if ( ( false !== $fileSuffix ) && ! empty( $fileSuffix ) ) {
// Append already contains extension!
2020-03-19 14:09:54 +01:00
$file = $fileSuffix . ( true === $append ? '' : $ext );
2015-10-15 22:52:37 +10:00
} else {
$file = 'backup-' . $filePrefix . $timestamp . $ext;
}
$filepath = $backupdir . $file;
$fileurl = $file;
if ( ! $addConfig ) {
if ( ! in_array( str_replace( ABSPATH, '', WP_CONTENT_DIR ), $excludes, true ) && ! in_array( 'wp-admin', $excludes, true ) && ! in_array( WPINC, $excludes, true ) ) {
2015-10-15 22:52:37 +10:00
$addConfig = true;
$includeCoreFiles = true;
}
}
2020-03-19 14:09:54 +01:00
$this->timeout = 20 * 60 * 60;
2015-10-15 22:52:37 +10:00
$mem = '512M';
2020-05-15 01:04:08 +07:00
MainWP_Helper::set_limit( $this->timeout, $mem );
2015-10-15 22:52:37 +10:00
if ( null !== $this->archiver ) {
2020-05-06 20:22:11 +07:00
$success = $this->archiver->create_full_backup( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp, $append );
} elseif ( $this->check_zip_support() ) {
$success = $this->create_zip_full_backup( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp );
} elseif ( $this->check_zip_console() ) {
$success = $this->create_zip_console_full_backup( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp );
2015-10-15 22:52:37 +10:00
} else {
2020-05-06 20:22:11 +07:00
$success = $this->create_zip_pcl_full_backup2( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp );
2015-10-15 22:52:37 +10:00
}
return ( $success ) ? array(
'timestamp' => $timestamp,
'file' => $fileurl,
'filesize' => filesize( $filepath ),
) : false;
}
2020-05-06 20:22:11 +07:00
public function zip_file( $files, $archive ) {
2020-03-19 14:09:54 +01:00
$this->timeout = 20 * 60 * 60;
2015-10-15 22:52:37 +10:00
$mem = '512M';
2020-05-15 01:04:08 +07:00
MainWP_Helper::set_limit( $this->timeout, $mem );
2020-03-26 17:03:00 +00:00
if ( ! is_array( $files ) ) {
2020-03-26 15:29:54 +00:00
$files = array( $files );
2015-12-22 19:18:07 +01:00
}
2015-10-15 22:52:37 +10:00
if ( null !== $this->archiver ) {
2020-05-06 20:22:11 +07:00
$success = $this->archiver->zip_file( $files, $archive );
} elseif ( $this->check_zip_support() ) {
$success = $this->m_zip_file( $files, $archive );
} elseif ( $this->check_zip_console() ) {
$success = $this->m_zip_file_console( $files, $archive );
2015-10-15 22:52:37 +10:00
} else {
2020-05-06 20:22:11 +07:00
$success = $this->m_zip_file_pcl( $files, $archive );
2015-10-15 22:52:37 +10:00
}
return $success;
}
2020-05-06 20:22:11 +07:00
public function m_zip_file( $files, $archive ) {
2020-05-14 19:43:10 +07:00
$this->zip = new \ZipArchive();
2015-10-15 22:52:37 +10:00
$this->zipArchiveFileCount = 0;
$this->zipArchiveSizeCount = 0;
2020-05-14 19:43:10 +07:00
$zipRes = $this->zip->open( $archive, \ZipArchive::CREATE );
2015-10-15 22:52:37 +10:00
if ( $zipRes ) {
2015-12-22 19:18:07 +01:00
foreach ( $files as $file ) {
2020-05-06 20:22:11 +07:00
$this->add_fileToZip( $file, basename( $file ) );
2015-12-22 19:18:07 +01:00
}
2015-10-15 22:52:37 +10:00
return $this->zip->close();
}
return false;
}
2020-05-06 20:22:11 +07:00
public function m_zip_file_console( $files, $archive ) {
2015-10-15 22:52:37 +10:00
return false;
}
2020-05-06 20:22:11 +07:00
public function m_zip_file_pcl( $files, $archive ) {
2020-04-15 19:23:05 +02:00
// Zip this backup folder.
require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
2020-05-14 19:43:10 +07:00
$this->zip = new \PclZip( $archive );
2015-10-15 22:52:37 +10:00
$error = false;
2015-12-22 19:18:07 +01:00
foreach ( $files as $file ) {
2020-04-15 19:23:05 +02:00
$rslt = $this->zip->add( $file, PCLZIP_OPT_REMOVE_PATH, dirname( $file ) );
if ( 0 === $rslt ) {
2015-12-22 19:18:07 +01:00
$error = true;
}
2015-10-15 22:52:37 +10:00
}
2020-03-26 17:03:00 +00:00
return ! $error;
2015-10-15 22:52:37 +10:00
}
/**
* Check for default PHP zip support
*
* @return bool
*/
2020-05-06 20:22:11 +07:00
public function check_zip_support() {
2020-05-14 19:43:10 +07:00
return class_exists( '\ZipArchive' );
2015-10-15 22:52:37 +10:00
}
/**
* Check if we could run zip on console
*
* @return bool
*/
2020-05-06 20:22:11 +07:00
public function check_zip_console() {
2015-10-15 22:52:37 +10:00
return false;
}
/**
* Create full backup using default PHP zip library
*
* @param string $filepath File path to create
*
* @return bool
*/
2020-05-06 20:22:11 +07:00
public function create_zip_full_backup( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp ) {
2015-10-15 22:52:37 +10:00
$this->excludeZip = $excludezip;
2020-05-14 19:43:10 +07:00
$this->zip = new \ZipArchive();
2015-10-15 22:52:37 +10:00
$this->zipArchiveFileCount = 0;
$this->zipArchiveSizeCount = 0;
$this->zipArchiveFileName = $filepath;
2020-05-14 19:43:10 +07:00
$zipRes = $this->zip->open( $filepath, \ZipArchive::CREATE );
2015-10-15 22:52:37 +10:00
if ( $zipRes ) {
$nodes = glob( ABSPATH . '*' );
if ( ! $includeCoreFiles ) {
2020-05-20 01:07:47 +07:00
$this->include_core_files( $nodes );
2015-10-15 22:52:37 +10:00
}
2020-05-06 20:22:11 +07:00
$db_files = $this->create_backup_db( dirname( $filepath ) . DIRECTORY_SEPARATOR . 'dbBackup' );
2015-12-22 19:18:07 +01:00
foreach ( $db_files as $db_file ) {
2020-05-06 20:22:11 +07:00
$this->add_file_to_zipp( $db_file, basename( WP_CONTENT_DIR ) . '/' . basename( $db_file ) );
2015-12-22 19:18:07 +01:00
}
2015-10-15 22:52:37 +10:00
if ( file_exists( ABSPATH . '.htaccess' ) ) {
2020-05-06 20:22:11 +07:00
$this->add_file_to_zipp( ABSPATH . '.htaccess', 'mainwp-htaccess' );
2015-10-15 22:52:37 +10:00
}
foreach ( $nodes as $node ) {
if ( $excludenonwp && is_dir( $node ) ) {
2020-05-06 00:47:59 +07:00
if ( ! MainWP_Helper::starts_with( $node, WP_CONTENT_DIR ) && ! MainWP_Helper::starts_with( $node, ABSPATH . 'wp-admin' ) && ! MainWP_Helper::starts_with( $node, ABSPATH . WPINC ) ) {
2015-10-15 22:52:37 +10:00
continue;
}
}
2020-05-06 00:47:59 +07:00
if ( ! MainWP_Helper::in_excludes( $excludes, str_replace( ABSPATH, '', $node ) ) ) {
2015-10-15 22:52:37 +10:00
if ( is_dir( $node ) ) {
2020-05-06 20:22:11 +07:00
$this->zip_add_dir( $node, $excludes );
2020-03-19 14:09:54 +01:00
} elseif ( is_file( $node ) ) {
2020-05-06 20:22:11 +07:00
$this->add_file_to_zipp( $node, str_replace( ABSPATH, '', $node ) );
2015-10-15 22:52:37 +10:00
}
}
}
if ( $addConfig ) {
2020-05-19 01:15:36 +07:00
$this->add_config();
2015-10-15 22:52:37 +10:00
}
$return = $this->zip->close();
2015-12-22 19:18:07 +01:00
foreach ( $db_files as $db_file ) {
2020-04-23 19:53:22 +02:00
unlink( $db_file );
2015-12-22 19:18:07 +01:00
}
2015-10-15 22:52:37 +10:00
return true;
}
return false;
}
2020-05-20 01:07:47 +07:00
private function include_core_files( &$nodes ) {
2020-05-19 20:08:55 +07:00
return array(
'favicon.ico',
'index.php',
'license.txt',
'readme.html',
'wp-activate.php',
'wp-app.php',
'wp-blog-header.php',
'wp-comments-post.php',
'wp-config.php',
'wp-config-sample.php',
'wp-cron.php',
'wp-links-opml.php',
'wp-load.php',
'wp-login.php',
'wp-mail.php',
'wp-pass.php',
'wp-register.php',
'wp-settings.php',
'wp-signup.php',
'wp-trackback.php',
'xmlrpc.php',
);
2020-05-20 01:07:47 +07:00
foreach ( $nodes as $key => $node ) {
if ( MainWP_Helper::starts_with( $node, ABSPATH . WPINC ) ) {
unset( $nodes[ $key ] );
} elseif ( MainWP_Helper::starts_with( $node, ABSPATH . basename( admin_url( '' ) ) ) ) {
unset( $nodes[ $key ] );
} else {
foreach ( $coreFiles as $coreFile ) {
if ( ABSPATH . $coreFile === $node ) {
unset( $nodes[ $key ] );
}
}
}
}
unset( $coreFiles );
2020-05-19 20:08:55 +07:00
}
public function add_config() {
2020-05-19 01:15:36 +07:00
global $wpdb;
$plugins = array();
$dir = WP_CONTENT_DIR . '/plugins/';
// phpcs:disable
$fh = opendir( $dir );
while ( $entry = readdir( $fh ) ) {
if ( ! is_dir( $dir . $entry ) ) {
continue;
}
if ( ( '.' == $entry ) || ( '..' == $entry ) ) {
continue;
}
$plugins[] = $entry;
}
closedir( $fh );
// phpcs:enable
$themes = array();
$dir = WP_CONTENT_DIR . '/themes/';
// phpcs:disable
$fh = opendir( $dir );
while ( $entry = readdir( $fh ) ) {
if ( ! is_dir( $dir . $entry ) ) {
continue;
}
if ( ( '.' == $entry ) || ( '..' == $entry ) ) {
continue;
}
$themes[] = $entry;
}
closedir( $fh );
// phpcs:enable
if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) {
$string = wp_json_encode(
array(
'siteurl' => get_option( 'siteurl' ),
'home' => get_option( 'home' ),
'abspath' => ABSPATH,
'prefix' => $wpdb->prefix,
'lang' => defined( 'WPLANG' ) ? WPLANG : '',
'plugins' => $plugins,
'themes' => $themes,
)
);
} else {
$string = base64_encode( // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- safe.
serialize( // phpcs:ignore -- safe
array(
'siteurl' => get_option( 'siteurl' ),
'home' => get_option( 'home' ),
'abspath' => ABSPATH,
'prefix' => $wpdb->prefix,
'lang' => defined( 'WPLANG' ) ? WPLANG : '',
'plugins' => $plugins,
'themes' => $themes,
)
)
);
}
$this->add_file_from_string_to_zip( 'clone/config.txt', $string );
}
2020-04-15 19:23:05 +02:00
public function copy_dir( $nodes, $excludes, $backupfolder, $excludenonwp, $root ) {
2015-10-15 22:52:37 +10:00
if ( ! is_array( $nodes ) ) {
return;
}
foreach ( $nodes as $node ) {
if ( $excludenonwp && is_dir( $node ) ) {
2020-05-06 00:47:59 +07:00
if ( ! MainWP_Helper::starts_with( $node, WP_CONTENT_DIR ) && ! MainWP_Helper::starts_with( $node, ABSPATH . 'wp-admin' ) && ! MainWP_Helper::starts_with( $node, ABSPATH . WPINC ) ) {
2015-10-15 22:52:37 +10:00
continue;
}
}
2020-05-06 00:47:59 +07:00
if ( ! MainWP_Helper::in_excludes( $excludes, str_replace( ABSPATH, '', $node ) ) ) {
2015-10-15 22:52:37 +10:00
if ( is_dir( $node ) ) {
if ( ! file_exists( str_replace( ABSPATH, $backupfolder, $node ) ) ) {
2020-04-23 19:53:22 +02:00
mkdir( str_replace( ABSPATH, $backupfolder, $node ) ); // phpcs:ignore
2015-10-15 22:52:37 +10:00
}
$newnodes = glob( $node . DIRECTORY_SEPARATOR . '*' );
$this->copy_dir( $newnodes, $excludes, $backupfolder, $excludenonwp, false );
unset( $newnodes );
2020-03-19 14:09:54 +01:00
} elseif ( is_file( $node ) ) {
2020-05-06 00:47:59 +07:00
if ( $this->excludeZip && MainWP_Helper::ends_with( $node, '.zip' ) ) {
2015-10-15 22:52:37 +10:00
continue;
}
2020-04-23 19:53:22 +02:00
copy( $node, str_replace( ABSPATH, $backupfolder, $node ) ); // phpcs:ignore
2015-10-15 22:52:37 +10:00
}
}
}
}
2020-05-06 20:22:11 +07:00
public function create_zip_pcl_full_backup2( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp ) {
2020-04-15 19:23:05 +02:00
// Create backup folder.
2015-10-15 22:52:37 +10:00
$backupFolder = dirname( $filepath ) . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR;
2020-04-23 19:53:22 +02:00
mkdir( $backupFolder ); // phpcs:ignore
2020-04-15 19:23:05 +02:00
// Create DB backup.
2020-05-06 20:22:11 +07:00
$db_files = $this->create_backup_db( $backupFolder . 'dbBackup' );
2015-10-15 22:52:37 +10:00
2020-04-15 19:23:05 +02:00
// Copy installation to backup folder.
2015-10-15 22:52:37 +10:00
$nodes = glob( ABSPATH . '*' );
if ( ! $includeCoreFiles ) {
$coreFiles = array(
'favicon.ico',
'index.php',
'license.txt',
'readme.html',
'wp-activate.php',
'wp-app.php',
'wp-blog-header.php',
'wp-comments-post.php',
'wp-config.php',
'wp-config-sample.php',
'wp-cron.php',
'wp-links-opml.php',
'wp-load.php',
'wp-login.php',
'wp-mail.php',
'wp-pass.php',
'wp-register.php',
'wp-settings.php',
'wp-signup.php',
'wp-trackback.php',
'xmlrpc.php',
);
foreach ( $nodes as $key => $node ) {
2020-05-06 00:47:59 +07:00
if ( MainWP_Helper::starts_with( $node, ABSPATH . WPINC ) ) {
2015-10-15 22:52:37 +10:00
unset( $nodes[ $key ] );
2020-05-06 00:47:59 +07:00
} elseif ( MainWP_Helper::starts_with( $node, ABSPATH . basename( admin_url( '' ) ) ) ) {
2015-10-15 22:52:37 +10:00
unset( $nodes[ $key ] );
} else {
foreach ( $coreFiles as $coreFile ) {
2015-12-09 20:32:56 +01:00
if ( ABSPATH . $coreFile == $node ) {
2015-10-15 22:52:37 +10:00
unset( $nodes[ $key ] );
}
}
}
}
unset( $coreFiles );
}
$this->copy_dir( $nodes, $excludes, $backupFolder, $excludenonwp, true );
2015-12-22 19:18:07 +01:00
foreach ( $db_files as $db_file ) {
2020-04-23 19:53:22 +02:00
copy( $db_file, $backupFolder . basename( WP_CONTENT_DIR ) . '/' . basename( $db_file ) ); // phpcs:ignore
unlink( $db_file ); // phpcs:ignore
2015-12-22 19:18:07 +01:00
}
2020-04-15 19:23:05 +02:00
2015-10-15 22:52:37 +10:00
unset( $nodes );
2020-04-15 19:23:05 +02:00
// Zip this backup folder.
require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
2020-05-14 19:43:10 +07:00
$this->zip = new \PclZip( $filepath );
2015-10-15 22:52:37 +10:00
$this->zip->create( $backupFolder, PCLZIP_OPT_REMOVE_PATH, $backupFolder );
if ( $addConfig ) {
global $wpdb;
2020-05-13 01:18:02 +07:00
if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) {
2020-05-08 16:44:48 +07:00
$string = wp_json_encode(
2020-05-09 00:55:01 +07:00
array(
'siteurl' => get_option( 'siteurl' ),
'home' => get_option( 'home' ),
'abspath' => ABSPATH,
'prefix' => $wpdb->prefix,
'lang' => WPLANG,
)
);
2020-05-08 16:44:48 +07:00
} else {
$string = base64_encode( // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- safe.
serialize( // phpcs:ignore -- safe
array(
'siteurl' => get_option( 'siteurl' ),
'home' => get_option( 'home' ),
'abspath' => ABSPATH,
'prefix' => $wpdb->prefix,
'lang' => WPLANG,
)
2020-04-15 19:23:05 +02:00
)
2020-05-08 16:44:48 +07:00
);
}
2020-05-06 20:22:11 +07:00
$this->add_file_from_string_to_pcl_zip( 'clone/config.txt', $string, $filepath );
2015-10-15 22:52:37 +10:00
}
2020-04-15 19:23:05 +02:00
// Remove backup folder.
2015-10-15 22:52:37 +10:00
MainWP_Helper::delete_dir( $backupFolder );
return true;
}
/**
* Recursive add directory for default PHP zip library
*/
2020-05-06 20:22:11 +07:00
public function zip_add_dir( $path, $excludes ) {
$this->zip->add_empty_dir( str_replace( ABSPATH, '', $path ) );
2015-10-15 22:52:37 +10:00
if ( file_exists( rtrim( $path, '/' ) . '/.htaccess' ) ) {
2020-05-06 20:22:11 +07:00
$this->add_file_to_zipp( rtrim( $path, '/' ) . '/.htaccess', rtrim( str_replace( ABSPATH, '', $path ), '/' ) . '/mainwp-htaccess' );
2015-10-15 22:52:37 +10:00
}
$iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ), RecursiveIteratorIterator::SELF_FIRST );
foreach ( $iterator as $path ) {
$name = $path->__toString();
if ( ( '.' === basename( $name ) ) || ( '..' === basename( $name ) ) ) {
continue;
}
2020-05-06 00:47:59 +07:00
if ( ! MainWP_Helper::in_excludes( $excludes, str_replace( ABSPATH, '', $name ) ) ) {
2015-10-15 22:52:37 +10:00
if ( $path->isDir() ) {
2020-05-06 20:22:11 +07:00
$this->zip_add_dir( $name, $excludes );
2015-10-15 22:52:37 +10:00
} else {
2020-05-06 20:22:11 +07:00
$this->add_file_to_zipp( $name, str_replace( ABSPATH, '', $name ) );
2015-10-15 22:52:37 +10:00
}
}
$name = null;
unset( $name );
}
$iterator = null;
unset( $iterator );
}
2020-05-06 20:22:11 +07:00
public function pcl_zip_add_dir( $path, $excludes ) {
2015-10-15 22:52:37 +10:00
$error = false;
$nodes = glob( rtrim( $path, '/' ) . '/*' );
if ( empty( $nodes ) ) {
return true;
}
foreach ( $nodes as $node ) {
if ( null === $excludes || ! in_array( str_replace( ABSPATH, '', $node ), $excludes, true ) ) {
2015-10-15 22:52:37 +10:00
if ( is_dir( $node ) ) {
2020-05-06 20:22:11 +07:00
if ( ! $this->pcl_zip_add_dir( $node, $excludes ) ) {
2015-10-15 22:52:37 +10:00
$error = true;
break;
}
2020-03-19 14:09:54 +01:00
} elseif ( is_file( $node ) ) {
2020-04-15 19:23:05 +02:00
$rslt = $this->zip->add( $node, PCLZIP_OPT_REMOVE_PATH, ABSPATH );
if ( 0 === $rslt ) {
2015-10-15 22:52:37 +10:00
$error = true;
break;
}
}
}
}
return ! $error;
}
2020-05-06 20:22:11 +07:00
public function add_file_from_string_to_zip( $file, $string ) {
2015-10-15 22:52:37 +10:00
return $this->zip->addFromString( $file, $string );
}
2020-05-06 20:22:11 +07:00
public function add_file_from_string_to_pcl_zip( $file, $string, $filepath ) {
2015-10-15 22:52:37 +10:00
$file = preg_replace( '/(?:\.|\/)*(.*)/', '$1', $file );
$localpath = dirname( $file );
$tmpfilename = dirname( $filepath ) . '/' . basename( $file );
if ( false !== file_put_contents( $tmpfilename, $string ) ) {
$this->zip->delete( PCLZIP_OPT_BY_NAME, $file );
2020-04-15 19:23:05 +02:00
$add = $this->zip->add(
$tmpfilename,
PCLZIP_OPT_REMOVE_PATH,
dirname( $filepath ),
PCLZIP_OPT_ADD_PATH,
$localpath
2020-03-19 14:09:54 +01:00
);
2015-10-15 22:52:37 +10:00
unlink( $tmpfilename );
if ( ! empty( $add ) ) {
return true;
}
}
return false;
}
protected $gcCnt = 0;
protected $testContent;
2020-05-06 20:22:11 +07:00
public function add_file_to_zipp( $path, $zipEntryName ) {
2015-10-15 22:52:37 +10:00
if ( time() - $this->lastRun > 20 ) {
2020-04-23 19:53:22 +02:00
set_time_limit( $this->timeout ); // phpcs:ignore
2015-10-15 22:52:37 +10:00
$this->lastRun = time();
}
2020-05-06 00:47:59 +07:00
if ( $this->excludeZip && MainWP_Helper::ends_with( $path, '.zip' ) ) {
2015-10-15 22:52:37 +10:00
return false;
}
$this->zipArchiveSizeCount += filesize( $path );
$this->gcCnt ++;
if ( ! $this->loadFilesBeforeZip || ( filesize( $path ) > 5 * 1024 * 1024 ) ) {
$this->zipArchiveFileCount ++;
2020-05-06 20:22:11 +07:00
$added = $this->zip->add_file( $path, $zipEntryName );
2015-10-15 22:52:37 +10:00
} else {
$this->zipArchiveFileCount ++;
$this->testContent = file_get_contents( $path );
2020-04-23 16:42:30 +02:00
if ( false === $this->testContent ) {
2015-10-15 22:52:37 +10:00
return false;
}
$added = $this->zip->addFromString( $zipEntryName, $this->testContent );
}
if ( $this->gcCnt > 20 ) {
if ( function_exists( 'gc_enable' ) ) {
2020-04-23 19:53:22 +02:00
gc_enable();
2015-10-15 22:52:37 +10:00
}
if ( function_exists( 'gc_collect_cycles' ) ) {
2020-04-23 19:53:22 +02:00
gc_collect_cycles();
2015-10-15 22:52:37 +10:00
}
$this->gcCnt = 0;
}
2020-04-15 19:23:05 +02:00
if ( ( ( $this->file_descriptors > 0 ) && ( $this->zipArchiveFileCount > $this->file_descriptors ) ) ) {
2015-10-15 22:52:37 +10:00
$this->zip->close();
$this->zip = null;
unset( $this->zip );
if ( function_exists( 'gc_enable' ) ) {
2020-04-23 19:53:22 +02:00
gc_enable();
2015-10-15 22:52:37 +10:00
}
if ( function_exists( 'gc_collect_cycles' ) ) {
2020-04-23 19:53:22 +02:00
gc_collect_cycles();
2015-10-15 22:52:37 +10:00
}
2020-05-14 19:43:10 +07:00
$this->zip = new \ZipArchive();
2015-10-15 22:52:37 +10:00
$this->zip->open( $this->zipArchiveFileName );
$this->zipArchiveFileCount = 0;
$this->zipArchiveSizeCount = 0;
}
return $added;
}
2020-05-06 20:22:11 +07:00
public function create_zip_console_full_backup( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp ) {
2015-10-15 22:52:37 +10:00
return false;
}
2020-05-06 20:22:11 +07:00
public function create_backup_db( $filepath_prefix, $archiveExt = false, &$archiver = null ) {
2020-03-19 14:09:54 +01:00
$timeout = 20 * 60 * 60;
$mem = '512M';
2020-05-15 01:04:08 +07:00
MainWP_Helper::set_limit( $timeout, $mem );
2015-10-15 22:52:37 +10:00
/** @var $wpdb wpdb */
global $wpdb;
$db_files = array();
2020-05-08 16:44:48 +07:00
$tables_db = $wpdb->get_results( 'SHOW TABLES FROM `' . DB_NAME . '`', ARRAY_N ); // phpcs:ignore -- safe query.
2015-10-15 22:52:37 +10:00
foreach ( $tables_db as $curr_table ) {
if ( null !== $archiver ) {
2020-05-06 20:22:11 +07:00
$archiver->update_pid_file();
2015-10-15 22:52:37 +10:00
}
$table = $curr_table[0];
2015-12-22 19:18:07 +01:00
$currentfile = $filepath_prefix . '-' . MainWP_Helper::sanitize_filename( $table ) . '.sql';
2020-03-26 19:45:07 +00:00
$db_files[] = $currentfile;
2015-12-22 19:18:07 +01:00
if ( file_exists( $currentfile ) ) {
continue;
}
2020-04-15 19:23:05 +02:00
$fh = fopen( $currentfile . '.tmp', 'w' );
2015-12-22 19:18:07 +01:00
2015-10-15 22:52:37 +10:00
fwrite( $fh, "\n\n" . 'DROP TABLE IF EXISTS ' . $table . ';' );
2020-05-08 00:51:43 +07:00
$table_create = $wpdb->get_row( 'SHOW CREATE TABLE ' . $table, ARRAY_N ); // phpcs:ignore -- safe query.
2015-10-15 22:52:37 +10:00
fwrite( $fh, "\n" . $table_create[1] . ";\n\n" );
2020-05-08 00:51:43 +07:00
$rows = MainWP_Child_DB::to_query( 'SELECT * FROM ' . $table, $wpdb->dbh ); // phpcs:ignore -- safe query.
2015-10-15 22:52:37 +10:00
if ( $rows ) {
$i = 0;
$table_insert = 'INSERT INTO `' . $table . '` VALUES (';
// @codingStandardsIgnoreStart
while ( $row = @MainWP_Child_DB::fetch_array( $rows ) ) {
// @codingStandardsIgnoreEnd
$query = $table_insert;
foreach ( $row as $value ) {
2020-04-23 16:42:30 +02:00
if ( null === $value ) {
2018-04-17 20:33:10 +02:00
$query .= 'NULL, ';
} else {
$query .= '"' . MainWP_Child_DB::real_escape_string( $value ) . '", ';
}
2015-10-15 22:52:37 +10:00
}
$query = trim( $query, ', ' ) . ');';
fwrite( $fh, "\n" . $query );
$i ++;
if ( $i >= 50 ) {
fflush( $fh );
$i = 0;
}
$query = null;
$row = null;
}
}
$rows = null;
fflush( $fh );
2015-12-22 19:18:07 +01:00
fclose( $fh );
rename( $currentfile . '.tmp', $currentfile );
2015-10-15 22:52:37 +10:00
}
2015-12-22 19:18:07 +01:00
fclose( fopen( $filepath_prefix . '.sql', 'w' ) );
$db_files[] = $filepath_prefix . '.sql';
2015-10-15 22:52:37 +10:00
2015-12-22 19:18:07 +01:00
$archivefilePath = null;
2015-10-15 22:52:37 +10:00
if ( false !== $archiveExt ) {
2015-12-22 19:18:07 +01:00
$archivefilePath = $filepath_prefix . '.sql.' . $archiveExt;
2015-10-15 22:52:37 +10:00
if ( 'zip' === $archiveExt ) {
$this->archiver = null;
} else {
$this->archiver = new Tar_Archiver( $this, $archiveExt );
}
2020-05-06 20:22:11 +07:00
if ( $this->zip_file( $db_files, $archivefilePath ) && file_exists( $archivefilePath ) ) {
2015-12-22 19:18:07 +01:00
foreach ( $db_files as $db_file ) {
2020-04-23 19:53:22 +02:00
unlink( $db_file );
2015-10-15 22:52:37 +10:00
}
}
2015-10-15 22:52:37 +10:00
}
2015-12-22 19:18:07 +01:00
return ( false !== $archiveExt ? array( 'filepath' => $archivefilePath ) : $db_files );
2015-10-15 22:52:37 +10:00
}
}