使用 PHP,我可以将 foreach 语句放入瞬态中吗?
P粉352408038
P粉352408038 2024-04-03 17:12:43
[PHP讨论组]

我正在使用 PHP 在 WP 中工作,并试图减少获取大量数据的函数的加载时间。我认为瞬态会起作用,并且(如下所示)我在瞬态下加载了课程查询,但是它不适用于 foreach 语句,或者更确切地说,我不知道如何正确设置它让它发挥作用。

导致一切变慢的主要代码是 foreach 语句,它获取每个主题的 Vimeo 视频 id,通过 vimeo_api() 函数运行它,然后获取视频的持续时间,然后将其附加到内部的主题 id一个数组。

从技术上讲,我不必拥有 get_vimeo_duration_all_courses() 函数(它调用所有课程/课程/主题),而只需在加载时从每个主题中获取 Vimeo ID这就是我一开始的方式,它确实有效,但不幸的是它增加了我的页面加载时间。我的想法是,如果我可以加载数组内的所有持续时间并将每个持续时间附加到主题 ID,那么我就不必每次想要获取视频持续时间时都调用 vimeo_api() 函数。我还可以每天更新一次 $vimeo 变量,然后在 $vimeo 变量中搜索主题 ID 来获取 vimeo 持续时间。

所以我想我想知道我是否朝着正确的方向前进,或者您是否知道更好的方法?

有没有一种方法可以存储 $vimeo 变量及其内部的所有值,以便 vimeo_api() 函数不必每次都运行?

任何帮助都会很棒!谢谢

function get_vimeo_duration_all_courses($vimeo)
{
    $courses = get_transient('all_courses'); 
    if (false === $courses) {

        $courses = new WP_Query(array(
            'posts_per_page' => -1,
            'post_type'  => 'sfwd-courses',
            'no_found_rows' => true,
            'cache_results' => true,
            'ignore_sticky_posts'  => true,
            'fields' => 'ids',
        )); //Grabs all the courses

        set_transient('all_courses', $courses, (24 * HOUR_IN_SECONDS));
    }

    $vimeo = get_transient('all_vimeo_durations');
    if (false === $vimeo) {
        $vimeo = array();

        foreach ($courses->posts as $course_id) {
            $lessons = learndash_course_get_lessons($course_id); //Gets all the lessons under the course
            
            foreach ($lessons as $lesson) {
                $topics = learndash_course_get_topics($course_id, $lesson->ID); //Gets all the topics under the lesson
                
                foreach ($topics as $topic) {
                    $vimeoVideo = get_field('lesson_video', $topic->ID); 
                    
                    if (!empty($vimeoVideo)) { //Looks at each topic and determines whether it has a vimeo video or not
                        $vimeoDuration = vimeo_api($vimeoVideo); //If true, it runs the vimeo ID through the vimeo_api() function (THIS IS WHERE IT BECOMES SLOW)
                        $vimeo[$topic->ID] = $vimeoDuration;
                    }
                }

            }

        }

        set_transient('all_vimeo_durations', $vimeo, (24 * HOUR_IN_SECONDS));
    }

   return $vimeo;
}


function show_vimeo_duration($topicID) {
    return $vimeo[$topicID]; //Returns the value of the vimeo_api() function that matches the topicID
}

这里是我获取 Vimeo api 并返回视频时长的地方

function vimeo_api($id)
{
    try {
        $authorization = 'CODELEFTOUTONPURPOSE';
        $ch = curl_init();

        curl_setopt_array($ch, array(
            CURLOPT_URL => "https://api.vimeo.com/videos/$id?fields=duration",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => array(
                "authorization: Bearer {$authorization}",
                "cache-control: no-cache",
            ),
        ));

        $res = curl_exec($ch);
        $obj = json_decode($res, true);
        return $obj['duration'];//Returns the duration of the video
    } catch (Exception $e) {
        return "0";
    }
}

P粉352408038
P粉352408038

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号