Menggunakan PHP, bolehkah saya meletakkan pernyataan foreach menjadi sementara?
P粉352408038
P粉352408038 2024-04-03 17:12:43
0
2
338

Saya bekerja di WP menggunakan PHP dan cuba mengurangkan masa muat fungsi yang mengambil banyak data. Saya fikir transien akan berfungsi, dan (seperti yang ditunjukkan di bawah) saya memuatkan pertanyaan kursus dalam transien, tetapi ia tidak berfungsi dengan pernyataan foreach, atau sebaliknya, saya tidak tahu cara menyediakannya dengan betul untuk menjadikannya berfungsi.

Sekeping kod utama yang memperlahankan segala-galanya ialah pernyataan foreach, yang mendapat id video Vimeo bagi setiap topik, menjalankannya melalui fungsi vimeo_api(), kemudian mendapat tempoh video, dan kemudian menambahkannya pada id topik di dalam tatasusunan.

Secara teknikal saya tidak perlu mempunyai fungsi get_vimeo_duration_all_courses() (Ia memanggil semua kursus/pelajaran/topik) tetapi hanya dapatkan ID Vimeo daripada setiap topik yang dimuatkan Beginilah cara saya bermula dan ia berfungsi, tetapi malangnya ia meningkatkan masa muat halaman saya. Idea saya ialah jika saya boleh memuatkan semua tempoh dalam tatasusunan dan menambahkan setiap tempoh pada ID topik, maka saya tidak perlu memanggil fungsi vimeo_api() setiap kali saya mahu mendapatkan tempoh video. Saya juga boleh mengemas kini pembolehubah $vimeo sekali sehari dan kemudian mencari pembolehubah $vimeo untuk ID topik untuk mendapatkan tempoh vimeo.

Jadi saya rasa saya ingin tahu sama ada saya menuju ke arah yang betul atau jika anda tahu cara yang lebih baik?

Adakah terdapat cara untuk menyimpan pembolehubah $vimeo dan semua nilai di dalamnya supaya fungsi vimeo_api() tidak perlu dijalankan setiap kali?

Sebarang bantuan pasti bagus! Terima kasih

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
}

Di sinilah saya mendapat api Vimeo dan mengembalikan tempoh video

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

membalas semua(2)
P粉757432491

Tiada gunanya menyimpan objek yang dikembalikan oleh WP_Query dalam sementara. Objek ini digunakan untuk mengawal gelung WordPress. Tetapi menggunakan transien seperti all_video_durations memang masuk akal. Transient akan mengekalkan data sebarang tatasusunan atau objek php.

Transien bagus untuk menyimpan nilai yang sukar diperoleh, seperti nilai daripada API perkhidmatan video. Mereka berfungsi pada semua pemasangan WordPress dan berjalan lebih pantas dalam pemasangan dengan caching objek yang berterusan.

Anda mungkin mahu menggunakan transien berasingan untuk setiap projek video daripada menggabungkannya bersama-sama. Ini akan menjadikan kod anda berfungsi sedikit lebih baik jika anda menambah projek baharu.

(Selain itu, jika anda menggunakan kelas Requests terbina dalam WordPress dan bukannya cURL, kod anda akan dijalankan pada pemasangan WordPress pada perkhidmatan pengehosan yang tidak mengendalikan cURL dengan betul. Jika anda menyerahkan kod cURL anda ke repositori pemalam, pengulas Anda akan diminta untuk menggantikannya kadangkala tanya saya bagaimana saya tahu ini :-)

P粉760675452

Terima kasih atas cadangan anda, ia sangat membantu saya bergerak ke arah yang betul. Saya akhirnya mengalih keluar fungsi yang memanggil semua kelas dan membina fail cache yang menjadi tuan rumah semua ID dan tempoh Vimeo. Kemudian apabila saya memanggil fungsi ia mula-mula mencari fail cache dan jika ia menjumpai Vimeo ID ia mendapat tempoh tetapi jika ia tidak menjumpai ID ia menjalankan API.

Ini kod terakhir...

function vimeo_api($vimeoID)
{
    $vimeoCacheUrl = WP_CONTENT_DIR . '/cache/vimeo-duration-cache.txt';
    $newData = '';
    $vimeoData = array();
    $vimeoCache = file($vimeoCacheUrl);
    $vimeoCache = array_unique($vimeoCache);
    file_put_contents($vimeoCacheUrl, implode($vimeoCache), LOCK_EX);
    foreach ($vimeoCache as $key => $value) {
        $data = explode(',', $value, 2);
        $vimeoData[$data[0]] = $data[1];
    }

    if (isset($vimeoData[$vimeoID])) {
        return $vimeoData[$vimeoID];
    } else {
        try {
            $authorization = 'XXXX';
            $ch = curl_init();

            curl_setopt_array($ch, array(
                CURLOPT_URL => "https://api.vimeo.com/videos/$vimeoID?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: cache",
                ),
            ));

            $res = curl_exec($ch);
            $obj = json_decode($res, true);
            $newData = $vimeoID . ',' .$obj['duration'];
            file_put_contents($vimeoCacheUrl, str_replace("'", '', var_export($newData, true)) . PHP_EOL, FILE_APPEND | LOCK_EX);
            return $obj['duration'];
        } catch (Exception $e) {
            return "0";
        } 
    }
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!