21

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

Спроба 1:

function currency_course($atts)
{
    $name_prefix = 'currency_rate_';
    $atts = shortcode_atts(
        array(
            'name' => 'BTC',
        ), $atts, 'currency' );
    $key_name = $name_prefix + $atts['name'];
    $m = new Memcached();
    if(!$m) return false;
    if(!$m->addServer('localhost', 11211)) return false;
    $rate = $m->get($key_name);
    if( !$rate) {
        $data = file_get_contents(LINK);
        if (!$data) return false;
        $courses = json_decode($data, true);
        if(!courses) return false;
        foreach ($courses as $course){        
            if(!$m->set($name_prefix+$course['symbol'], $course['price_usd'],5*60)) return false;
        }
        $rate = $m->get($key_name);
        if(!rate) return false;
    }
 
    return $rate;
}
     
add_shortcode( 'currency', 'currency_course' );

22

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

Щось не то з моїм Memcached. В cpanel включив але не виконується навіть приклад:

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('foo', 100);
var_dump($m->get('foo'));
?>

В .../info.php на фото. Вроді Memcached включений.

Post's attachments

Screenshot-2018-5-10 phpinfo().png 37.84 kb, 149 downloads since 2018-05-10 

23

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

Будь ласка, коли описуєте проблему, описуйте її конструктивно - не "не виконується", а "виводиться FALSE замість 100" тощо. Що саме виводить ваш код?

24

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

"Спроба 1" - немає ніякого результату. А приклад з manual - "bool(false)"

25

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

Тоді додайте у ваш приклад (чи в "спробу 1") трохи логування. На кшталт

function currency_course($atts)
{
    $name_prefix = 'currency_rate_';
    $atts = shortcode_atts(
        array(
            'name' => 'BTC',
        ), $atts, 'currency' );
    $key_name = $name_prefix.$atts['name'];
    $m = new Memcached();
    if(!$m) return "can't create new Memcached";
    if(!$m->addServer('localhost', 11211)) return "can't connect to server";
    $rate = $m->get($key_name);
    if( !$rate) {
        $data = file_get_contents(LINK);
        if (!$data) return "can't open file";
        $courses = json_decode($data, true);
        if(!courses) return "can't read json";
        foreach ($courses as $course){        
            if(!$m->set($name_prefix.$course['symbol'], $course['price_usd'],5*60)) return "can't set ".$name_prefix.$course['symbol'];
        }
        $rate = $m->get($key_name);
        if(!$rate) return "can't get ".$key_name;
    }
    return $rate;
}

26

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

А, до речі, саме Memcached у вас встановлено на сервері чи тільки байндінги в PHP?
https://serverfault.com/questions/67714 … is-running

27

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

Після логування виводиться "can't set currency_rate_BTC ". А чи встановлений чи тільки байдінги  php не знаю - мабуть невстановлений. Шукаю як встановити або перевірити.

28

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

-     if(!$m->set($name_prefix.$course['symbol'], $course['price_usd'],5*60)) return "can't set ".$name_prefix.$course['symbol'];
+     if(!$m->set($name_prefix.$course['symbol'], $course['price_usd'],5*60)) return "can't set ".$name_prefix.$course['symbol']." because of code ".$m->getResultCode();

Код помилки перевірте тут: http://php.net/manual/en/memcached.getresultcode.php
Якби не був встановлений, випадав би при з'єднанні. Можливо, неправильно сконфігурований.