Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止PHP多次执行代码?_Php_Wordpress - Fatal编程技术网

如何防止PHP多次执行代码?

如何防止PHP多次执行代码?,php,wordpress,Php,Wordpress,我有一个WordPress插件,带有一个按计划执行的备份脚本。问题是,如果有人连续多次点击页面,它可以多次执行备份脚本。有没有关于如何防止多次处决的想法 global $bwpsoptions; if ( get_transient( 'bit51_bwps_backup' ) === false ) { set_transient( 'bit51_bwps_backup', '1', 300 ); if ( $bwpsopt

我有一个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

                }

            }

        }
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=''| |$nextbackupprimarysettings,$bwpsoptions);
$this->execute_backup();//执行备份
}
}
}

将上次备份日期/时间存储在服务器上的某个外部文件或数据库中,并对该值进行检查

  • 在代码开头创建一个文件
  • 代码运行完毕后,删除该文件
  • 在代码的开头,确保文件在运行之前不存在

有点像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不够灵活的环境中使用此脚本。请求此脚本的速度有多快?