После моего комментария я выспался ночью и понял, что fopen()
может на самом деле не использовать / быть похожим на realpath()
(что предполагает установку всех сегментов, дажете, которые не имеют отношения к окончательному нормализованному пути).
Это не так.
Соответственно, причина, по которой ваш файл открыт, на самом деле довольно проста:
'$docroot/../parts/partsorders.txt'
... который читается как " pastorders.txt в папке 'parts' , которая является папкой, найденной в папке выше папка '$ docroot' в текущем рабочем каталоге "сворачивается в ...
'parts/partsorders.txt'
..., потому чтоfopen()
просто исчезает $docroot/..
, не проверяя, существует ли $docroot
.(Такие функции, как realpath()
, проверьте, что меня отбросило.)
Итак, ваш файл на самом деле в <current working directory>/parts/partsorders.txt
.(Поскольку вы открываете файл с флагом a
, если его там раньше не было, он определенно был создан там.)
Независимо от того, что содержится в вашем $_SERVER['DOCUMENT_ROOT']
, похоже, этоне то, что вы хотите .Кроме того, в некоторых настройках вы не можете разумно ..
выше $_SERVER['DOCUMENT_ROOT']
- разрешения на самом деле не позволят вам.
Если эта переменная среды напрямую не установлена (еслиэто даже возможно, но я думаю, что это демонстрирует проблему, даже если это не так), путь совершенно другой:
"$docroot/../parts/partsorders.txt"
... становится:
"/../parts/partsorders.txt"
... который пытается подняться по иерархии за корневую точку (/
), что, конечно, не сработает.
Я предлагаю вывести или записать $_SERVER['DOCUMENT_ROOT']
и взглянуть на то, что оно на самом деле содержит,и если это то, что вы ожидаете.
То, что может стоить искать, это __DIR__
(или в более старых версиях PHP, dirname(__FILE__)
), который принимает каталог файл .Пока файл знает, где он находится, вы можете просто считывать файлы относительно его местоположения.