Нужен совет по оптимизации функции

1.32K
.
(\/)____o_O____(\/)

ДоХтор, тут либо в одном файле хранить все, либо передавать имя файла в аргументов в гет

.
# Koenig (25.08.2016 / 23:01)
ДоХтор, тут либо в одном файле хранить все, либо передавать имя файла в аргументов в гет
Тут сейчас 1 ссылка == 1 файл. Но я её ещё не дописал, ещё нужно написать что-то типа сборщика мусора, чтоб не используемые файлы удалялись.

Но вопрос не много не в этом -- это нужно ли объединять эти две функции? Или нет? ))
.
ДоХтор

FlySelf, я вот

это (+/-)
if ($data['tm'] < $time) { // Перезапись
    file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
    $data = unserialize(file_get_contents($fname));
}

заменил на

это (+/-)
if ($data['tm'] < $time) { // Перезапись
    $data['tm'] = $mTime;
    $data['cnt'] = 0;
    file_put_contents($fname, serialize($data));
}
.
аkа ПьяНый Ангел

ДоХтор, Так а смысл? Ты создаешь в 27 строке массив, сохраняешь его в файл и на 28 строке получаешь это же массив,но уже из файла... И про условия перечитай еще раз мой пост, в них можно просто формировать нужный массив, а уже ниже юзать 1 сохранение в файл, и туда же редирект перенести

.
(\/)____o_O____(\/)

ДоХтор, хз

быдлокод (+/-)

<?php

class DocClick {
    
    private $dir = 'data';
    
    private $filename;
    
    private $mtime;
    
    private $clicks = 10;
    
    public function __construct($filename, $args = array()) {
        // def value
        $this->mtime = time() + 60;
        if (!is_dir($this->dir)) {
            mkdir($this->dir, 750, true);
        }
        $this->filename = $filename;
        if (file_exists($this->dir . DIRECTORY_SEPARATOR . $this->filename)) {
            $this->loadData($this->filename);
        } else {
            $this->saveData();
        }
        $this->setArgs($args);
        $this->check();
    }
    
    public function loadData($filename) {
        $data = json_decode(file_get_contents($this->dir . DIRECTORY_SEPARATOR . $filename), true);
        $this->filename = $filename;
        $this->clicks = $data['clicks'];
        $this->mtime = $data['mtime'];
    }
    
    public function saveData() {
        $data = array('clicks' => $this->clicks, 'mtime' => $this->mtime);
        file_put_contents($this->dir . DIRECTORY_SEPARATOR . $this->filename, json_encode($data));
    }
    
    public function setArgs($args) {
        if (isset($args['filename'])) {
            $this->filename = $args['filename'];
        }
        if (isset($args['days'])) {
            $this->mtime = $this->setMtime($args['days']);
        }
        if (isset($args['clicks'])) {
            $this->clicks = $this->setClicks($args['clicks']);
        }
    }
    
    public function setFilename($filename) {
        $this->filename = $filename;
    }
    
    public function setMtime($days) {
        $this->mtime = time() + 3600 * 24 * $days;
    }
    
    public function setClicks($clicks) {
        $this->clicks = $clicks;
    }
   
    public function getLink($linkname) {
        return ($this->mtime >= time() && $this->clicks > 0 ? '<div><a href="?docclick='. $this->filename . '">'. $linkname .'</a> ('. $this->clicks .')</div>' : $linkname . '(' . $this->clicks . ')');
    }
    
    public function check() {
        if (isset($_GET['docclick'])) {
            $this->loadData($_GET['docclick']);
            $this->clicks -= 1;
            $this->saveData();
            header('Location: ' . $_SERVER['HTTP_REFERER']);
            exit;
        }  
    }
}

ob_start();

$obj = new DocClick('test.txt');
$obj->saveData();
$obj2 = new DocClick('test2.txt');
$obj2->saveData();

echo $obj->getLink('test');

echo $obj2->getLink('test2');

.
ДоХтор
# FlySelf (26.08.2016 / 00:19)
ДоХтор, Так а смысл? Ты создаешь в 27 строке массив, сохраняешь его в файл и на 28 строке получаешь это же массив,но уже из файла... И про условия перечитай еще раз мой пост, в них можно просто форми
Смысл чтения из файла был в том, чтобы при запуске функции получать данные не из массива. Потому что массив при запуске кода будет хранить данные, которые были написаны при его объявлении.

На счёт условий - я понял, пойду переписывать логику.
.
(\/)____o_O____(\/)

ДоХтор, ну там косяки еще есть, но смысл думаю понятен

.
# Koenig (26.08.2016 / 00:33)
ДоХтор, ну там косяки еще есть, но смысл думаю понятен
Спасибо за пример, Димон, но я не много не согласен - вроде бы не рекомендуют использовать ооп там, где можно обойтись пользовательской функцией. Да и кода получается больше. В общем, попробую перепилить свой вариант.
.

FlySelf, вот что у меня получилось. Кстати, теперь число кликов обнуляется независимо (а при старом варианте клики обновлялись у всех ссылок, без учёта того, по какой из них был переход первым)

* (+/-)
function showLink($href, $lnkname, $days, $clicks, $dir, $id) {
    $id = (isset($_GET['id']) ? trim(strip_tags($_GET['id'])) : $id);
    $go = (isset($_GET['go']) ? trim(strip_tags($_GET['go'])) : '');
    
    is_dir($dir) ?: mkdir($dir);
    $fname = $dir .'/'. $id .'.txt';

    $time = time();
    $mTime = $time + 45; # <---Строка для теста
//  $mTime = $time + 3600 * 24 * $days;
    
    if (file_exists($fname)) {
        $data = unserialize(file_get_contents($fname));
    } else {
        $data = [
            'tm' => $mTime,
            'cnt' => 0
        ];
    }

    if (!empty($go)) {
        $data['cnt']++;
        file_put_contents($fname, serialize($data));
        header('Location: '. $go);
        exit;
    }

    if ($data['tm'] < $time) { // Перезапись
        $data['tm'] = $mTime;
        $data['cnt'] = 0;
        file_put_contents($fname, serialize($data));
    }
    
    return ($data['tm'] >= $time && $data['cnt'] < $clicks ? '<a href="?id='. $id .
        '&go='. $href .'">'. $lnkname .'</a> ('. ($clicks - $data['cnt']) .')<br/>' : '');
}
Но я так понимаю, что это ещё не всё? Надо добиться только одного вызова file_put_contents($fname, serialize($data)); ?
.
(\/)____o_O____(\/)

ДоХтор, я просто смотрю на количество аргументов и в ужасе

Всего: 47