Как сделать простой счетчик посетителей PHP для моего сайта

Во-первых, это должно быть очень легко для любого человека со знанием php. Я пытаюсь подсчитать количество посещений и отобразить число в виде изображения, изображения имеют имя «0.png» - «9.png», оно выбирает его на основе подсчета и должно добавить его в canvas.png который представляет собой изображение размером 296x76, служащее фоном для png, где размер 56x76. счетчик работает, но изображения не отображаются

здесь список ошибок, за которым следует странный текст

libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG

//html

<div>
<p> <center> Number of visitors:</center> </p>
<center><img alt = "Visitor counter" src = "counter.php" /></center>
</div>

//counter.php

<?php
session_start();
$counter_name = "counter.txt";

// Check if a text file exists.
//If not create one and initialize it to zero.
if (!file_exists($counter_name)) {
    $f = fopen($counter_name, "w");
    fwrite($f,"0");
    fclose($f);
}
// Read the current value of our counter file
$f = fopen($counter_name,"r");
$counterVal = fread($f, filesize($counter_name));
fclose($f);

// Has visitor been counted in this session?
// If not, increase counter value by one
if (!isset($_SESSION['hasVisited'])){
    $_SESSION['hasVisited'] = "yes";
    $counterVal++;
    $f = fopen($counter_name, "w");
    fwrite($f, $counterVal);
    fclose($f);
}

$counterVal = str_pad($counterVal, 5, "0", STR_PAD_LEFT);
$chars = preg_split('//', $counterVal);
$im = imagecreatefrompng("canvas.png");

$src1 = imagecreatefrompng ("digits/$chars[1].png");
$src2 = imagecreatefrompng ("digits/$chars[2].png");
$src3 = imagecreatefrompng ("digits/$chars[3].png");
$src4 = imagecreatefrompng ("digits/$chars[4].png");
$src5 = imagecreatefrompng ("digits/$chars[5].png");

imagecopymerge($im, $src1, 0, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src2, 60, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src3, 120, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src4, 180, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src5, 240, 0, 0, 0, 56, 76, 100);

// Output and free from memory
header('Content-Type: image/png');
echo imagepng($im);
imagedestroy($im);
?>

Предполагается, что он дает изображение счетчика и показывает его в моем index.html, но все, что я вижу, это "?" где должно быть изображение

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
317
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

У вас есть серьезные проблемы с эффективностью, но давайте начнем с основ.

В первую очередь эта строка: эхо-изображениеpng($im);

Убери эхо. Если вы не передадите имя файла в imagepng(), функция выведет данные изображения. Однако ваше эхо отображает значение RETURN этой функции, которая является логическим значением. Таким образом, эхо фактически добавит данные, которые искажают остальные данные изображения.

Далее, ваши предупреждения в градациях серого связаны с тем, что canvas.png является изображением в градациях серого. Вам нужно открыть его и повторно сохранить как изображение в истинном цвете, чтобы при копировании других изображений их цвета существовали в палитре canvas.png.

В-третьих, использование текстового файла для данных счетчика — плохая идея. В любой момент, если у вас есть два одновременных посетителя, вы получите неверные данные. База данных предотвратит это.

В-четвертых, использование отдельных файлов изображений для каждой цифры неэффективно. Я предполагаю, что вы используете стилизованные цифры, поэтому вы не можете просто написать текст (если у вас нет оригинального шрифта). При таком предположении вы должны располагать все цифры рядом на одном изображении, а затем копировать цифры по мере необходимости.

В качестве альтернативы, если вы хотите использовать отдельные изображения цифр, используйте PHP, чтобы просто сгенерировать HTML для отдельных тегов img рядом друг с другом. Это было бы намного эффективнее, чем генерировать новое изображение на лету с помощью GD.

В-пятых, у вас есть $counterVal, который является строкой. Вы можете получить доступ к отдельным символам в $counterVal, как в массиве:

$counterVal[0] - это первый символ/цифра и т. д. Вам вообще не нужна preg_split().

Наконец, я всегда рекомендую людям вообще не использовать счетчики посещений. Нет никакой выгоды. Это никогда не бывает точным, и если число низкое, то вы только показываете остальному миру, что страница не популярна. Если число велико, то другим посетителям все равно на самом деле все равно, и вы только что потратили много ресурсов своего веб-сервера на тысячи или миллионы дополнительных выполнений PHP для генерации этих данных.

Если вас интересует трафик на страницу, наиболее точным механизмом является анализ журналов вашего веб-сервера. Он расскажет вам о количестве посещений на странице и НАМНОГО больше.

echo imagepng не нужен, так как функция изображениеpng по умолчанию отправляет вывод в браузер. См. документацию для изображениеpng.

Насколько я понимаю, вам нужно $counterVal для хранения 5 цифр. Функция str_pad не создаст строку с фиксированным количеством символов. Он просто добавляет заданное количество символов слева или справа от входной строки. См. документацию для str_pad. Чтобы гарантировать, что $counterVal имеет 5 цифр, можно использовать следующий код:

$len          = strlen($counterVal);
$zero_count   = (5 - $len);
$zero_padding = str_repeat("0", $zero_count);
$counterVal   = $zero_padding . $counterVal;

Сообщение об ошибке, которое вы опубликовали, предполагает, что изображение холст.png представляет собой изображение в градациях серого, но цифровые изображения имеют формат RGB.

В изображениях в градациях серого каждый пиксель имеет значение от 0 до 255. В изображениях RGB каждый пиксель имеет значение из трех кортежей, определяемое как (r, g, b), где r, g и b имеют значения от 0 до 255.

Вы можете попробовать использовать imagecopymergegray, который преобразует пиксели RGB в оттенки серого перед копированием из источника в место назначения. Если это не сработает, вы можете использовать редактор изображений, чтобы преобразовать изображение холста и цифровое изображение в один и тот же формат. Например, оба могут быть преобразованы в оттенки серого или RGB.

Как упоминалось в ответе @jhilgeman, неэффективно создавать новое изображение счетчика посетителей с использованием GD для каждого посещения. Было бы намного лучше просто выводить теги изображений для цифр.

Сделайте это проще, я надеюсь, что этот ответ поможет вам, повторите текстовый файл с количеством зрителей и добавьте к нему фоновое изображение.

<div>
        <p> <center> Number of visitors:</center> </p>
        <center>  <div style = "    position: relative;
        width: 24px;
       
        background-image: url(https://image.freepik.com/free-vector/elegant-white-background-with-shiny-lines_1017-17580.jpg);
        padding: 50px"><?php echo file_get_contents("counter.txt"); ?></div>
        </center>
        </div>

Другие вопросы по теме