Versions Paheko les plus courantes | 1.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.1 | 2.8 % |
Part de 1.2 | 62.4 % |
Part de 1.3 | 34.7 % |
Versions PHP les plus courantes | 8.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.4 | 24.3 % |
Part de PHP 8.0 | 28.1 % |
Part de PHP 8.1 | 17.3 % |
Part de PHP 8.2 | 25.2 % |
Versions SQLite les plus courantes | 3.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 courantes | FTS3, 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 JSON1 | 75.1 % |
Part de support de FTS3 | 99.9 % |
Part de support de FTS4 | 89.5 % |
Part de support de FTS5 | 89.5 % |
Part de support de UPDATE_DELETE_LIMIT | 74.8 % |
<?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 = [1 => $_POST['id'], $_POST['version'], $_POST['sqlite'], $_POST['php'], $_POST['sqlite_options']];
// restrict string length
$data = array_map(fn($a) => substr($a, 0, 200), $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($v, 0, strrpos($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);
}