Это потому, что вы используете https://github.com/nikic/FastRoute маршрутизатор, и правильный синтаксис будет:
$app->get("/companies[/{search}]", \App\Handler\CompanyPageHandler::class, 'companies');
или будет более строгим и проверяет что-то в параметрах поиска как это:
$app->get("/companies[/{search:[\w\d]+}]", \App\Handler\CompanyPageHandler::class, 'companies');
Лучшая вещь сделать состоит в том, чтобы поместить функцию обертки вокруг mysql_query. В этом, просто проверьте, является ли запрос обновлением или удалением к кэшируемой таблице и синтаксическим анализом ключи, которые изменяются. Это не займет много времени писать, легко протестировать и предотвратит Вас от когда-либо упущения аннулирования кэша снова.
Можно использовать управление оптимистичным параллелизмом, которое включает добавление еще одного столбца к таблице (или метка времени или эквивалентный, или просто простой интервал) и использование его при выполнении обновлений. Вот то, как Вы могли бы использовать его (в случае простого интервала, являющегося "тегом версии"):
update BlogPost set PublishedOn = :publishedOn, VersionTag = VersionTag + 1
where ID = :id and VersionTag = :versionTag
И принятие метки времени обновляется автоматически Вашим DBMS, это - то, как это сделано с метками времени:
update BlogPost set PublishedOn = :publishedOn
where ID = :id and Timestamp = :timestamp
Вы могли добавить код отладки (который отключен во время производства) в Вашем приложении, которое делает две выборки - один от memcached и один от DB, сравнивает их и выдает исключение / пишет ошибка в файл журнала, если они отличаются. Этот путь (с некоторой потерей производительности) можно быстро наблюдать старые данные.
Конечно, это может быть далее усовершенствовано: