?php
// --- KONFIGURACJA I BEZPIECZEŃSTWO ---
// Optymalizacja nagłówków dla SEO i Cache
header("Content-Type: text/html; charset=utf-8");
header("X-Content-Type-Options: nosniff");
// Cache-Control sterowany dynamicznie
if (isset($_GET['view']) && $_GET['view'] === 'product') {
header("Cache-Control: public, max-age=300");
} else {
header("Cache-Control: no-store, no-cache, must-revalidate");
}
ini_set('display_errors', '0');
error_reporting(E_ALL);
// --- DATABASE CONFIG ---
const DB_HOST = 'localhost';
const DB_USER = 'root';
const DB_PASS = 'intermuny88';
const DB_NAME = 'cenonet';
const DB_CHARSET = 'utf8mb4';
/*
SUGEROWANE INDEKSY SQL DLA BAZY 30GB (Uruchom w phpMyAdmin):
1. CREATE INDEX idx_title_ft ON produkty(title); -- Dla szybkiego wyszukiwania
2. CREATE INDEX idx_cats ON produkty(kat_1, kat_2); -- Dla drzewa kategorii
3. CREATE INDEX idx_brand ON produkty(brand); -- Dla podobnych produktów
4. CREATE INDEX idx_price_sale ON produkty(price, sale_price); -- Dla sortowania okazji
*/
const CACHE_ENABLED = true;
const CACHE_DIR = '/dev/shm/'; // Używamy RAM dysku jeśli dostępny, dla szybkości
const CACHE_PREFIX = 'cenonet_v4_opt_';
const CACHE_TIME = 3600; // 1h
const QUERY_CACHE_TIME = 600;
// --- USTAWIENIA DODATKOWE ---
const ENABLE_MASCOT = true;
const ENABLE_MOBILE_ZOOM_OPT = true;
// --- ZWROTY ASYSTENTA ZAKUPOWEGO (TASK 2) ---
$assistantPhrases = [
"Cześć! Wpisz czego szukasz, a przeszukam dla Ciebie tysiące ofert.",
"Znajdę dla Ciebie najlepszą cenę, tylko podaj nazwę produktu.",
"Szukasz prezentu? Powiedz mi dla kogo, a znajdę coś ekstra.",
"Dziś mamy świetne promocje na elektronikę. Czego potrzebujesz?",
"Oszczędzaj czas – wpisz nazwę, a ja pokażę Ci konkrety.",
"Potrzebujesz pomocy w wyborze? Jestem do usług.",
"Wyszukuję oferty z prędkością światła. Sprawdź mnie!",
"Nie przepłacaj. Znajdę dla Ciebie najtańszą opcję.",
"Szukasz butów, laptopa czy może nowej torebki?",
"Twoje zadowolenie to mój priorytet. Co mogę znaleźć?",
"Gotowy na łowy? Wpisz frazę i zaczynamy.",
"Przeszukuję magazyny w czasie rzeczywistym. Co Cię interesuje?",
"Lubisz okazje? Ja też! Znajdźmy coś w super cenie.",
"Pomogę Ci wybrać mądrze. Czego szukasz?",
"Znam się na cenach jak nikt inny. Zapytaj o produkt.",
"Szukasz inspiracji? Wpisz kategorię, np. 'zegarki'.",
"Szybkie zakupy to moja specjalność.",
"Chcesz porównać ceny? Podaj model produktu.",
"Znajdźmy razem coś wyjątkowego.",
"Jestem Twoim osobistym doradcą zakupowym.",
"Wpisz markę, którą lubisz, a pokażę co mamy.",
"Szukasz nowości czy wyprzedaży?",
"Pomogę Ci trafić w dziesiątkę z zakupem.",
"Zakupy bez stresu? Zostaw to mi.",
"Czekam na Twoje polecenie. Co wpisujemy?",
"Mam nosa do promocji. Sprawdź co znalazłem.",
"Technologia, moda, dom? Przeszukam wszystko.",
"Zacznijmy poszukiwania najlepszych ofert.",
"Wpisz czego potrzebujesz, a ja zajmę się resztą.",
"Cześć! W czym mogę Ci dziś pomóc?"
];
$shoppingQuotes = [
"Kto kupuje to, czego nie potrzebuje, kradnie samemu sobie.",
"Zawsze jest dobra pora na małe zakupy.",
"Pieniądze szczęścia nie dają, ale zakupy tak.",
"Życie jest krótkie, kup te buty.",
"Promocja to moje drugie imię.",
"Oszczędzanie jest super, ale wydawanie jeszcze lepsze.",
"Styl to sposób na powiedzenie kim jesteś bez słów.",
"Jakość pamięta się o wiele dłużej niż cenę.",
"Zakupy online: bo nie trzeba zakładać spodni.",
"Twój koszyk czuje się samotny.",
"Dzień bez zakupów to dzień stracony.",
"Wyprzedaż to jedyny wyścig, w którym wszyscy wygrywają.",
"Cenonet - tu zaczynają się dobre decyzje."
];
// --- SYSTEM CACHE ---
function getCacheKey(): string {
$prefix = (isset($_GET['view']) && $_GET['view'] === 'category') ? 'cat_' : 'page_';
$device = strpos($_SERVER['HTTP_USER_AGENT'] ?? '', 'Mobile') !== false ? 'm_' : 'd_';
return CACHE_DIR . CACHE_PREFIX . $prefix . $device . md5($_SERVER['REQUEST_URI'] . serialize($_GET));
}
function serveCache(): void {
if (!CACHE_ENABLED || isset($_GET['nocache']) || $_SERVER['REQUEST_METHOD'] === 'POST') return;
$file = getCacheKey();
if (file_exists($file) && (time() - filemtime($file) < CACHE_TIME) && filesize($file) > 500) {
$content = file_get_contents($file);
if (str_starts_with($content, "\x1f\x8b")) {
if (str_contains($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', 'gzip')) {
header('Content-Encoding: gzip');
echo $content;
} else {
echo gzdecode($content);
}
} else {
echo $content;
}
exit;
}
}
function saveCache(string $content): string {
if (!CACHE_ENABLED || isset($_GET['nocache']) || $_SERVER['REQUEST_METHOD'] === 'POST') return $content;
if (strlen($content) < 1000) return $content;
$file = getCacheKey();
$compressed = gzencode($content, 6);
@file_put_contents($file, $compressed);
return $content;
}
// --- CACHE ZAPYTAŃ (JSON) ---
function getQueryCache($key) {
if (!CACHE_ENABLED) return null;
$file = CACHE_DIR . 'sql_' . md5($key) . '.json';
if (file_exists($file) && (time() - filemtime($file) < QUERY_CACHE_TIME)) {
return json_decode(file_get_contents($file), true);
}
return null;
}
function saveQueryCache($key, $data) {
if (!CACHE_ENABLED) return;
$file = CACHE_DIR . 'sql_' . md5($key) . '.json';
@file_put_contents($file, json_encode($data));
}
// --- BAZA DANYCH (TASK 5: Strona błędu z LocalStorage) ---
function getDB(): mysqli {
static $mysqli;
if (!$mysqli) {
try {
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_errno) throw new Exception("DB Error: " . $mysqli->connect_error);
$mysqli->set_charset(DB_CHARSET);
} catch (Exception $e) {
http_response_code(503);
die('
Przerwa techniczna - Cenonet
Serwery są przeciążone
Mamy ogromne zainteresowanie ofertami. Przepraszamy za utrudnienia. Strona odświeży się automatycznie za 10 sekund.