Versions Paheko les plus courantes1.2.9, 1.3.2, 1.2.4, 1.2.11, 1.2.2, 1.3.1, 1.3.0, 1.2.6, 1.2.5, 1.2.7, 1.2.8, 1.2.3, 1.1.31, 1.3.0-alpha1, 1.3.0-rc3, 1.2.10, 1.3.4, 1.3.0-alpha3, 1.3.0-rc2, 1.3.0-alpha2, 1.3.0-alpha4, 1.3.0-rc14, 1.3.0-rc9, 1.3.0-rc10, 1.3.0-rc5, 1.3.3, 1.3.0-rc1, 1.3.0-rc8, 1.3.0-rc12, 1.3.0-rc7, 1.3.0-rc6, 1.3.0-rc4, 1.3.0-rc13, 1.1.31.2, 1.3.0-rc11
Part de 1.12.8 %
Part de 1.262.4 %
Part de 1.334.7 %
Versions PHP les plus courantes8.0, 8.2, 7.4, 8.1, 8.1.2-1ubuntu2, 7.4.3-4ubuntu2, 8.1.12-1ubuntu4, 8.3, 8.1.7-1ubuntu3
Part de PHP 7.424.3 %
Part de PHP 8.028.1 %
Part de PHP 8.117.3 %
Part de PHP 8.225.2 %
Versions SQLite les plus courantes3.34, 3.27, 3.39, 3.40, 3.33, 3.37, 3.31, 3.38, 3.26, 3.41, 3.35, 3.36, 3.42, 3.16, 3.44, 3.28, 3.22, 3.43, 3.32
Part de SQLite < 3.27 (vieux)1.3 %
Part de SQLite >= 3.27 (Debian Buster)98.7 %
Part de SQLite >= 3.34 (Debian Bullseye)68.3 %
Part de SQLite >= 3.25 + JSON1 + FTS4 (Paheko 1.3)73.8 %
Part de SQLite >= 3.25 + FTS4 (Paheko 1.3)89.1 %
Part de SQLite >= 3.31 + JSON1 + FTS4 (colonnes générées)53.5 %
Options SQLite les plus courantesFTS3, COLUMN_METADATA, FTS5, FTS4, RTREE, UNLOCK_NOTIFY, DBSTAT_VTAB, FTS3_PARENTHESIS, SESSION, PREUPDATE_HOOK, JSON1, FTS3_TOKENIZER, UPDATE_DELETE_LIMIT, LOAD_EXTENSION, STMTVTAB, MATH_FUNCTIONS, GEOPOLY, API_ARMOR, SQLLOG, SNAPSHOT, LOCKING_STYLE=1, STMT_SCANSTATUS, NORMALIZE, BYTECODE_VTAB, UNKNOWN_SQL_FU, STAT4, UNKNOWN_SQL_FUNCTION, RBU, ICU, DBPAGE_VTAB, UNKNOWN_, UPDATE_DELE, MEMORY_MANAGEMENT
Part de support de JSON175.1 %
Part de support de FTS399.9 %
Part de support de FTS489.5 %
Part de support de FTS589.5 %
Part de support de UPDATE_DELETE_LIMIT74.8 %

Code source de ce fichier :

<?php
/**
 * Ce fichier contient le code source de la fonction "ping"
 * qui permet de suivre les versions installés de PHP et SQLite
 * des installations auto-hébergées.
 *
 * Aucune autre information n'est stockée que celles indiquées
 * dans ce code.
 */

// Initialisation de la base de données
$exists file_exists('stats.sqlite');

$method $_SERVER['REQUEST_METHOD'];

if (!
$exists && $method == 'GET') {
    
highlight_file(__FILE__);
    exit;
}

$open_mode $method == 'GET' ? \SQLITE3_OPEN_READONLY : \SQLITE3_OPEN_READWRITE | \SQLITE3_OPEN_CREATE;
$db = new \SQLite3('stats.sqlite'$open_mode);
$db->busyTimeout(2*1000);
$db->exec('PRAGMA journal_mode = WAL;');

if (!
$exists) {
    
$db->exec('CREATE TABLE stats (
        id INTEGER NOT NULL PRIMARY KEY,
        hash TEXT NOT NULL,
        version TEXT NOT NULL,
        sqlite TEXT NOT NULL,
        php TEXT NOT NULL,
        sqlite_options TEXT NOT NULL,
        updated TEXT NOT NULL
    );

    CREATE UNIQUE INDEX stats_hash ON stats (hash);'
);
}

// Gérer le stockage des données envoyées
if ($method == 'POST') {
    
// Vérification que les infos nécessaires sont fournies
    
if (!isset($_POST['version'], $_POST['id'], $_POST['sqlite'], $_POST['php'], $_POST['sqlite_options'])) {
        
http_response_code(400);
        exit;
    }

    
$data = [=> $_POST['id'], $_POST['version'], $_POST['sqlite'], $_POST['php'], $_POST['sqlite_options']];

    
// restrict string length
    
$data array_map(fn($a) => substr($a0200), $data);

    
$data[5] = json_encode(explode(','$data[5]));

    
// Stockage des données dans la base de données
    
$st $db->prepare('REPLACE INTO stats (hash, version, sqlite, php, sqlite_options, updated) VALUES (?, ?, ?, ?, ?, datetime());');

    foreach (
$data as $key => $value) {
        
$st->bindValue($key$value);
    }

    
$st->execute();

    
$db->close();

    
http_response_code(204);
}

// Afficher le code de ce fichier et les stats
else if ($method == 'GET') {
    
$db->createFunction('major_version', function ($v) {
        return 
substr($v0strrpos($v'.'));
    });

    
$db->createFunction('version_id', function ($v) {
        
$version explode('.'$v);
        return (
$version[0] * 10000 $version[1] * 100 $version[2]);
    });

    
$reports = [
        
'Versions Paheko les plus courantes' => 'SELECT GROUP_CONCAT(a, \', \') FROM (SELECT version AS a, COUNT(*) AS b FROM stats GROUP BY version ORDER BY b DESC);',
        
'Part de 1.1' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(version) = \'1.1\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de 1.2' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(version) = \'1.2\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de 1.3' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(version) = \'1.3\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Versions PHP les plus courantes' => 'SELECT GROUP_CONCAT(a, \', \') FROM (SELECT major_version(php) AS a, COUNT(*) AS b FROM stats GROUP BY major_version(php) ORDER BY b DESC);',
        
'Part de PHP 7.4' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(php) = \'7.4\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de PHP 8.0' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(php) = \'8.0\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de PHP 8.1' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(php) = \'8.1\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de PHP 8.2' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE major_version(php) = \'8.2\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Versions SQLite les plus courantes' => 'SELECT GROUP_CONCAT(a, \', \') FROM (SELECT major_version(sqlite) AS a, COUNT(*) AS b FROM stats GROUP BY major_version(sqlite) ORDER BY b DESC);',
        
'Part de SQLite < 3.27 (vieux)' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE version_id(sqlite) < 32700) / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de SQLite >= 3.27 (Debian Buster)' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE version_id(sqlite) >= 32700) / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de SQLite >= 3.34 (Debian Bullseye)' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE version_id(sqlite) >= 33400) / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de SQLite >= 3.25 + JSON1 + FTS4 (Paheko 1.3)' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE version_id(sqlite) >= 32500 AND sqlite_options LIKE \'%JSON1%\' AND (sqlite_options LIKE \'%FTS4%\' OR sqlite_options LIKE \'FTS3\')) / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de SQLite >= 3.25 + FTS4 (Paheko 1.3)' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE version_id(sqlite) >= 32500 AND (sqlite_options LIKE \'%FTS4%\' OR sqlite_options LIKE \'FTS3\')) / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de SQLite >= 3.31 + JSON1 + FTS4 (colonnes générées)' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE version_id(sqlite) >= 33100 AND sqlite_options LIKE \'%JSON1%\' AND (sqlite_options LIKE \'%FTS4%\' OR sqlite_options LIKE \'FTS3\')) / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Options SQLite les plus courantes' => 'SELECT GROUP_CONCAT(a, \', \') FROM (SELECT value AS a, COUNT(*) AS b FROM stats, json_each(sqlite_options) GROUP BY value ORDER BY b DESC);',
        
'Part de support de JSON1' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE sqlite_options LIKE \'%JSON1%\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de support de FTS3' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE sqlite_options LIKE \'%FTS3%\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de support de FTS4' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE sqlite_options LIKE \'%FTS4%\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de support de FTS5' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE sqlite_options LIKE \'%FTS4%\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
        
'Part de support de UPDATE_DELETE_LIMIT' => 'SELECT (ROUND(1.0*(SELECT COUNT(*) FROM stats WHERE sqlite_options LIKE \'%UPDATE_DELETE_LIMIT%\') / (SELECT COUNT(*) FROM stats), 3)*100) || \' %\';',
    ];

    echo 
'<html><head><title>Statistiques</title></head><body>
        <table cellpadding=5 border=1 style="font-size: 1.3em">'
;

    foreach (
$reports as $label => $sql) {
        
printf('<tr><th style="text-align: left; width: 18em">%s</th><td>%s</td></tr>'$label$db->querySingle($sql));
    }

    
$db->close();

    echo 
'</table><hr /><h2>Code source de ce fichier :</h2>';
    
highlight_file(__FILE__);
}
else {
    
http_response_code(405);
}