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

时间:2012-03-18 18:04:09

标签: php wordpress

我有一个带有备份脚本的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

                }

            }

        }

4 个答案:

答案 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工作?