我有一个带有备份脚本的WordPress插件,该脚本按计划执行。问题是,如果有人连续多次点击页面,它可以多次执行备份脚本。关于如何防止多次执行的任何想法?
global $bwpsoptions;
if ( get_transient( 'bit51_bwps_backup' ) === false ) {
set_transient( 'bit51_bwps_backup', '1', 300 );
if ( $bwpsoptions['backup_enabled'] == 1 ) {
$nextbackup = $bwpsoptions['backup_next']; //get next schedule
$lastbackup = $bwpsoptions['backup_last']; //get last backup
switch ( $bwpsoptions['backup_interval'] ) { //schedule backup at appropriate time
case '0':
$next = 60 * 60 * $bwpsoptions['backup_time'];
break;
case '1':
$next = 60 * 60 * 24 * $bwpsoptions['backup_time'];
break;
case '2':
$next = 60 * 60 * 24 * 7 * $bwpsoptions['backup_time'];
break;
}
if ( ( $lastbackup == '' || $nextbackup < time() ) && get_transient( 'bit51_bwps_backup' ) === false ) {
$bwpsoptions['backup_last'] = time();
if ( $lastbackup == '' ) {
$bwpsoptions['backup_next'] = ( time() + $next );
} else {
$bwpsoptions['backup_next'] = ( $lastbackup + $next );
}
update_option( $this->primarysettings, $bwpsoptions );
$this->execute_backup(); //execute backup
}
}
}
答案 0 :(得分:3)
类似于linux中的apt-get锁。
答案 1 :(得分:3)
如果您的网站非常繁忙并且基本锁定机制不起作用(我个人无法想象,但是哦!),您可以尝试PHP会话的垃圾收集器的解决方案。
只需随机选择0到10之间的数字,如果数字为0,请进行备份。如果现在10个用户几乎同时调用您的备份脚本,统计上只有一个用户会实际执行备份。
define("BACKUP_PROBABILITY", 10);
if (mt_rand(0, BACKUP_PROBABILITY) == 0)
doBackup();
如果您的网站频繁出现,您可以增加最大值(10)。
如果在这10次访问中没有得到0,接下来的10位访客将获得他们的机会。
您当然需要某种锁定机制,但仍然可能(尽管不可信)最终会有一个甚至10个备份。
我在PHP中发现了关于互斥锁(锁)的问题。可能会有所帮助:PHP mutual exclusion (mutex)
答案 2 :(得分:1)
将上次备份日期/时间存储在服务器上的某个外部文件中或数据库中,并对该值进行检查!
答案 3 :(得分:0)
我认为这个备份可以在某个地方进行备份。
因此,请检查最新备份的元数据,如果过去的创建时间不够,请不要进行备份。
我认为这是一个很好的理由,为什么这不是一个cron工作?