1

Тема: Як скоротити функцію php

Всім привіт. Вирішив звернутись за допомогою бо вже вичерпав всі можливості свого мізку :) . Допоможіть вирішити таку задачу!  Виводжу на окремій сторінці курси валют шорткодами (блог на вордпресі). Спочатку використовую функцію для визову через API курсу:

function get_course($curr = 'BTC') {
    $data = file_get_contents(LINK);
     if (!$data) return false;
     $courses = json_decode($data, true);
     $course_curr = false;
     foreach ($courses as $course){        
        if ($course['symbol'] == $curr){           
            $course_curr = $course ['price_usd'];           
            break;            
        }        
       }
       return $course_curr;

, а потім іншими функціями і їх шорткодами виводжу значення:

function kurs_btc(){
   return $course_curr = get_course(BTC);
      echo "$course_curr";
}
add_shortcode('BTC', 'kurs_btc');

function kurs_eth(){
   return $course_curr = get_course(ETH);
      echo "$course_curr";
}
add_shortcode('ETH', 'kurs_eth');

.

Проблема в тому що цих функцій із шорткодами дуже багато, і думаю це тормозить загрузку сторінки! Чи можливо якось написати одну функцію яка б узагальнила(чи як би це сказати, скоротила) все це??

2

Re: Як скоротити функцію php

function kurs_btc(){
   return $course_curr = get_course(BTC);
      echo "$course_curr";
}

echo у вас не працюють, ви бачите?
А BTC в лапках чи це десь проголошена константа?

Подякували: leofun011

3 Востаннє редагувалося koala (03.05.2018 17:29:12)

Re: Як скоротити функцію php

Файл за посиланням LINK дуже великий? Скільки на сторінці таких шорткодів використовується? Бо кожен з них завантажує файл. Створіть окремий асоціативний масив $courses в чомусь більш глобальному, а в функції перевіряйте, чи ще не намагалися файл відкрити, якщо ні - відривайте і пхайте туди з файлу

$json = json_decode($data, true);
for(...) {$course[$json['symbol']]=$json['price_usd'];}

а потім виводьте $course[$curr].

4

Re: Як скоротити функцію php

echo у вас не працюють, ви бачите?
А BTC в лапках чи це десь проголошена константа?

Так дійсно :) , echo не працює, його вже прибрав, дякую.
Ні BTC не константа.

5

Re: Як скоротити функцію php

koala написав:

Файл за посиланням LINK дуже великий? Скільки на сторінці таких шорткодів використовується?.

Ні, LINK - масив 100 елементів в кожному по 15 значень. На сторінці 40 шорткодів.

6

Re: Як скоротити функцію php

Ну то й маєте підвантаження 40*15*100=60000 елементів на кожній сторінці замість того, щоб підвантажити лише 1500. І ще потім лінійний пошук 40 разів серед 100 елементів, а з асоціативним масивом буде лінійна складність (чи логаріфмічна, не знаю, як конкретно в PHP це реалізовано, але логіка каже, що хешами).

7

Re: Як скоротити функцію php

Навіть запропонований варіянт може пришвидшити більше. Для цього глобальний ассоц масив можна зберігати в кеші, а не парсити і складати з кожним оновленням сторінки. Популярним рішенням для php є memcached.

$m = new Memcached();
// config your memcached client here

$data = file_get_contents(LINK);
if ($data) {
   $courses = json_decode($data, true);
   foreach ($courses as $course){      
      /* expire '$course['symbol']' key in 5 minutes == time() + 300 */
      $m->set('$course['symbol']', $course ['price_usd'], time() + 300);    
   }
}

$myBtcCourse = $m->get('BTC')

Залишилося лише оформити в вигляді функцій та заімплементувати оновлення кешу (за 5 хв курс буде видалений з кеша і його треба оновлювати.

http://php.net/manual/en/book.memcached.php
http://php.net/manual/en/memcached.set.php
http://php.net/manual/en/memcached.get.php

Подякували: koala, leofun01, bvn3

8

Re: Як скоротити функцію php

Ну, тоді треба покласти обов'язок скидати кеш на процедуру, що оновлює файл. Чи хай завантажує прямо зі своїх джерел безпосередньо в кеш.

9

Re: Як скоротити функцію php

Але ми, власне, проігнорували безпосереднє питання. Воно звучало "чи можливо якось написати одну функцію?". Так, можна, і найкраще - скористатися атрибутами коротких кодів:
https://codex.wordpress.org/Function_Re … tcode_atts

function currency_course($atts)
{
    $atts = shortcode_atts(
        array(
            'name' => 'BTC',
        ), $atts, 'currency' );
    ...
    //тут робимо що треба, щоб отримати курс
    ...
    return $course[$atts['name']];
}

add_shortcode( 'currency', 'currency_course' );

Тепер короткий код виглядатиме так:

[currency name='BTC']
[currency name='ETH']

І т.д.

Альтернатива - написати функцію, що по назві валюти генерує лямбда-функцію, і в циклі робити короткі коди:
function create_currency_func($name){
   return function(){
       ....
       return $course[$name];
    }
}
і чіпляти їх в циклі:

foreach($currencies as $name)
{
    add_shortcode($name, create_currency_func($name));
}

П.С. Сподіваюся, я лямбди правильно розписав.

Подякували: koks7771

10

Re: Як скоротити функцію php

ДЯКУЮ за швидкі відповіді. В принципі принцип зрозумів. Тепер намагаюсь все це "імплементувати" в свій код. Трохи зелений в PHP тому для мене це  займе часу. Що мені не буде получатись - відпишусь.

Подякували: iovchynnikov1

11

Re: Як скоротити функцію php

Получилось в мене о таке :

function currency_course($atts)
    {
        $atts = shortcode_atts(
            array(
                'name' => 'BTC',
                'name' => 'ETH',
                'name' => 'ETC',

            ), $atts, 'currency' );


    $course_name_all = ['BTC', 'ETH', 'ETC'];
    
    $data = file_get_contents(LINK);
    if (!$data) 
        return false;
    
    $courses = json_decode($data, true);

    foreach ($courses as $course){        
        if (in_array($course['symbol'], $atts)){           
            
            echo '<br><p>'.$course ['price_usd'].'</p>';
            
        }        
    }

            
        return $course[$atts['name']];
    }
     
    add_shortcode( 'currency', 'currency_course' );

Але коли елементів багато то всерівно сторінка грузиться так само довго. Що тут не так?

12

Re: Як скоротити функцію php

0. Ви прочитали за посиланням, що робить shortcode_atts?
1. Ви прочитали все, що написано вище, про відкриття файлу один раз, пошук та кеш?

13

Re: Як скоротити функцію php

Так як я поставив запитання: "чи можливо якось написати одну функцію?" - то з вашою допомогою получилось. Дякую!
Так, все, що написано вище, про відкриття файлу один раз, пошук та кеш читав і щось намагався робити но нажаль моїх знань невистарчило для результату. Можливо підкажете якиїсь 'приклад'?

14

Re: Як скоротити функцію php

Будь ласка, перекажіть своїми словами, що робить функція shortcode_atts.

15 Востаннє редагувалося koks777 (08.05.2018 19:13:53)

Re: Як скоротити функцію php

Те що я зрозумів що з її допомогою можна вивести багато елементів із масиву різними шорткодами. Тобто кожному елементу можна присвоїти свій шорткод.

16

Re: Як скоротити функцію php

Ви неправильно зрозуміли.

17

Re: Як скоротити функцію php

У вас на сервері memcached чи аналоги є?

18

Re: Як скоротити функцію php

так є. (підключив)

19

Re: Як скоротити функцію php

А тепер десь так:

if( нема кешу ){
  прочитати файл і закешувати на 5 хвилин
}
вивести значення з кешу

20

Re: Як скоротити функцію php

до кешу кидати, звісно, всі значення з файлу