每30天更新一次文件

时间:2016-02-20 作者:j8d

我正在构建一个插件,它需要一个每月更新的数据库文件。我想写一个函数,每30天自动替换一次旧文件。

这是我到目前为止的情况。我走对了吗?

add_action( \'plugins_loaded\', \'update_some_file\' );

function update_some_file() {

    $remotefile = curl_init(\'http://www.somesite.com/somefile.dat\');
    curl_setopt($remotefile, CURLOPT_NOBODY, true);
    curl_setopt($remotefile, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($remotefile, CURLOPT_FILETIME, true);
    $result = curl_exec($remotefile);

    if ($result === false) {
        die (curl_error($remotefile)); 
    }

    $timestamp_r = curl_getinfo($remotefile, CURLINFO_FILETIME);

    $localfile = \'/path/to/somefile.dat\';

    if ( file_exists( $localfile ) && ( date("Y-m-d H:i:s", $timestamp_r) - date("Y-m-d H:i:s", filemtime($localfile)) >= 30 days ) ) { // obviously need some help here.
        rename(\'/path/to/somefile.dat\', \'/path/to/old_somefile.dat\');
        $newfile = file_get_contents(\'http://www.somesite.com/somefile.dat\');
        file_put_contents(\'/path/to/somefile.dat\', $newfile);
        unlink(\'/path/to/old_somefile.dat\')
    }
}
或者有没有更简单/更好的方法?

更新时间:

我验证了文件操作部分是否正常工作:

add_action( \'plugins_loaded\', \'update_some_file\' );
function update_some_file() {
    $localfile = dirname( __FILE__ ) . \'/includes/localfile.txt\';
    if ( file_exists( $localfile ) ) {
        rename(dirname( __FILE__ ) . \'/includes/localfile.txt\', dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
        $newfile = file_get_contents(\'http://somesite.com/localfile.txt\');
        file_put_contents(dirname( __FILE__ ) . \'/includes/localfile.txt\', $newfile);
        unlink(dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
    }
}
更新时间:

这是最终的工作代码,多亏了菲奇的帮助。(我将时间表设置为5分钟进行测试)

add_filter( \'cron_schedules\', \'lsmicron_add_intervals\'); 
function lsmicron_add_intervals( $schedules ) {
    $schedules[\'fiveminutes\'] = array(
        \'interval\' => 300,
        \'display\' => __(\'5 Minutes\')
    );
    return $schedules;
}

add_action(\'lsmicron_fiveminutes_event\', \'lsmi_geoip_update\');
if ( !wp_next_scheduled( \'lsmicron_fiveminutes_event\' ) ) {
    wp_schedule_event( time(), \'fiveminutes\', \'lsmicron_fiveminutes_event\' );
}

function lsmi_geoip_update() {
    $localfile = dirname( __FILE__ ) . \'/includes/localfile.txt\';
    if ( file_exists( $localfile ) ) {
        rename(dirname( __FILE__ ) . \'/includes/localfile.txt\', dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
        $newfile = file_get_contents(\'http://example.com/localfile.txt\');
        file_put_contents(dirname( __FILE__ ) . \'/includes/localfile.txt\', $newfile);
        unlink(dirname( __FILE__ ) . \'/includes/old/localfile.txt\');
    }
}

1 个回复
最合适的回答,由SO网友:fischi 整理而成

首先,我想您的函数已经可以运行了-我没有调试它,但想为您指出WordPress事件调度的正确方向。

您应该使用wp-cron 为此。它让您可以安排事件,并让它们由WordPress处理。

请记住,这不是一个真正的cronjob,取决于您的站点是否被调用。如果您需要更新文件,无论站点上是否有访问者,请考虑使用真正的cronjob调用wp cron。

首先,您需要每月注册一次(在本例中为30天)。您可以在那里定义任何间隔,无论您需要什么,只需以秒为单位传递间隔即可。

function f711_add_intervals($schedules) {
    $schedules[\'thirtydays\'] = array(
        \'interval\' => ( 30 * 24 * 60 * 60 ), // time in seconds.
        \'display\' => __(\'30 Days\')
    );
    return $schedules;
}
add_filter( \'cron_schedules\', \'f711_add_intervals\'); 
现在,您可以注册一个计划的事件,但只有在检查了尚未注册的事件之后:

// function to register the event
function f711_activation() {

    // check if event is already scheduled
    if ( !wp_next_scheduled( \'f711_thirtydays_event\' ) ) {
        // schedule event with the schedule \'thirtydays\', calling the action hook
        wp_schedule_event( current_time( \'timestamp\', \'thirtydays\', \'f711_thirtydays_event\' );
    }

}

// define the hook, calling your function
add_action(\'f711_thirtydays_event\', \'update_some_file\');
您可以使用wp_get_schedule() 函数,检查是否一切正常。

相关推荐

第三方API-PHP致命错误与http_REQUEST_FAILED/cURL错误28

我们已经将第三方提供的一系列API集成到Divi的子主题中。在函数中。对于该子主题的php,我们创建了一系列函数,用于生成短代码,以从模板各个区域的API返回某些部分的数据。这些函数的代码编写于2019年第三季度。源代码未做任何更改,但截至1月中旬,我们经常(每天几次)出现以下PHP致命错误:PHP Fatal error: Uncaught Error: Cannot use object of type WP_Error as array in /nas/content/live/client/wp-