Как сделать выполнение php кода, когда пользователь закрыл вкладку?
На JS ловить window.blur или window.unload (точно не помню), по этому событию слать в API запрос, по запросу выполнять нужное действие. Можно пойти от противного: слать hearbeat запросы раз в 30 секунд, если пропустили - значит, вкладка закрыта или интернета нет, соответственно, выполняем функцию.
Посылать запросы на unload/beforeunload события, как рекомендует Алексей Николаев - не очень хорошая идея
Асинхронный запрос будет оборван в произвольное время, и может не дойти до сервера. Синхронный - заблокирует вкладку и создаст неприятный пользовательский опыт.

Специально для таких случаев есть navigator.sendBeackon, который работает асинхронно, но не обрывается при закрытии вкладки (даже если сервер будет держать запрос пол часа - будет работать все ок, я проверял)
Правда если нужна поддержка IE или старых сафари (iOS10 и старее), то все же придется вернутся к синхронным запросам для этих браузеров