Вы проверяли возвращаемое значение из распакованного файла? Сообщения об ошибках не выдаются в стандартном потоке вывода, поэтому массив будет пустым, если что-то произойдет.
<?php
$result = array();
exec("unzip archiv.zip", $result, $returnval);
print_r($result);
print_r($returnval);
?>
Распаковка работает как положено? Может потребоваться перезапись и т. Д., Если файлы уже существуют, и остановить рабочий процесс. Этот вывод не будет записан в результате.