2010-10-25 3 views
0

Краткая история:open_basedir не позволит мне писать файл, но каталог кажется правильным?

Я получаю ограничение open_basedir в моем php-скрипте - простой сценарий «сценарий записи нового файла на диск». Мне кажется, что у меня правильные настройки open_basedir, и файл находится в нужном месте - но не повезло, просто одна и та же ошибка каждый раз. Я искал аналогичные проблемы open_basedir на этом сайте, но я не видел таких проблем - где каталог выглядит правильно, но он все еще вызывает ошибки.

Мои догадки относительно того, что проблема:
1) open_basedir не работает так, как я думаю, что это делает
2) Мои настройки неправильны, и я просто не вижу его
3) Это на самом деле что-то еще, например, разрешения на чтение/запись IIS и т. д.
4) ???

Длинная история:

Я работаю на сервере IIS с PHP, и я пытаюсь получить следующий фрагмент кода, чтобы работать (простой тест записи файла):

date_default_timezone_set('America/Chicago'); 
$myFile = 'testfile.txt'; 
$fh = fopen($myFile, 'w') or die("can't open file"); 
$stringData = "Some Text\n"; 
fwrite($fh, $stringData); 
$stringData = "Some More Text\n"; 
fwrite($fh, $stringData); 
fclose($fh); 

Это PHP скрипт находится в каталоге C: \ Inetpub \ Wwwroot \ ВебКаталог \ test_write.php на моем сервере

Вот мои настройки php.ini для open_basedir:
open_basedir = C: \ Inetpub \ Wwwroot; C: \ Inetpub \ wwwroot \ WEBDIRECTORY

Всякий раз, когда я открываю страницу сценария, я ожидаю, что не будет выхода, а затем, когда я вернусь, на сервере появится новый файл. Это то, что я получаю вместо этого:

Предупреждения: FOPEN(): open_basedir ограничения в силе. файла (testfile.txt) не находится в пределах допустимого пути (ы): (C: \ Inetpub \ Wwwroot) в C: \ Inetpub \ Wwwroot \ ВебКаталог \ test_write.php на линии 5 Внимание: FOPEN (testfile.txt): не удалось открыть поток : Операция не допускается в C: \ Inetpub \ Wwwroot \ ВебКаталог \ test_write.php в строке 5 не может открыть файл

Я пробовал много перестановки: первоначально линия open_basedir была только
open_basedir = c: \ inetpub \ wwwroot

... но это не сработало, либо.

Я также попытался ввести абсолютный путь для файла testfile.txt (c: \ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.txt и т. Д.) Вместо имени самого файла, и я продолжаю получать ту же ошибку сообщение.

Любые идеи? Большое спасибо за Вашу помощь.

+0

Вот две статьи, которые могут помочь. Возможно, вы входите в путь. http://bytes.com/topic/php/answers/7819-open_basedir-errors (он находит ответ в нижней части потока). http://www.kavoir.com/2009/06/php-open_basedir-in-phpini-to-limit-php-file-accesses-to-a-certain-directory.html (общее описание open_basedir) – Jim

ответ

1

Хорошо, так жаль тратить время каждого - оказывается, это был параметр сервера, установленный моим системным администратором для меня. (Я новичок в этом, поэтому я объясню в общих чертах, что я понимаю)

Он установил его так, чтобы сервер не разрешил адрес для любых файлов в веб-каталоге, кроме определенных типов, которые вы ожидаете найти на веб-сайте, например .htm, .html, .php, .jpg и т. д. Файл, который я пытался прочитать, был .txt.

Итак, я написал некоторый тестовый код:

$test = realpath('c:\inetpub\wwwroot\WEBDIRECTORY\testfile.php'); 
echo ("test = $test\n"); 
if($test == FALSE){ 
echo ("... is FALSE\n"); 
} 

$test = realpath('c:\inetpub\wwwroot\WEBDIRECTORY\testfile.txt'); 
echo ("test = $test\n"); 
if($test == FALSE){ 
echo ("... is FALSE\n"); 
} 

Который быстро возвращенное это:

тест = C: \ Inetpub \ Wwwroot \ ВебКаталог \ testfile.php
тест = ... есть FALSE

Итак, realpath отказывается возвращать адрес для чего-либо, заканчивающегося на .txt, но более чем счастлив сделать это для файла .php. Это означает, что WHENEVER я вставляю иначе законное (в пределах основанного) имя файла, которое заканчивается незаконным расширением, сервер решает этот адрес не как «C: \ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.txt», а как «». И, конечно, пустая строка не будет находиться в основе, возвращая ошибки ограничения open_basedir.

BIZARRE! Но теперь имеет смысл, что я, наконец, проследил его до источника. Спасибо за все советы! Это помогло мне пройти процесс ликвидации и понять это.

-1

Это проблема с разрешениями. Проверьте разрешения на C: \ inetpub \ wwwroot \ WEBDIRECTORY \ Если требуются специальные разрешения, иногда вам необходимо изменить разрешения для скрипта .PHP, выполняющего запись. Обычно вам нужен как каталог, так и набор сценариев, а не только один или другой.

Вот хороший сценарий из PHP инструкции для открытия файла для записи:

$ имя_файла = «test.txt»; $ somecontent = "Добавьте это в файл \ n";

// Давайте убедитесь, что файл существует и доступен для записи первым. если (is_writable ($ имя_файла)) {

// In our example we're opening $filename in append mode. 
// The file pointer is at the bottom of the file hence 
// that's where $somecontent will go when we fwrite() it. 
if (!$handle = fopen($filename, 'a')) { 
    echo "Cannot open file ($filename)"; 
    exit; 
} 

// Write $somecontent to our opened file. 
if (fwrite($handle, $somecontent) === FALSE) { 
    echo "Cannot write to file ($filename)"; 
    exit; 
} 

echo "Success, wrote ($somecontent) to file ($filename)"; 

fclose($handle); 

} еще { эхо "Файл $ имя_файла не доступен для записи"; }

+0

Эй! Спасибо, я дам вам попытку и дам вам знать, что произойдет! – larsiusprime

+0

Это не так. Разрешения здесь нечего –

+0

Хорошо, получил это обратно, когда я использовал этот файл теста: Предупреждение: is_writable(): действующее ограничение open_basedir. Файл (testfile.txt) не входит в допустимые пути: (c: \ inetpub \ wwwroot) в C: \ inetpub \ wwwroot \ WEBDIRECTORY \ test_write.php в строке 6 Файл testfile.txt не доступен для записи – larsiusprime