I build and run onllm.dev, my studio site and blog, and the rebuild went live on 24 October. Plain PHP (7.4+) and MySQL behind Apache rewrites on Hostinger shared hosting. No framework. Most of the site is static HTML; PHP only handles the blog, comments, the contact form and a few endpoints.
Three parts I would like opinions on.
Migrations run on request. Anything that touches the database includes db.php, which calls the migrator. A file in the temp directory stores how many migration files existed at the last good run. In the common case that is one file read and no query. When the count changes, the runner applies pending files in order and records each name. If one fails, the runner deletes the file and throws; the caller logs it and lets the request carry on, so the next request tries again.
That file is a skip check, not a lock. Two cold requests can both see a changed count and both start migrating. Most migrations use IF NOT EXISTS, so a second pass does nothing.…