代码之家  ›  专栏  ›  技术社区  ›  Tasos

无法在Cpanel上设置cron作业

  •  0
  • Tasos  · 技术社区  · 7 年前

    正在尝试在Cpanel上添加cron作业以每5分钟运行一次。我将其添加到命令输入中(从url中删除了个人详细信息)

    /usr/bin/php -q /home/my_name/public_html/staging/the_web_site/wp-content/themes/my_child_theme/functions.php updateproducts
    

    然后在 functions.php ,我有这个:

    if (!empty($argv[1])) {
        switch ($argv[1]) {
            case "updateproducts":
                update_products(); 
                break;
        }
    }
    

    这个 update_products() 如果我用管理页面上的按钮触发该函数,则该函数会手动运行,不会出现任何错误。但是,无论我在cronjob选项卡上做什么,它都不会运行。

    知道吗?

    function update_products() {
       global $wpdb;
       $groups = get_groups_from_cron_jobs(100);
       foreach ( $groups as $group ) {
           $name = $group->group_name;
           $sql = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}products WHERE name='%s'", $name);
           $products = $wpdb->get_results($sql);
           if ( !empty($products) ){
               $post_id = get_post_id_from_products($products);
               //if there isn't a parent_id then create a new product
               if ( !$post_id && $name != '' ) {
                   $post_id = create_a_new_product($name);
               }
               // make sure that all products will have now a parent_id
               add_parent_id_on_products($name, $post_id);
               insert_product_attributes($post_id, $products);
               insert_product_variations($post_id, $products);
               delete_group_from_cron_jobs($name);
           }
    
       }
    }
    

    编辑:根据答案/评论,我做了额外的研究,发现我可以在任何脚本上加载$wpdb。我所做的是:

    if (!empty($argv[1])) {
        switch ($argv[1]) {
            case "updateproducts":
                $path = $_SERVER['DOCUMENT_ROOT'];
                require( $path . '/staging/the_web_site/wp-load.php' );
                update_products(); 
                break;
        }
    }
    

    然而,我仍然在电子邮件中收到错误:

    Status: 500 Internal Server Error
    X-Powered-By: PHP/5.6.31
    Content-type: text/html; charset=UTF-8
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   CGriffin    7 年前

    恐怕有人误解了web环境和控制台环境的可操作性。

    简而言之,您的函数期望WordPress存在。它期望用户通过WordPress应用程序访问该函数,并且全局变量,例如 $wpdb 存在(除其他外)。如果您通过管理页面访问此功能,那么这都是真的,并且该功能可以工作。

    但是,如果您通过控制台(命令行)访问此功能,这一切都不是真的。WordPress有 存在于该请求的上下文中。 global $wpdb 不存在,因为该函数不是通过WordPress访问的,而是通过直接命令访问的。

    如果希望此函数在命令行上工作,则需要重写它以在该环境中工作。这意味着根本没有特定于WordPress的助手或功能。

    或者,您可以使用 WordPress Crons ,它们不是真正的Cron作业,而是在访问站点时运行(在其定义的时间范围内)。如果你有一个老朋友 必须 每五分钟运行一次,但您不可能每隔几分钟就有一个新的访问者,这些不适合您的需要,但它们是一种选择。

    http://www.wpbeginner.com/plugins/how-to-view-and-control-wordpress-cron-jobs/