php.ini / PHP Selector


WTF??? Je sad pa to??? Mneni je to šef namjestio. Meni to ne treba!!!

 

Naziv PHP izvorno je značio “Personal Home Page”, ali se danas službeno tumači kao “PHP: Hypertext Preprocessor”.

To je tzv. rekurzivna kratica – sama sebe sadrži u nazivu – i opisuje njegovu ulogu: obradu sadržaja (hypertexta) na serveru prije nego što se pošalje u preglednik.

PHP je serverski programski jezik koji pokreće ogroman dio današnjeg weba i zadužen je za ono što korisnik ne vidi, ali bez čega stranica ne bi funkcionirala – obradu podataka, logiku rada, komunikaciju s bazom i generiranje sadržaja koji se prikazuje u pregledniku. Kada otvoriš web stranicu izrađenu u WordPressu, Joomli ili nekom drugom sustavu, upravo PHP “iza kulisa” sastavlja stranicu iz baze podataka, učitava postavke, provjerava korisnike i odlučuje što će se prikazati i na koji način. CMS i PHP su praktički nerazdvojni: CMS daje strukturu, sučelje i mogućnost upravljanja sadržajem, dok PHP omogućuje da sve to radi kao živi sustav, reagira na korisnika i povezuje dizajn, podatke i funkcionalnost u jednu cjelinu. Bez PHP-a CMS bi bio samo skup statičnih datoteka, a bez CMS-a PHP bi bio samo alat – zajedno čine temelj modernih dinamičkih web stranica i aplikacija.

Skripta za provjeru php verzije servera:

Ova mala PHP datoteka služi za brzu provjeru koja je verzija PHP-a aktivna na serveru. Korisno je prije instalacije CMS-a, pluginova ili kod rješavanja problema kada treba znati radi li server na PHP-u 7.x, 8.x ili novijem.

Kod koji se koristi:

				
					<?php

echo "Trenutna PHP verzija na serveru: " . phpversion();

?>
				
			

Postupak korištenja:

  1. Otvori obični tekstualni editor (npr. Sublime, Notepad++) i spremi datoteku pod nazivom php_version.php.

  2. U datoteku zalijepi navedeni kod i spremi.

  3. Uploadaj datoteku na server u web root direktorij (npr. public_html, www ili root domene).

  4. U pregledniku otvori adresu:    https://tvojadomena.com/php_version.php

Stranica će odmah ispisati aktivnu PHP verziju koja se koristi za tu domenu.
Php versions selector

Kada se na server postavi datoteka za provjeru PHP verzije i otvori kroz preglednik, prikazuje se verzija PHP-a koju koristi web server, odnosno PHP-FPM. To je okruženje u kojem rade WordPress, Joomla i svi ostali CMS sustavi jer se njihov kod izvršava kroz web zahtjeve. Međutim, na svakom ozbiljnijem serveru paralelno postoji i CLI verzija PHP-a, namijenjena radu iz terminala, cron zadacima, WP-CLI alatima, Composeru i administratorskim skriptama. Iako je riječ o istom jeziku, FPM i CLI su dva odvojena načina izvođenja s vlastitim konfiguracijama i vlastitim php.ini postavkama.

PHP-FPM je servis koji prima zahtjev od web servera (Apache ili Nginx), izvršava PHP kod i vraća rezultat pregledniku. Zato sve što korisnik vidi na web stranici, uključujući CMS sustave i njihove pluginove, ovisi o FPM verziji i njezinim postavkama poput memory limita, execution timea i upload ograničenja. CLI je s druge strane namijenjen radu izvan weba; pokreće se ručno ili automatizirano i koristi se za zadatke koji nemaju direktnu vezu s prikazom stranice, poput generiranja backupova, obrade podataka, instalacije paketa ili održavanja sustava.

Na CWP Pro okruženju dodatno je moguće precizno upravljati tim razlikama. CLI verziju PHP-a može se postaviti unutar određenog direktorija na serveru neovisno o verziji koju koristi PHP-FPM, koristeći odgovarajući handler. To znači da web stranica može raditi, primjerice, na PHP-u 8.2 kroz FPM, dok određeni projekt, skripta ili cron zadatak unutar određenog direktorija koristi drugu CLI verziju, bez utjecaja na ostatak sustava. Takav pristup omogućuje kompatibilnost sa starijim aplikacijama, testiranje novih verzija i sigurnije upravljanje okruženjem.

PHP Selector u CWPpro panelu

CWP Pro – PHP Selector (User Manual)

CWP Pro PHP Selector omogućuje da za svaku domenu ili korisnika odrediš koja će se PHP verzija koristiti kroz PHP-FPM, bez utjecaja na ostatak servera. To znači da na istom serveru možeš imati više PHP verzija instaliranih paralelno, a svaka domena može raditi na verziji koja joj odgovara. Ovo je posebno važno kod CMS sustava poput WordPressa i Joomle, gdje kompatibilnost pluginova često ovisi o točnoj verziji PHP-a.

U CWP Pro su PHP verzije instalirane kroz MultiPHP sustav. Globalna server verzija može biti jedna, ali preko PHP Selectora svaka domena dobiva vlastiti handler i vlastiti FPM pool. Kada promijeniš verziju kroz selector, CWP automatski prebaci virtual host na odgovarajući PHP-FPM socket i učita konfiguraciju te verzije. Promjena ne utječe na druge domene.

Gdje se nalazi PHP Selector

Kao korisnik:
Dashboard ->CWP Setting→PHPSelector

Kako promijeniti PHP verziju za domenu

  1. Odaberi domenu iz padajućeg izbornika.

  2. Izaberi željenu PHP verziju (npr. od 7.4 do  8.3). Starije verzije su omogućene samo na starim serverima CentOS7 . Alma Linux 9  koristi najnižu 7.4

  3. Spremi promjene.

  4. CWP automatski restartira odgovarajući PHP-FPM servis za tu verziju.

Nakon promjene preporučuje se provjeriti verziju putem:  https://tvojadomena.com/php_version.php

 

kako bi potvrdio da domena koristi novu FPM verziju.

PHP-FPM vs CLI u CWP Pro

Važno je razumjeti da PHP Selector mijenja FPM verziju za web promet, ali ne mijenja globalnu CLI verziju na serveru. CLI verzija se koristi u terminalu, cron zadacima i alatima poput WP-CLI. U CWP Pro moguće je definirati koja će se CLI verzija koristiti u određenom direktoriju, neovisno o FPM verziji koju koristi web server. To se radi putem handlera i konfiguracije alternativne PHP binarke, čime se omogućuje da, primjerice, web radi na PHP 8.2, dok određeni projekt ili skripta u tom direktoriju koristi PHP 7.4 ili 8.1.

To razdvajanje daje fleksibilnost kod migracija, testiranja i održavanja starijih aplikacija.

Dodatne postavke unutar PHP Selectora

Za svaku verziju moguće je uključiti ili isključiti ekstenzije (mysqli, ionCube, imagick, gd, curl, intl itd.). Promjene se odnose samo na odabranu PHP verziju. Ako domena koristi PHP 8.2, mijenjaš ekstenzije unutar 8.2 konfiguracije, bez utjecaja na 8.1 ili 8.3.

Što PHP Selector ne radi

  • Ne mijenja globalni server PHP za sve domene odjednom.

  • Ne mijenja CLI verziju osim ako je ručno ne definiraš.

  • Ne briše stare PHP verzije – one ostaju instalirane dok ih administrator ne ukloni.

Preporuka u praksi

Za produkcijske CMS sustave koristi stabilnu i podržanu verziju (trenutno 8.2 ili noviju), a prije promjene verzije napravi backup aplikacije. Nakon promjene provjeri rad pluginova, cron zadataka i eventualne error logove.

PHP Selector u CWP Pro omogućuje profesionalno upravljanje verzijama bez potrebe za ručnim editiranjem virtual host konfiguracija ili FPM poolova. Upravo zato je ključan alat u okruženjima gdje na jednom serveru hostaš više projekata s različitim zahtjevima.

Video uputa korištenja PHP Selectora na CWPpro

U ovoj video uputi pokazujem kako se u CWP Pro koristi PHP Selector i zašto je to jedna od najvažnijih postavki na serveru. Na istom serveru može biti instalirano više PHP verzija, ali svaka domena može koristiti samo jednu – i upravo to rješava Selector. Promjena verzije ne dira ostatak servera, ne ruši druge projekte i ne utječe na globalne postavke.

Kroz video prolazimo gdje se nalazi PHP Selector, kako promijeniti verziju za određenu domenu i što se zapravo događa u pozadini. Kada promijeniš verziju, CWP automatski prebacuje domenu na odgovarajući PHP-FPM handler. To znači da web aplikacija odmah počinje raditi na novoj verziji bez ručnog diranja konfiguracijskih datoteka.

Važno je razumjeti da PHP Selector mijenja verziju za web promet (PHP-FPM), ali ne mijenja CLI verziju koja se koristi u terminalu i cron zadacima. To su dva odvojena okruženja i zato je bitno znati što točno mijenjaš i zašto.

Ova funkcionalnost posebno je važna kod CMS sustava poput WordPressa i Joomle jer kompatibilnost pluginova, tema i ekstenzija često ovisi o verziji PHP-a. Prije svake promjene preporučljivo je napraviti backup i provjeriti radi li sve kako treba nakon prebacivanja.

Ako želiš imati stabilan i predvidljiv server bez improvizacija, PHP Selector moraš znati koristiti. Ovo nije kozmetika — ovo je temelj stabilnosti web aplikacije.

"php.ini" datoteka 90% problema riješeno!

Datoteka php.ini je mjesto gdje se definira ponašanje PHP-a na serveru i u praksi je odgovorna za većinu problema koji se pojavljuju na web aplikacijama. Kada WordPress ne dopušta upload većih datoteka, kada Joomla javlja memory error, kada skripta prekida izvršavanje ili plugin “puca bez razloga”, uzrok je vrlo često upravo u ograničenjima postavljenim unutar php.ini konfiguracije.

Unutar te datoteke određuju se ključne stvari poput količine memorije koju PHP smije koristiti, maksimalnog vremena izvršavanja skripte, veličine datoteka koje se mogu uploadati, veličine POST zahtjeva i načina prikaza grešaka. Ako su te vrijednosti preniske, aplikacija će raditi nestabilno ili će određene funkcije jednostavno prestati raditi. Zato se kaže da je “90% problema riješeno” onog trenutka kada se php.ini pravilno postavi prema stvarnim potrebama aplikacije.

Važno je razumjeti da php.ini nije univerzalna datoteka koja vrijedi za cijeli server na isti način. U modernim hosting okruženjima postoje različite konfiguracije za različite PHP verzije, za PHP-FPM i za CLI, a ponekad i po domenama ili korisnicima. To znači da promjena u jednoj php.ini datoteci ne mora automatski vrijediti svugdje, pa je ključno znati koja konfiguracija se zaista koristi za određenu web stranicu.

Kod CMS sustava poput WordPressa i Joomle, pravilno podešen php.ini znači stabilniji rad, brži odziv i manje grešaka u radu pluginova i ekstenzija. S druge strane, loše postavljene vrijednosti dovode do timeouta, memory grešaka, neuspjelih instalacija i problema s uploadom sadržaja. Zbog toga php.ini nije samo tehnička sitnica, nego temeljna konfiguracija koja izravno utječe na performanse i stabilnost cijele web aplikacije.

Kada se razumije gdje se nalazi php.ini koji je aktivan za određenu domenu i kako promijeniti njegove vrijednosti, rješavanje problema postaje brže, preciznije i bez nagađanja. Upravo zato administratori i developeri uvijek prvo provjeravaju php.ini — jer vrlo često upravo tamo leži rješenje.

Evo jedan primjer koji bi trebao raditi u WP

				
					date.timezone=Europe/Zagreb
memory_limit=512M
max_execution_time=300
max_input_time=300
max_input_vars=5000
post_max_size=256M
upload_max_filesize=256M
max_file_uploads=50
default_socket_timeout=120
output_buffering=4096
zlib.output_compression=On
realpath_cache_size=4096K
realpath_cache_ttl=600
display_errors=Off
log_errors=On
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
expose_php=Off
allow_url_fopen=On
session.save_handler=files
session.gc_maxlifetime=1440
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
				
			

I jedan primjer koji bi trebao raditi u Joomla 3x - 6x

				
					condate.timezone=Europe/Zagreb

; --- TMP direktoriji ---
upload_tmp_dir=/home/USER/tmp
sys_temp_dir=/home/USER/tmp
session.save_path=/home/USER/tmp

; --- Limits ---
memory_limit=512M
max_execution_time=300
max_input_time=300
max_input_vars=5000
post_max_size=256M
upload_max_filesize=256M
max_file_uploads=50
default_socket_timeout=120

; --- Output ---
output_buffering=Off
zlib.output_compression=Off

; --- Errors ---
display_errors=Off
log_errors=On
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
expose_php=Off

; --- File access ---
allow_url_fopen=On

; --- Sessions ---
session.save_handler=files
session.gc_maxlifetime=1440

; --- Realpath ---
realpath_cache_size=4096K
realpath_cache_ttl=600

; --- OPcache ---
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.save_comments=1
opcache.fast_shutdown=1sole.log( 'Code is Poetry' );
				
			

U;  configuration.php:

				
					public $tmp_path = '/home/USER/public_html/tmp';
				
			

Opis prvog php.ini seta (vrijednosti i jedinice)

  • date.timezone = Europe/Zagreb – Vremenska zona servera. Nema jedinicu. Mora odgovarati lokaciji servera ili korisnika.
  • memory_limit = 512M – Maksimalna memorija po PHP procesu. Jedinica: MB (M). 512MB je visoka i sigurna vrijednost za CMS.
  • max_execution_time = 300 – Maksimalno vrijeme izvršavanja skripte. Jedinica: sekunde. 300 = 5 minuta.
  • max_input_time = 300 – Vrijeme dozvoljeno za obradu ulaznih podataka. Jedinica: sekunde.
  • max_input_vars = 5000 – Maksimalan broj ulaznih varijabli u jednom zahtjevu. Nema jedinicu. 5000 je povišena vrijednost (builderi, velike forme).
  • post_max_size = 256M – Maksimalna veličina cijelog POST zahtjeva. Jedinica: MB.
  • upload_max_filesize = 256M – Maksimalna veličina pojedinačne datoteke. Jedinica: MB.
  • max_file_uploads = 50 – Broj datoteka u jednom uploadu. Nema jedinicu.
  • default_socket_timeout = 120 – Timeout mrežne konekcije. Jedinica: sekunde.
  • output_buffering = 4096 – Veličina output buffera. Jedinica: bajtovi (bytes). 4096 = 4KB.
  • zlib.output_compression = On – Uključuje gzip kompresiju. Nema jedinicu (On/Off).
  • realpath_cache_size = 4096K – Veličina cachea za putanje. Jedinica: KB (K). 4096K = 4MB.
  • realpath_cache_ttl = 600 – Trajanje realpath cachea. Jedinica: sekunde. 600 = 10 minuta.
  • display_errors = Off – Prikaz grešaka (On/Off).
  • log_errors = On – Logiranje grešaka (On/Off).
  • error_reporting – Razina prijavljivanja grešaka. Nema jedinicu (bitmask vrijednost).
  • expose_php = Off – Prikaz PHP verzije u headeru (On/Off).
  • allow_url_fopen = On – Dozvola za udaljene URL operacije (On/Off).
  • session.gc_maxlifetime = 1440 – Trajanje sessiona. Jedinica: sekunde. 1440 = 24 minute.
  • opcache.memory_consumption = 256 – Memorija za OPcache. Jedinica: MB.
  • opcache.interned_strings_buffer = 16 – Memorija za internirane stringove. Jedinica: MB.
  • opcache.max_accelerated_files = 20000 – Maksimalan broj keširanih PHP datoteka. Nema jedinicu.
  • opcache.revalidate_freq = 60 – Interval provjere izmjena datoteka. Jedinica: sekunde.

Opis drugog php.ini seta (Joomla profil)

  • upload_tmp_dir – Privremeni direktorij za upload. Putanja (string), nema jedinicu.
  • sys_temp_dir – Sistemski temp direktorij. Putanja.
  • session.save_path – Lokacija spremanja session datoteka. Putanja.
  • output_buffering = Off – Bufferiranje outputa isključeno.
  • zlib.output_compression = Off – PHP gzip kompresija isključena.
  • opcache.enable_cli = 0 – OPcache isključen za CLI (0 = Off, 1 = On).
  • opcache.validate_timestamps = 1 – Provjera izmjena fajlova (1 = uključeno).
  • opcache.save_comments = 1 – Zadržava PHP komentare (1 = uključeno).
  • opcache.fast_shutdown = 1 – Brže oslobađanje memorije (1 = uključeno).

Vrijednosti u ovoj php.ini konfiguraciji namjerno su postavljene iznad klasičnih “shared hosting” limita jer moderni CMS sustavi više nisu male statične stranice. WordPress s nekoliko ozbiljnih pluginova, Joomla s page builderom ili Dolibarr s većom bazom podataka jednostavno traže više memorije, veće upload limite i stabilan execution time. Premale vrijednosti danas znače samo nepotrebne greške, timeout poruke i frustraciju korisnika.

Upravo zato na 8Core hostingu ne gušimo aplikacije minimalnim limitima radi uštede par megabajta. Server je konfiguriran tako da podržava realne potrebe ozbiljnih projekata, uz uključen OPcache, korektne limite i sigurnosne postavke koje ne kompromitiraju performanse. Rezultat je stabilniji CMS, manje “misterioznih” grešaka i hosting koji radi kako treba — bez da korisnik mora svaki tjedan moliti za povećanje limita.

Kako koristimo ?

Kada su PHP verzija, FPM okruženje i php.ini postavke posložene kako treba, većina tipičnih problema prestaje postojati. Nema nasumičnih timeouta, nema rušenja pluginova bez razloga, nema misterija oko upload limita ili memory grešaka. Sustav postaje predvidljiv, stabilan i spreman za normalan rad bez stalnog “gašenja požara”.

U praksi to znači da je velik dio budućih poteškoća eliminiran unaprijed. Ako je temelj dobro postavljen, aplikacija se dalje razvija bez trzavica, nadogradnje prolaze mirno, a administracija servera postaje rutina umjesto stalne improvizacije. Drugim riječima, kada se konfiguracija napravi kako treba, 99% grešaka koje se inače pojavljuju u radu jednostavno se više ne događa.

 

Evo i jedna poklon skriptica za provjere php stanja na serverima.

Postupak je isti kao i sa php_version.php, nazovite datoteku kako želite …

				
					<?php
// phpdiag.php
// Jednostavan "PHP DIAG" dashboard: verzija, ekstenzije, php.ini vrijednosti
// Bootstrap 5 CDN + search/filter + export JSON

declare(strict_types=1);

// --- (Opcionalno) Minimalna zaštita: dozvoli samo s tvoje IP adrese ---
// Ako želiš zaključati na svoju IP, odkomentiraj i upiši IP:
// $allowIp = '1.2.3.4';
// if (!isset($_SERVER['REMOTE_ADDR']) || $_SERVER['REMOTE_ADDR'] !== $allowIp) { http_response_code(403); exit('Forbidden'); }

function h(string $s): string { return htmlspecialchars($s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }

function iniValueToString(mixed $v): string {
    if ($v === false || $v === null) return '';
    if (is_bool($v)) return $v ? '1' : '0';
    return (string)$v;
}

function normalizeIniEntry(array $row): array {
    // ini_get_all() vraća: ['global_value'=>..., 'local_value'=>..., 'access'=>...]
    return [
        'global' => iniValueToString($row['global_value'] ?? ''),
        'local'  => iniValueToString($row['local_value'] ?? ''),
        'access' => (string)($row['access'] ?? ''),
    ];
}

$phpVersion = PHP_VERSION;
$sapi = php_sapi_name();
$os = PHP_OS_FAMILY . ' (' . PHP_OS . ')';
$loadedIni = php_ini_loaded_file() ?: '';
$scanDir = php_ini_scanned_files() ?: '';
$disabledFunctions = ini_get('disable_functions') ?: '';
$disabledClasses = ini_get('disable_classes') ?: '';
$memoryLimit = ini_get('memory_limit') ?: '';
$timezone = ini_get('date.timezone') ?: date_default_timezone_get();
$maxExec = ini_get('max_execution_time') ?: '';
$uploadMax = ini_get('upload_max_filesize') ?: '';
$postMax = ini_get('post_max_size') ?: '';

$extensions = get_loaded_extensions();
sort($extensions, SORT_NATURAL | SORT_FLAG_CASE);

$iniAll = ini_get_all(null, false); // name => value (local)
$iniAllDetailed = ini_get_all(null, true); // name => ['global_value','local_value','access']
ksort($iniAllDetailed, SORT_NATURAL | SORT_FLAG_CASE);

$iniRows = [];
foreach ($iniAllDetailed as $k => $row) {
    $norm = normalizeIniEntry(is_array($row) ? $row : []);
    $iniRows[] = [
        'name' => (string)$k,
        'local' => $norm['local'],
        'global' => $norm['global'],
        'access' => $norm['access'],
    ];
}

// --- Export JSON ---
if (isset($_GET['export']) && $_GET['export'] === 'json') {
    header('Content-Type: application/json; charset=utf-8');
    header('Content-Disposition: attachment; filename="phpdiag.json"');
    echo json_encode([
        'meta' => [
            'php_version' => $phpVersion,
            'sapi' => $sapi,
            'os' => $os,
            'loaded_ini' => $loadedIni,
            'scanned_ini' => $scanDir,
            'timezone' => $timezone,
            'generated_at' => date('c'),
        ],
        'quick' => [
            'memory_limit' => $memoryLimit,
            'max_execution_time' => $maxExec,
            'upload_max_filesize' => $uploadMax,
            'post_max_size' => $postMax,
            'disable_functions' => $disabledFunctions,
            'disable_classes' => $disabledClasses,
        ],
        'extensions' => $extensions,
        'ini' => $iniRows,
    ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    exit;
}

$quick = [
    ['label' => 'PHP version', 'value' => $phpVersion],
    ['label' => 'SAPI', 'value' => $sapi],
    ['label' => 'OS', 'value' => $os],
    ['label' => 'Timezone', 'value' => $timezone],
    ['label' => 'Loaded php.ini', 'value' => $loadedIni ?: '(none)'],
    ['label' => 'Scanned .ini files', 'value' => $scanDir ?: '(none)'],
    ['label' => 'memory_limit', 'value' => $memoryLimit ?: '(not set)'],
    ['label' => 'max_execution_time', 'value' => $maxExec ?: '(not set)'],
    ['label' => 'upload_max_filesize', 'value' => $uploadMax ?: '(not set)'],
    ['label' => 'post_max_size', 'value' => $postMax ?: '(not set)'],
    ['label' => 'disable_functions', 'value' => $disabledFunctions ?: '(none)'],
    ['label' => 'disable_classes', 'value' => $disabledClasses ?: '(none)'],
];

?>
<!doctype html>
<html lang="hr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>PHP DIAG</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <style>
    body { background: #0b1220; }
    .card { border: 0; box-shadow: 0 10px 30px rgba(0,0,0,.25); }
    .muted { color: rgba(255,255,255,.7); }
    .table thead th { position: sticky; top: 0; background: var(--bs-body-bg); z-index: 1; }
    .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
    .badge-soft { background: rgba(13,110,253,.15); color: #9ec5fe; border: 1px solid rgba(13,110,253,.35); }
  </style>
</head>
<body data-cmplz=1 class="text-light">
  <div class="container py-4 py-md-5">
    <div class="d-flex flex-wrap align-items-center justify-content-between gap-2 mb-4">
      <div>
        <div class="d-flex align-items-center gap-2">
          <h1 class="h3 mb-0">PHP DIAG</h1>
          <span class="badge badge-soft mono">v<?= h($phpVersion) ?></span>
        </div>
        <div class="muted">Verzija, ekstenzije i php.ini postavke — uredno i pregledno.</div>
      </div>
      <div class="d-flex gap-2">
        <a class="btn btn-outline-light btn-sm" href="?export=json">Export JSON</a>
        <button class="btn btn-primary btn-sm" id="copyLinkBtn">Copy link</button>
      </div>
    </div>

    <div class="card bg-dark text-light mb-4">
      <div class="card-body">
        <div class="row g-3">
          <?php foreach ($quick as $q): ?>
            <div class="col-12 col-md-6 col-xl-4">
              <div class="p-3 rounded-3 border border-secondary-subtle bg-black bg-opacity-25">
                <div class="muted small"><?= h($q['label']) ?></div>
                <div class="mono text-break"><?= h($q['value']) ?></div>
              </div>
            </div>
          <?php endforeach; ?>
        </div>
      </div>
    </div>

    <div class="card bg-dark text-light">
      <div class="card-body">
        <ul class="nav nav-pills mb-3" id="tabs" role="tablist">
          <li class="nav-item" role="presentation">
            <button class="nav-link active" id="ini-tab" data-bs-toggle="pill" data-bs-target="#ini" type="button" role="tab">php.ini postavke</button>
          </li>
          <li class="nav-item" role="presentation">
            <button class="nav-link" id="ext-tab" data-bs-toggle="pill" data-bs-target="#ext" type="button" role="tab">Ekstenzije (<?= count($extensions) ?>)</button>
          </li>
        </ul>

        <div class="d-flex flex-wrap gap-2 align-items-center justify-content-between mb-3">
          <div class="input-group" style="max-width: 520px;">
            <span class="input-group-text">Search</span>
            <input type="text" class="form-control" id="searchBox" placeholder="npr. opcache, memory, upload, session, date.timezone...">
            <button class="btn btn-outline-light" id="clearBtn" type="button">Clear</button>
          </div>

          <div class="d-flex gap-2">
            <span class="badge text-bg-secondary">Prikaz: <span id="shownCount">0</span></span>
          </div>
        </div>

        <div class="tab-content" id="tabsContent">

          <div class="tab-pane fade show active" id="ini" role="tabpanel" aria-labelledby="ini-tab">
            <div class="table-responsive" style="max-height: 70vh;">
              <table class="table table-dark table-hover align-middle" id="iniTable">
                <thead>
                  <tr>
                    <th style="width: 30%;">Direktiva</th>
                    <th style="width: 35%;">Local value</th>
                    <th style="width: 35%;">Global value</th>
                  </tr>
                </thead>
                <tbody>
                  <?php foreach ($iniRows as $r): ?>
                    <tr data-search="<?= h(strtolower($r['name'].' '.$r['local'].' '.$r['global'])) ?>">
                      <td class="mono"><?= h($r['name']) ?></td>
                      <td class="mono text-break"><?= h($r['local']) ?></td>
                      <td class="mono text-break"><?= h($r['global']) ?></td>
                    </tr>
                  <?php endforeach; ?>
                </tbody>
              </table>
            </div>
            <div class="muted small mt-2">
              Local value = ono što trenutno vrijedi za ovaj request. Global value = default iz konfiguracije.
            </div>
          </div>

          <div class="tab-pane fade" id="ext" role="tabpanel" aria-labelledby="ext-tab">
            <div class="row g-2" id="extGrid">
              <?php foreach ($extensions as $ext): ?>
                <div class="col-6 col-md-4 col-xl-3" data-search="<?= h(strtolower($ext)) ?>">
                  <div class="p-2 rounded-3 border border-secondary-subtle bg-black bg-opacity-25 d-flex justify-content-between align-items-center">
                    <span class="mono"><?= h($ext) ?></span>
                    <span class="badge text-bg-success">on</span>
                  </div>
                </div>
              <?php endforeach; ?>
            </div>
          </div>

        </div>
      </div>
    </div>

    <div class="text-center muted small mt-4">
      PHP DIAG • <?= h(date('Y-m-d H:i:s')) ?>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
  <script>
    const searchBox = document.getElementById('searchBox');
    const clearBtn = document.getElementById('clearBtn');
    const shownCount = document.getElementById('shownCount');
    const iniRows = Array.from(document.querySelectorAll('#iniTable tbody tr'));
    const extCards = Array.from(document.querySelectorAll('#extGrid [data-search]'));

    function applyFilter() {
      const q = (searchBox.value || '').trim().toLowerCase();
      let shown = 0;

      iniRows.forEach(tr => {
        const hay = tr.getAttribute('data-search') || '';
        const ok = !q || hay.includes(q);
        tr.style.display = ok ? '' : 'none';
        if (ok) shown++;
      });

      extCards.forEach(div => {
        const hay = div.getAttribute('data-search') || '';
        const ok = !q || hay.includes(q);
        div.style.display = ok ? '' : 'none';
      });

      shownCount.textContent = String(shown);
    }

    clearBtn.addEventListener('click', () => { searchBox.value = ''; applyFilter(); searchBox.focus(); });
    searchBox.addEventListener('input', applyFilter);

    // Init counts
    applyFilter();

    // Copy link
    document.getElementById('copyLinkBtn').addEventListener('click', async () => {
      try {
        await navigator.clipboard.writeText(window.location.href);
        const btn = document.getElementById('copyLinkBtn');
        const old = btn.textContent;
        btn.textContent = 'Copied';
        setTimeout(() => btn.textContent = old, 900);
      } catch (e) {}
    });
  </script>
</body>
</html>
				
			

Kategorije:

Posljednje dodano

Grgin dol 46
34000 Požega, Croatia-EU
OIB: 14484857067
MB: 04611799
IBAN: HR0223900011100974958
SWIFT: HPBZHR2X


Copyright © 2012-2026 8Core Association. All Rights Reserved
×

Registracija korisničkog računa

Registracija korisničkog računa moguća je isključivo tijekom procesa narudžbe proizvoda ili usluge. Ova mjera uvedena je radi povećanja sigurnosti sustava i sprječavanja zlouporabe registracija. Na taj način osiguravamo da su svi korisnički računi povezani s aktivnim narudžbama i stvarnim korisnicima naših usluga.

PROIZVODI I USLUGE