Всем ![]()
Вопрос такой: как достичь разделения в записи в разные файлы одной и той же пользовательской функцией? Иначе говоря, есть одно описание функции, и три её вызова с разными параметрами. При этом, по какой бы из трёх ссылок не кликнуть, запишется только файл из первого вызова.
Сначала я думал, что проблема в использовании сессий, и заменил их на текстовые файлы. Не получив нужного результата, я решил, что может быть проблема в области видимости, и перепилил функцию на класс --- результат всё равно не изменный. Как добиться раздельной записи в файлы?
Функция (+/-)
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)
Т.е., записывается только один файл.
*/