如何防止PHP多次执行代码?
我有一个WordPress插件,带有一个按计划执行的备份脚本。问题是,如果有人连续多次点击页面,它可以多次执行备份脚本。有没有关于如何防止多次处决的想法如何防止PHP多次执行代码?,php,wordpress,Php,Wordpress,我有一个WordPress插件,带有一个按计划执行的备份脚本。问题是,如果有人连续多次点击页面,它可以多次执行备份脚本。有没有关于如何防止多次处决的想法 global $bwpsoptions; if ( get_transient( 'bit51_bwps_backup' ) === false ) { set_transient( 'bit51_bwps_backup', '1', 300 ); if ( $bwpsopt
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
}
}
}
global$bwpsoptions;
if(获取瞬态('bit51\u bwps\u backup')==false){
设置瞬态('bit51'U bwps'U backup','1',300);
如果($bwpsoptions['backup\u enabled']==1){
$nextbackup=$BWPOPTIONS['backup_next']];//获取下一个计划
$lastbackup=$BWPOPTIONS['backup_last']];//获取上次备份
开关($bwpsoptions['backup\u interval']){//在适当的时间安排备份
案例“0”:
$next=60*60*$bwpsoptions[“备份时间”];
打破
案例“1”:
$next=60*60*24*$bwpsoptions[“备份时间”];
打破
案例“2”:
$next=60*60*24*7*$bwpsoptions['backup_time'];
打破
}
if($lastbackup=''| |$nextbackup
将上次备份日期/时间存储在服务器上的某个外部文件或数据库中,并对该值进行检查 - 在代码开头创建一个文件李>
- 代码运行完毕后,删除该文件
- 在代码的开头,确保文件在运行之前不存在
有点像linux中的apt get lock。我假设这个备份东西在某个地方进行备份 因此,请检查最新备份上的元数据,如果它的创建时间在过去还不够长,请不要进行备份
我认为这不是一个cron作业有一个很好的理由?如果您的站点非常繁忙,并且基本的锁定机制不起作用(我个人无法想象,但很好!),您可以从PHP会话的垃圾收集器尝试解决方案 只需在0和10之间随机选择一个数字,如果该数字为0,则进行备份。如果现在有10个用户几乎同时调用备份脚本,统计上只有一个用户实际执行备份
define("BACKUP_PROBABILITY", 10);
if (mt_rand(0, BACKUP_PROBABILITY) == 0)
doBackup();
如果您的站点非常频繁,您可以增加最大值(10)
如果在这10次访问中没有人获得0,那么接下来的10次访问将获得机会
当然,您需要某种类型的锁定机制,并且仍然有可能(尽管无法使用)最终会有一个以上甚至10个备份
我在PHP中发现了这个关于互斥锁(锁)的问题。可能会有帮助:在数据库中设置一个指示时间的字段,并进行计算,以便在上次运行脚本与当前时间之间的差值大于
t
时,不要运行脚本。您在哪里填充$bwpsoptions
?如果它不是来自外部源,如数据库、文件、会话等,那么它将在下一页加载时被遗忘。为什么不将此备份脚本放在单独的页上?当条件满足时,只需调用启动/包含页面@ChrisWiegman说,A是“服务器上或数据库中的外部文件”。如果在D/B中使用batchQ行/表,则不会出现此问题。只需更新备份时间戳行上的时间,其中时间=请求的时间。如果此更新执行的受影响行==1,则此进程将执行备份,否则其他进程将击败它。是的,这不是cron作业,因为太多人无法处理它。我必须在实际的cron作业不可用且wp cron不够灵活的环境中使用此脚本。请求此脚本的速度有多快?