Кажется, проблему решило добавление строчки:
header('Cache-Control: max-age=37739520, public');
перед генерацией заголовка image/png
Javascript — это понятно, что можно всё это сделать, но это во-первых, сложное решение, во-вторых, от него всё будет тормозить ещё сильнее.