По коду у вас открытие страницы делает браузер с помощью javascript.
Что бы ссылка скачивалась а не открывалась в браузере (исключение, специально настроенные в браузере типы файлов, например pdf по умолчанию в браузерах открывается, но это настраивается), то сервер при формировании ответа по этой ссылке в headers задать два заголовка Content-Type и Content-Disposition: attachment
header('Content-Type: application/xml');
header('Content-Disposition: attachment; filename=filename.xml');
в данном случае тип данных application/xml а имя файла filename.xml (оно будет предложено в диалоге сохранения)
Повторю, эти заголовки должны быть отданы сервером по ссылке (в твоем случае это $linkFile) и если то не ваш сервер то у вас мало вариантов, кроме как проксировать их через себя.
p.s. есть еще вариант, он подходит если файлы по ссылке не большие (влезают в оперативную память у клиента) и главное удаленный веб сервер не запрещает кросс запросы CORS то можно загрузить файл на javascript и отдать его как blob
fetch('https://example.com/test.xml')
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'test.xml';
a.click();
URL.revokeObjectURL(url);
});
кстати если файл в том же домене, то можно просто создать тег с атрибутом download, не используя blob
Вроде бы больше нет никаких способов, либо content-disposition либо формировать blob и тег a с атрибутом download