【问题标题】:Cannot setup a cron job on Cpanel无法在 Cpanel 上设置 cron 作业
【发布时间】:2018-04-09 04:41:53
【问题描述】:

尝试在 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);
       }

   }
}

编辑:根据答案/cmets,我进行了额外的研究,发现我可以在任何脚本上加载 $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

【问题讨论】:

  • 您确定它根本没有运行吗?您能否检查您的服务器日志以查看 cron 作业是否产生了任何错误?
  • 我添加了一封电子邮件以接收输出并删除了 -quite 模式。我得到一个Status: 500 Internal Server Error。这很奇怪,因为我可以手动运行它
  • 你能发布你的update_products函数吗?
  • @CGriffin 完成。但正如我所说,如果我在表单上的单击事件中添加该函数,它会运行并且我会得到想要的结果

标签: php cron cpanel


【解决方案1】:

恐怕这里对 Web 环境和控制台环境的互操作性存在一些误解。

简而言之,您的函数期望 WordPress 存在。它期望用户已经通过 WordPress 应用程序访问了该函数,并且存在诸如 $wpdb 之类的全局变量(除其他外)。如果您通过管理页面访问此功能,那么这一切都是正确的,并且该功能有效。

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

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

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

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

【讨论】:

  • 你需要得到一些更详细的错误信息。您可以访问实际的错误日志吗?仅 500 错误是不够的信息。
  • 在 Cpanel 上,errors 选项不显示任何相关内容,raw_access 文件仅显示 500 错误而没有额外信息
  • 您可以访问控制台吗?您可以手动运行命令并查看它的输出吗?您可以在函数中删除一些var_dumps 并查看 那些 输出吗?您需要先确定错误是什么,然后才能修复它。
  • 我选择了您的答案作为最佳答案。你帮我找出了问题并最终解决了它。这是一个错误的路径问题。我在这里和那里添加了一些 var_dump 并找到了错误的路径。
  • 很高兴您能找到问题所在!
猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 2012-05-09
  • 2020-04-11
  • 2018-01-02
  • 2015-01-02
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多