Были уже подобные вопросы
Использовать cron, для огранизации запусков. sleep() не подходит, так как останавливает работу полностью всего скрипта. Т.е. как только программа наткнётся на sleep() будет ждать пока заданное время пройдёт, а иные действия станут недоступными. Есть конечно варянт выделить в поток, но тогда может придётся немного мучаться, так как придётся убивать при завершении все активные потоки, так как они не завершатся, пока есть цель.