Всем привет. Работая над проектом, столкнулся с проблемой, которая без вмешательства знающих людей, пока не решается.
Вопрос заключается в том, что через скрипт я не могу получить, хотя бы список каталогов и файлов на сетевом диске в локальной сети. Глобально, задача стоит такая: - нужно взять из одной таблицы текст, а из другой таблицы соответствующее приложение этому тексту, "запихнуть" это все в один файл и положить в папку на удаленном компьютере, откуда скрипт (тоже на PHP) должен разобраться "что к чему" и рассовать по соответствующим таблицам в такую же БД, но уже на другой машине. Задачу я разбил на части, и для начала я решил, что будет удобнее понять, каким образом я могу залезть из скрипта на сетевой диск в локальной сети на удаленном компе. Я нашел в мануале раздел, "Функции для работы с каталогами" и следуя интуиции попробовал получить список файлов и папок в директории (код из примера).
$d = dir("file://13.73.2.1/d$");
echo "Дескриптор: " . $d->handle . "\n";
echo "Путь: " . $d->path . "\n";
while (false !== ($entry = $d->read())) {
echo $entry."\n";
}
$d->close();
На что мне в браузере был ответ что-то наподобие:
dir() remote file host access not supported
Не стал разбираться с этим, я решил попробовать пример из книги, которая была у меня под рукой, где говорилось что функция file_get_contents() также решает схожие проблемы и я попробовал ее в действии, только теперь я указал протокол не file://, а ftp://. Я написал следующее:
file_get_contents("ftp://13.73.2.1/d$");
Зачем я написал ftp:// тут? на тот момент, я еще не понял, что для такой записи должен быть настроен FTP-сервер.
ответ был приблизительно таков
failed to open stream.... operation failed и еще было написано, permission denied
Из чего я сделал вывод, что у моего скрипта, нет прав вылезти в сеть. Забыл сказать, что все это происходит на сервере Windows 2008R2 + IIS7 + php7.1. Порылся и нашел, что все сайты в IIS запускаются под специально созданным пользователем IUSR (как-то так зовется). И что не все из под него можно запустить. В настройках Авторизации Диспетчера сервера IIS я поставил своего текущего пользователя(в "анонимной авторизации пользователя") и на всякий случай в Пуле приложений, для своего пула Classic.NET AppPool v.4 в дополнительных настройках, проставил тоже запуск от имени пользователя. Далее проверил от какого пользователя, теперь идет запрос. get_current_user();
Получив положительный результат, подумал, что сейчас все заработает... но увы, так и не заработало. Далее я попробовал напрямую в браузере прописать адрес сетевого диска, предположив, что я вообще из этой среды не получаю доступа. Написал так: \\dnsname\d$. В браузере мне все показал как надо, при этом в начало записи подставив протокол file://. Но почему-то такой же фокус из скрипта не проходит. Что еще пробовал:
dir \13.73.2.1\d$ - результат был положительный.На данный момент, дальше этих экспериментов продвинуться не удалось, поэтому и обращаюсь тут за помощью.
Одним из вариантов доступа к файловой системе удаленного сервера будет переложить решение на уровень ОС, а не решать ее средствами пхп. Как в Linux так и windows системах (с ntfs) существует возможность создания символических (впрочем как и жестких) ссылок на директории, в т.ч. и на расположенные на удаленном сервере. Также можно рассмотреть вариант подключения сетевого диска. В общем эта задача больше относится к администрированию, а не программированию.
с помощью команды
mklink /D MySymLink "\\server\path\to\folder"
можно создать символическую ссылку на удаленную директорию. Понадобится также настройка прав на запись в этот сетевой ресурс. Если оба сервера находятся, например, в сети предприятия, то такой вариант вполне приемлем. Иначе, наверное, шарить ресурсы не очень хорошо.
зы: для создания ссылки командную строку запускать следует от имени администратора.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости