Из-за буферизации данные не отправлялись до установки cookie. А теперь данных больше, PHP отправляет их до момента выполнения setcookie.
Кто не верит, что такое возможно, выполните скрипт:
Hello world!
<?php setcookie('test', 'test') ?>
У меня этот код работает, cookie устанавливаются (никаких notice).
Теперь такой вариант:
<?php for ($i = 1; $i < 500; ++$i) echo 'Hello world!
'; ?>
<?php setcookie('test', 'test') ?>
Получаю:
Warning: Cannot modify header information - headers already sent
В любом случае, все заголовки должны быть отправлены до данных, и надеяться на стандартный буфер нельзя. Используйте ob_start.