Функция setcookie () в PHP не работает. В чем дело?

Мне действительно нужна помощь здесь. Я написал этот скрипт для отслеживания трафика моего сайта. я использовал куки-файлы, чтобы помочь серверу узнать, когда клиент посещал страницу один раз уже в течение дня, что позволило мне отслеживать посетителей по двум (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 -->";
?>

Я перепробовал все, что мог придумать, чтобы этот скрипт снова заработал. Насколько я знаю, я никогда ничего не менял в коде; он просто перестал работать однажды.

Итак, что я уже проверил:

  • Я знаю, что есть НЕТ вывод перед отправкой заголовков.
  • Я знаю, что PHP думает, что cookie устанавливается, потому что setcookie() возвращает истину
  • Я знаю, что срок годности печенья установлен в будущем.
  • Я знаю, что срок годности НЕ больше, чем целочисленный максимальный размер PHP
    • Максимальное значение PHP Integer составляет около 32 бит, мой не более 5 символов
  • Я знаю что ни 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, но я буду работать над этим, как только я исправлю эту проблему.

2

Решение

Я знаю, что срок годности печенья установлен в будущем. Я знаю истечение срока
дата НЕ больше, чем целое число максимальный размер 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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]