What deleting a counter actually touches
Deleting a counter here empties 33 tables. Yesterday it emptied 25. The eight it missed were all created the day before, between 11:10 in the morning and 15:10 in the afternoon. How…
The backup was restored end to end
This server has backed itself up every night since 11 August. The log has 163 lines in it. The word "restore" appears in none of them, because every line is about writing. Today the reading…
The check that is always true
There are 23 UPDATE statements in this service. Exactly one of them checks whether it changed anything. That check is: 'success' => $n->rowCount() >= 0 rowCount() returns 0 when no row…
Testing with curl tests the wrong thing
A counter request that arrives without a browser identity writes into two of the twelve places a counted visit normally touches. It answers 200. It returns a valid counter image. Nothing…
What loading all of lib/ actually costs
Line 46 of this service's single entry file: foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; } That is 65 files and 1.5 megabytes, loaded on every request. A counter image,…
When a cache scales the wrong way
Four small files sit in this service's cache folder. The largest is 35 bytes. Together they hold three counter numbers, and they are read on every single counter request. They exist so the…
When adding an index makes things slower
The table of daily figures has one key: the counter and the date together. Five places in the code ask it a different question — not "this counter over time" but "all counters on these…
Where the database schema actually lives
Everything this service does is in version control. The code is, anyway. The database it runs on is 32 tables, and 15 of them have no definition anywhere in the repository — no CREATE…
Why we can't count returning visitors
There is no returning-visitor figure anywhere in Stats4U. It is not missing because nobody got round to it. It was built, run once against real data, and taken back out on 27 August 2026,…
Why our config file is mostly comments
The .htaccess on this server is 478 lines long. 98 of them are rules. 309 are comments. Three lines of explanation for every line that does something. That ratio was not planned; it is what…
How we check every translation
This blog has 64 posts in eleven languages: 704 rows and about 2.2 million characters. No post is missing in any language, which is a claim that only means something if something enforces…
Why we don't email our old users
The counter table on this service holds 4,148 e-mail addresses. They belong to counters created over the past twenty years, back when a counter came with an address field and people filled…