file_exists("/"): (из апача)!= (из шела). баг?

bosh

Новичок
file_exists("/"): (из апача)!= (из шела). баг?

Решил поставить себе на хостинг wact дабы поковырять. Просидев полдня - локализовал проблему:

Есть простой скриптик:
<?php if (file_exists("/"))echo "true"; else echo "false"; ?>
И два варианта его исполнения:
1 - из шела (php test.php)
2 - по хттп (http://somehost.ru/test.php)

1-й сервер:
PHP Version 4.4.0
Server API :Apache 2.0 Handler
Apache Version Apache/2.0.55
результаты работа скрипта

- оба true


2-й сервер.
PHP Version 5.0.4-310
Server API : Apache 2.0 Handler
Apache Version Apache/2.0.54 (Unix) mod_fastcgi/2.4.2 PHP/5.0.4-310
результаты работа скрипта

из консоли - true
из апача - false


Safe mode - везде Off.

На что ещё грешить - не знаю.

Это какой-то хитрый баг или какая-то хитрая настройка, никто не знает?
 

bkonst

.. хочется странного?...
Re: file_exists("/"): (из апача)!= (из шела). баг?

Может быть, странные права доступа на корневой каталог, или Apache запускается из-под чего-то вроде chroot?
 

bosh

Новичок
Господа, я немного знаком с пхп (больше 3 лет сижу). И немного знаю разницу между абсолютными и относительными путями.
Так что ссылками на FAQ меня не спасти.

Это очень _локализованая_ проблема.

Прокопав хренову гору кода я вычленил что дело именно в этом. Если хотите, могу привести саму функцию, из ядра WACT'а которая не работает именно из-за этой проблемы. И в неё, что интересно, передается абсолютный путь:
PHP:
function EnsureDirectoryExists($dirname) {
	$open_basedir = ini_get('open_basedir');
	if($open_basedir && substr($dirname, 0, strlen($open_basedir)) == $open_basedir){
		$path = $open_basedir;
		$dirname = substr($dirname, strlen($open_basedir));
	} else {
		$path = '';
	}
	foreach (explode('/', $dirname) as $dir) {
		$path  .= $dir . '/';
		if (!file_exists($path)) {
			if (!@mkdir($path, 0777)) {
				
                RaiseError('compiler', 'CANNOTCREATEDIRECTORY', array(
                    'path' => $path));
                    
			}
		}
	}
}
Об архитектурной красоте решения рассуждать не будем. Фишка в том что на одном хостинге всё ок, на другом - вызов
RaiseError со всеми последствиями.

Я хотел бы понять причину, что бы настроить вакт не правя его код, если удастся.
 

Роберт

Аналитик
Я думаю что из апача у тебя просто недоступен корневой каталог (как и при save mode). Может у тебя в виртуальных хостах что-то прописано или ещё где... А когда ты запускаешь php из командной строки - там уже нету никаких ограничений (кроме тех которые у тебя в php.ini) - по этому ты и получаешь доступ к корневому каталогу...
 

malinov_ru

Новичок
Из шелла скрипт запускается относительно той папки, в который ты сейчас находишься...
Выход тебе уже написали: "Используй абсолютные пути и не парься." (с)
 

_RVK_

Новичок
Слишком разные конфигурации, что бы о чем-то говорить. Выход - отладка, с постепенным приведением одной конфигурации к другой. Так же стоит попробовать работу с функциями is_file и is_dir. Проверить права... ну и т.д.
 

si

Administrator
malinov_ru
SiMM
по вашему / - это относительный путь ?
 

SiMM

Новичок
Абсолютный. В любом случае в конечном итоге ему этот путь (корень) не нужен.
 

si

Administrator
/ - тоже директория

[si@dbs] /home/sitnikov>php -n -r 'var_dump(is_dir("/"));' 2>/dev/null
bool(true)
[si@dbs] /home/sitnikov>php -n -r 'var_dump(file_exists("/"));' 2>/dev/null
bool(true)
[si@dbs] /home/sitnikov>file /
/: directory
 

SiMM

Новичок
> / - тоже директория
А никто с этим и не спорит. Просто нормальный хостер доступ туда не даст кому попало.
 

si

Administrator
SiMM
А никто с этим и не спорит. Просто нормальный хостер доступ туда не даст кому попало.
понятно что там создавать он не сможет, но это не обьясняет сути проблемы автора топика.
 

Роберт

Аналитик
Зачем вы переводите вопрос в другую плоскость?
Какая разница - нужен ему в конечном итоге корень или нет?
Какая разница - почему хостер дал ему туда доступ через шел?
Там просто в настройках апача где-то стоит что-то типа:
php_admin_value doc_root /home/user/htdocs
php_admin_value open_basedir /home/user/htdocs
вот он через апач и не может добраться до корня , а через шел без ограничений...
 
Сверху