Мне действительно нужна помощь здесь. Я написал этот скрипт для отслеживания трафика моего сайта. я использовал куки-файлы, чтобы помочь серверу узнать, когда клиент посещал страницу один раз уже в течение дня, что позволило мне отслеживать посетителей по двум (2) счетчикам / категориям: УНИКАЛЬНЫЕ хиты и «ОБНОВЛЕННЫЕ» хиты.
Я храню информацию в каталогах, названных по дате. Например, файл, расположенный в www.example.com/counter/unique/2015/12/31/about
будет хранить число как 62, что означает, что я получил 62 уникальных хитов about.php
страница 31 декабря 2015 г.
Каждая страница вызывает скрипт counter.php
, Кажется, все работает нормально, но оба моих счетчика продолжают читать одно и то же число, как будто каждый удар уникален. Я понял, что что-то не так, когда увидел два набора чисел, и подтвердил это, обновив страницу индекса несколько раз. Это означает, что куки не устанавливаются. PHP-скрипт в counter.php
проверяет наличие cookie-файла, чтобы убедиться, что оно установлено. Я также проверял куки в настройках своего браузера, и они не показывают куки. Я обновляю каждую страницу несколько раз и перепроверяю файлы cookie несколько раз, но все равно не повезло!
Что в мире здесь происходит?!? Это работало раньше!
Ниже показано, как каждая страница вызывает counter.php
сценарий:
http://www.example.com/index.php
:
<?php
include_once("log/counter.php");
?>
<!doctype html>
<html>
...
</html>
Ниже мой PHP-код называется counter.php
:
http://www.example.com/log/counter.php
<?php
// THIS LINE WAS NOT PART OF MY ORIGINAL SCRIPT
ob_start();
// THIS IS THE PAGE THAT IS CALLING THIS SCRIPT,
// FOR EXAMPLE: ABOUT, INDEX, CONTACT, ETC.
$page = basename($_SERVER["SCRIPT_FILENAME"], ".php");
// THE DIRECTORY WHERE THIS SCRIPT IS LOCATED
// RELEVANT TO THE CALLING PAGE
$cwd = dirname(__FILE__) . "/counter/";
date_default_timezone_set('America/Chicago');
// TIMEZONE FOR HOUSTON, TEXAS. THIS WAY, ALL
// DATE & TIME INFO IS SET IN THAT TIMEZONE
$currentYear = date("Y"); // EX: 2015
$currentMonth = date("m"); // EX: 12
$currentDay = date("d"); // EX: 31
// THIS PREPARES THE DIRECTORY FOR TODAY'S DATE
$today = $currentMonth."/".$currentDay."/".$currentYear;
$current = $currentYear."/".$currentMonth."/".$currentDay."/";
$currentHour = date("H");
$currentMinute = date("i");
$currentSecond = date("s");
// THE FOLLOWING IS USED FOR THE COOKIE EXPIRATION PARAM
$secondsRemaining = 60 - $currentSecond;
$minutesRemaining = 59 - $currentMinute;
$hoursRemaining = 23 - $currentHour;
$totalSecondsRemaining = ($hoursRemaining * 60 * 60) + ($minutesRemaining * 60) + $secondsRemaining;
if ($totalSecondsRemaining<=0) { $totalSecondsRemaining = 86400; }
// 86400 SECONDS = 24 HOURS / 1 DAY
$ucFile = $cwd . "unique/" . $current . $page; // UNIQUE-HITS COUNTER
$rcFile = $cwd . "refresh/" . $current . $page; // REFRESH-HITS COUNTER
// MAKE SURE ALL DIRECTORIES EXIST
if (!file_exists($cwd."unique/")){
mkdir($cwd."unique", 0755);
}
if (!file_exists($cwd."unique/".$currentYear)){
mkdir($cwd."unique/".$currentYear, 0755);
}
if (!file_exists($cwd."unique/".$currentYear."/".$currentMonth)){
mkdir($cwd."unique/".$currentYear."/".$currentMonth, 0755);
}
if (!file_exists($cwd."unique/".$currentYear."/".$currentMonth."/".$currentDay)){
mkdir($cwd."unique/".$currentYear."/".$currentMonth."/".$currentDay, 0755);
}
if (!file_exists($cwd."refresh/")){
mkdir($cwd."refresh", 0755);
}
if (!file_exists($cwd."refresh/".$currentYear)){
mkdir($cwd."refresh/".$currentYear, 0755);
}
if (!file_exists($cwd."refresh/".$currentYear."/".$currentMonth)){
mkdir($cwd."refresh/".$currentYear."/".$currentMonth, 0755);
}
if (!file_exists($cwd."refresh/".$currentYear."/".$currentMonth."/".$currentDay)){
mkdir($cwd."refresh/".$currentYear."/".$currentMonth."/".$currentDay, 0755);
}
// ALL DIRECTORIES NOW EXIST. SO FAR, NO PROBLEMS!// UNIQUE COUNTER...
if (!isset($_COOKIE[$page])){ // THIS ALWAYS GETS CALLED...
if (file_exists($ucFile)){ // IF PAGE HAS BEEN COUNTED...
$file = fopen($ucFile, "r+"); // 1. OPEN THE COUNTER FILE FOR PAGE
$count = fgets($file); // 2. GET THE CURRENT COUNT
fclose($file); // 3. CLOSE THE FILE
$file = fopen($ucFile, "w"); // 4. RE-OPEN FILE AND CLEAR IT
fputs($file, $count+1); // 5. REPLACE WITH CURRENT COUNT+1
}
if (!file_exists($ucFile)){ // IF THIS IS THE FIRST TIME TODAY...
$file = fopen($ucFile, "w"); // 1. CREATE A COUNTER FOR THIS PAGE
fputs($file, "1"); // 2. PUT 1 AS THE CURRENT COUNT
}
$works = setcookie($page, "Today is ".$today, $totalSecondsRemaining);
// SET A COOKIE INDICATING THAT THIS PAGE HAS BEEN
// VISITED ALREADY BY THIS GUEST.
}// REFRESH COUNTER...
if (file_exists($rcFile)){ // IF PAGE HAS BEEN COUNTED...
$file = fopen($rcFile, "r+"); // (REPEAT STEPS ABOVE, 1-5)
$count = fgets($file);
fclose($file);
$file = fopen($rcFile, "w");
fputs($file, $count+1);
}
if (!file_exists($rcFile)){
$file = fopen($rcFile, "w");
fputs($file, "1");
}
// AGAIN, NOT PART OF THE ORIGINAL SCRIPT.
ob_end_flush();
// ALWAYS RETURNS TRUE...
echo "<!-- $works -->";
?>
Я перепробовал все, что мог придумать, чтобы этот скрипт снова заработал. Насколько я знаю, я никогда ничего не менял в коде; он просто перестал работать однажды.
setcookie()
возвращает истинуwww.example.com
ни просто example.com
изменить поведение скриптаЯ также попробовал следующее:
setcookie($page, "Today is ".$today, $totalSecondsRemaining);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/");
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "");
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "mywebsite.com");
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", ".mywebsite.com");
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "*.mywebsite.com");
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "www.mywebsite.com");
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "mywebsite.com", 0);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", ".mywebsite.com", 0);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "*.mywebsite.com", 0);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "www.mywebsite.com", 0);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "mywebsite.com", false);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", ".mywebsite.com", false);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "*.mywebsite.com", false);
setcookie($page, "Today is ".$today, $totalSecondsRemaining, "/", "www.mywebsite.com", false);
Я изолировал проблему с PHP setcookie()
функция. Любая помощь действительно очень ценится.
Постскриптум
По общему признанию, я уверен, что было бы лучше сохранить эту информацию в Базе данных MySQL, но я буду работать над этим, как только я исправлю эту проблему.
Я знаю, что срок годности печенья установлен в будущем. Я знаю истечение срока
дата НЕ больше, чем целое число максимальный размер PHP максимум целое число PHP
значение около 32 бит, у меня не более 5 символов
Не должно ли время истечения срока действия куки быть числом секунд с начала эпохи? Дата истечения пятизначного числа будет в начале 2 января 1970 года, поэтому я не думаю, что ваша дата истечения срока действия может составлять пять символов или менее, а также в будущем.
http://php.net/manual/en/function.setcookie.php:
Это метка времени Unix, так же как и количество секунд с начала эпохи.
Другими словами, вы, скорее всего, установите это с помощью функции time ().
плюс количество секунд до истечения срока его действия
<?php
setcookie("hiworld", "true", time()+300);
?>
Hi, world!curl -v danf.us/t.php
* Adding handle: conn: 0x7ff05180d000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7ff05180d000) send_pipe: 1, recv_pipe: 0
* About to connect() to danf.us port 80 (#0)
* Trying 66.191.143.117...
* Connected to danf.us (66.191.143.117) port 80 (#0)
> GET /t.php HTTP/1.1
> User-Agent: curl/7.30.0
> Host: danf.us
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.0.10 is not blacklisted
< Server: nginx/1.0.10
< Date: Fri, 02 Jan 2015 22:31:19 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=20
< X-Powered-By: PHP/5.3.13-pl0-gentoo
< Set-Cookie: hiworld=true; expires=Fri, 02-Jan-2015 22:36:19 GMT
<
Hi, world!
* Connection #0 to host danf.us left intact
Других решений пока нет …