Просмотр поста

.
ДоХтор

Всем
Вопрос такой: как достичь разделения в записи в разные файлы одной и той же пользовательской функцией? Иначе говоря, есть одно описание функции, и три её вызова с разными параметрами. При этом, по какой бы из трёх ссылок не кликнуть, запишется только файл из первого вызова.

Сначала я думал, что проблема в использовании сессий, и заменил их на текстовые файлы. Не получив нужного результата, я решил, что может быть проблема в области видимости, и перепилил функцию на класс --- результат всё равно не изменный. Как добиться раздельной записи в файлы?

Функция (+/-)
function showLink($url, $link, $days, $clicks, $dir, $fn) {
    is_dir($dir) ?: mkdir($dir);
    $fname = $dir .'/'. $fn .'.txt';
    
    $time = time();
    //$mTime = $time + 3600 * 24 * $days;
    $mTime = $time + 15; # <---15 сек. для теста
    
    file_exists($fname) ?: file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
    $data = unserialize(file_get_contents($fname));
    
    if (isset($_GET['cnt'])) {
        $data['cnt']++;
        file_put_contents($fname, serialize($data));
        header('Location: '. $url);
        exit;
    }

    if ($data['tm'] < $time) { // Перезапись
        file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
        $data = unserialize(file_get_contents($fname));
    }
    
    return ($data['tm'] >= $time && $data['cnt'] < $clicks ? '<a href="?cnt">'. 
        $link .'</a> ('. ($clicks - $data['cnt']) .')' : '');
}

echo showLink(basename(__FILE__), 'Ссылка 1', 1, 10, 'DIR', '_1') .'<br/>';
Класс (+/-)
class ShowLink
{
    private $url;
    private $link;
    private $days;
    private $clicks;
    private $dir;
    private $fn;
    
    public function __construct($url, $link, $days, $clicks, $dir, $fn) {
        $this->url    = $url;
        $this->link   = $link;
        $this->days   = $days;
        $this->clicks = $clicks;
        $this->dir    = $dir;
        $this->fn     = $fn;
    }
    
    public function getLink() {
        is_dir($this->dir) ?: mkdir($this->dir);
        $fname = $this->dir .'/'. $this->fn .'.txt';
        
        $time = time();
        //$mTime = $time + 3600 * 24 * $this->days;
        $mTime = $time + 15; # <---15 сек. для теста
        
        file_exists($fname) ?: file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
        $data = unserialize(file_get_contents($fname));
        
        if (isset($_GET['cnt'])) {
            $data['cnt']++;
            file_put_contents($fname, serialize($data));
            header('Location: '. $this->url);
            //exit;
        }

        if ($data['tm'] < $time) { // Перезапись
            file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
            $data = unserialize(file_get_contents($fname));
        }
        
        return ($data['tm'] >= $time && $data['cnt'] < $this->clicks ? '<a href="?cnt">'. 
            $this->link .'</a> ('. ($this->clicks - $data['cnt']) .')' : '');
    }
}

$show2Link = new ShowLink(basename(__FILE__), 'Ссылка 2', 1, 10, 'DIR', '_2');
echo $show2Link->getLink() .'<br/>';

$show3Link = new ShowLink(basename(__FILE__), 'Ссылка 3', 1, 10, 'DIR', '_3');
echo $show3Link->getLink() .'<br/>';
Результат (+/-)
/*
    Ссылка 1 (7)
    Ссылка 2 (10)
    Ссылка 2 (10)

    Т.е., записывается только один файл.
*/