Что касается примера Джонатана Сэмпсона для Linux, обратите внимание, когда вы делаете intval для результата функции du, если размер> 2 ГБ, он будет продолжать отображать 2 ГБ.
Заменить:
$totalSize = intval(fgets($io, 80));
по:
strtok(fgets($io, 80), " ");
предполагается, что ваша функция "du" возвращает размер, разделенный пробелом, за которым следует имя каталога / файла.