代码在cronjob上运行较快,但在do_action或ajax调用中运行较慢。

时间:2021-08-22 作者:Kleiver

我从csv创建了几篇文章,当我使用cronjob执行代码时,操作会持续大约7分钟,但是如果我直接在模板中使用代码,或者调用do\\u action或通过ajax执行代码,则需要30分钟以上,有时甚至无法完成(生成时间限制错误)。

有人知道会发生什么吗?

对于帖子的创建,我使用wp\\u insert\\u post、update\\u post\\u meta和wp\\u set\\u object\\u terms。创建时,创建的帖子总数为6544篇WITHOUT 在失败之前,cronjob通常只创建3000+/-左右

编辑:添加用于创建帖子的代码

add_action(\'import_export_csv\', \'import_export_csv\');
function import_export_csv () {
    try {

        wp_defer_term_counting(true);
        wp_defer_comment_counting(true);

        // Read data from csv
        $homeUrl = home_url();
        $fileUrl = $homeUrl . \'/wp-content/uploads/csv/import_export.csv\';
        $csv = array_map(\'utf8_encode\', file($fileUrl));
        $csv = array_map(\'str_getcsv\', $csv);

        $header = true;

        $i = 0;
        $dataArray = [];
        $fullDataArray = [];

        foreach ($csv as $key => $csvRow) {
            // $csvSplit = explode(";", $csvRow[0]);
            $i = 0;
            $dataArray = [];
            foreach ($csvRow as $value) {
                if ($i == 0) {
                    $dataArray[\'flow\'] = $value;
                }
                if ($i == 1) {
                    $dataArray[\'Reporter\'] = $value;
                }
                if ($i == 2) {
                    $dataArray[\'Product\'] = $value;
                }
                if ($i == 3) {
                    $dataArray[\'HS-Code\'] = $value;
                }
                if ($i == 4) {
                    $dataArray[\'Unit\'] = $value;
                }
                if ($i > 4) {
                    if ($header) {
                        $dataArray[\'data\'] .= "\'" . $value . "\'" . \',\';
                    } else {
                        $resetNumCol = $i - 5;
                        $getYear = explode(\'-\', $columnYearValue[$resetNumCol]);
                        $getYear = str_replace("\'", "", $getYear);

                        $dataArray[\'date\'] = $columnYearValue[$resetNumCol];
                        $dataArray[\'year\'][$getYear[1]][\'data\'] .=  $value . \',\';
                        $dataArray[\'data\'] .= $value . \',\';
                    }
                }
                $i++;
            }
            if ($header) {
                $arrayHeader = $dataArray;
                $header = false;
                $columnYearValue = explode(",", $arrayHeader["data"]);
            } else {
                $arrayValue[] = $dataArray;
            }
            array_push($fullDataArray, $dataArray);
        }

        foreach ($fullDataArray as $productDatas) {
            $productName = $productDatas[\'Product\'];
            $productFlow = $productDatas[\'flow\'];
            $productReporter = $productDatas[\'Reporter\'];
            $productHSCode = $productDatas[\'HS-Code\'];
            $productUnit = $productDatas[\'Unit\'];
            $productYearDatas = $productDatas[\'year\'];
            if ($productYearDatas) {
                foreach ($productYearDatas as $key => $productYear) {
                    $productDate = \'20\' . $key;
                    $uniqueValuePost = $productDatas[\'Reporter\'] . \'-\' . $productName . \'-\' . $productDatas[\'HS-Code\'] . \'-\' . $productDatas[\'flow\'] . \'-20\' . $key;
                    $uniqueValuePost = sanitize_title($uniqueValuePost);
                    $productDataString = rtrim($productYear["data"], \',\');

                    $args = array(
                        \'posts_per_page\'   => 1,
                        \'post_type\' => \'product\',
                        \'post_status\' => array(\'publish\', \'future\'),
                        \'name\' => wp_strip_all_tags($uniqueValuePost),
                    );
                    $product_posts = get_posts($args);
                    $generateDate = new DateTime(\'01/01/\' . $productDate);
                    $generateDateFormat = date_format($generateDate, \'Y-m-d H:i:s\');
                    if ($product_posts == NULL) {
                        $my_post = array(
                            \'post_title\'    => wp_strip_all_tags($uniqueValuePost),
                            \'post_name\'    => wp_strip_all_tags($uniqueValuePost),
                            \'post_date\'      => $generateDateFormat,
                            \'post_content\'  => \'\',
                            \'post_status\'   => \'Publish\',
                            \'post_type\'     => \'product\',
                        );
                        $postId = wp_insert_post($my_post);
                        update_post_meta($postId, \'unique_id\', $uniqueValuePost);
                        update_post_meta($postId, \'year_data\', $productDataString);
                        update_post_meta($postId, \'data_unit\', $productUnit);

                        wp_set_object_terms($postId, $productFlow, \'datatype\', false);
                        wp_set_object_terms($postId, $productReporter, \'country\', false);
                        wp_set_object_terms($postId, $productHSCode, \'hscode\', false);
                        wp_set_object_terms($postId, $productName, \'productname\', false);
                    } else {
                        update_post_meta($product_posts[0]->ID, \'year_data\', $productDataString);
                        update_post_meta($product_posts[0]->ID, \'data_unit\', $productUnit);
                    }
                }
            }
        }

        wp_defer_term_counting(false);
        wp_defer_comment_counting(false);

        echo "The file was uploaded and processed successfully";
    } catch (Exception $e) {
        wp_defer_term_counting(false);
        wp_defer_comment_counting(false);
        echo \'Error: \',  $e->getMessage(), "\\n";
    }
} 

1 个回复
SO网友:vlood

在cPanel运行的托管环境中,您可能有一个用于web应用程序的PHP版本,但另一个用于WP-CLI。

通过运行wp --info. 您可以在WordPress中通过转到健康检查状态页面来检查PHP版本。如果您使用的是早于7.4的版本,它应该警告您。

另一个可能让您速度变慢的原因是挂钩和过滤器的存在,这些挂钩和过滤器与活动用户会话的操作有关,或者是在wp admin中完成的操作。运行WP-CLI命令时,您没有活动的用户会话(is\\u user\\u logged\\u in()返回false),操作不被视为在WP admin中运行(is\\u admin()返回false)。

另一个原因是插件检查WP_CLI 常量可能会将其操作从WP-CLI中排除,从而在您通过web界面进行导入时加重流程负担。

这不是;“终极”;列出了一些原因,但肯定有一些是我在深入分析WP-CLI执行之前要检查的。

相关推荐

当新帖子添加到数据库时,简单的AJAX通知

在任何地方都找不到关于它的信息。所以我想在这里问一下。基本上,我正在寻找一个简单的AJAX代码,它将检查数据库,并在新帖子发布或添加到数据库时发送信号。实时,无需重新加载页面。所谓信号,我的意思是这样的:If the new post was added to the database --do something-- Else --do something else-- 我想做的是在前端用一个小的彩色点通知我的Wordpress用户;主页“