每小时在后台执行一次函数

时间:2015-01-15 作者:Interactive

我的情况有点奇怪(对我来说)
我的客户有一个在自定义CMS上运行的网站,他想要一个在线网站,从现有数据库加载一些数据
这是一个外部MSSQL数据库,出于安全原因,将创建一个序列化表。因此,我无法从数据库中“读取”。

我联系了托管和维护数据库的公司,他们说他们可以自动创建.csv 每小时为我导出一次,并将其保存在服务器上的某个位置。

所以我对这个很满意,因为这是一个逗号分隔的.csv 文件

我了解到,我可以通过以下方式将其导入我的WP MySQL数据库:

LOAD DATA INFILE \'../tmp/file.csv\'
INTO TABLE $table
FIELDS TERMINATED BY \',\'
ENCLOSED BY \'"\'
LINES TERMINATED BY \'\\n\'
IGNORE 1 ROWS;
到目前为止还不错。但现在我开始头疼了。我想每小时都这样做。所以如果他们的数据库被修改了,我的数据库就会更新。该文件可能会覆盖数据库中的每个表/字段。(我只用于阅读)

我知道我可以创建一个cronjob来实现这一点。我简直不知道该在哪里做这件事。此任务必须每小时运行一次。所以这不在函数中。php文件甚至模板。php文件。

想想看,也许它甚至不应该在WordPress核心/自定义文件中完成。

然而因为我不知道在哪里启动该功能,所以无法更新数据库。

希望有人有(替代)解决方案。

M

3 个回复
SO网友:Brandt Solovij

我设置了类似的东西。使用IIS-查看编写。bat文件,它触发一个php shell脚本来执行您需要完成的任何操作。

一旦bat文件正常工作,请在IIS中设置“计划任务”http://technet.microsoft.com/en-us/library/cc721871.aspx

如果您在linux系统上,那么使用crontabhttps://www.freebsd.org/doc/handbook/configtuning-cron.html

如果您在托管的非vps环境中,那么您需要整理您的站点ISP如何处理这类任务-每个任务都不同,并且取决于合同/设置

SO网友:Interactive

所以我做到了:-)

有一件事我真的不喜欢做,但目前没有其他选择:来自服务器的CronJob

此PHP脚本在单个(无模板)文件中运行:

$xmlData = file_get_contents(get_bloginfo(\'template_directory\').\'/import/external_db.xml\');         
// read XML data string
$xml = simplexml_load_string($xmlData) or die("ERROR: Cannot create SimpleXML object");

 foreach( $xml as $user )
    {       
        $name = $user->firstname;
        $code = $user->code;
        $email = $user->email;
        $jobdescription = $user->jobdescription;
        $salary = $user->salary;        
        $sql = "INSERT INTO xxx_employees (name, code, email, jobdescription, salary) VALUES (\'$name\', \'$code\', \'$email\', \'$jobdescription\', \'$salary\')";
        mysql_query($sql) or die (mysql_error());
        echo \'Success\';
    } 
该脚本所做的唯一事情是从服务器上的某个位置获取XML文件,并将其转储到我在数据库中创建的表中。

这需要每小时运行一次。所以在我的函数中。php:

add_action( \'wp\', \'prefix_setup_schedule\' );
/**
 * On an early action hook, check if the hook is scheduled - if not, schedule it.
 */
function prefix_setup_schedule() {
if ( ! wp_next_scheduled( \'prefix_hourly_event\' ) ) {
    wp_schedule_event( time(), \'hourly\', \'prefix_hourly_event\');
}
}


add_action( \'prefix_hourly_event\', \'prefix_do_this_hourly\' );
/**
 * On the scheduled action hook, run a function.
 */
function prefix_do_this_hourly() {
//wp_mail( \'[email protected]\', \'Auto mail every hour\', \'Automatic scheduled email from WordPress.\');
}
这个所谓的“CronJob”每小时都会在数据库中转储一次(我需要添加一个函数,在输入新数据之前清除数据库)。唯一的问题是,除非有加载页面的请求,否则WordPress不会每小时都这样做。如果没有访客,则不会更新。

为了解决这个问题,我在服务器上创建了一个CronJob,每小时执行一个请求,以便更新数据库。

我希望我能找到一个解决方案来替换服务器上的CronJob。

但就是这样。现在,我需要将XML上载函数执行到functions.php 并确保在使用新数据填充数据库之前刷新数据库。

@Rarst:感谢WP Cron提醒。非常有用。

SO网友:Rarst

WordPress有一个WP-Cron 运行计划任务的机制。它在内部用于更新检查和其他任务,也被插件广泛使用。

赞成/反对的观点大致如下:

服务器配置不依赖或不需要任何内容,因为访问站点会触发服务器配置,因此可能无法可靠地按时启动

结束