На сервере поднят FTP, есть обычный скрипт, который стучится на свой же FTP, и запрашивает права на файл (is_writable('ftp://user:pass@mysite/httpd')). Бочина в том, что если этот файл запускаешь из консоли (от root-а) эта хрень работает, от апача нет! Добавил пользователей user, ftp, www-data в группы ftp, www-data, один хрен никаких результатов. Обзваонил админов, они тоже в потерях, ведь по сути, реакция должна быть на user:pass а не на пользователя, запустившего скрипт. Может быть у кого есть any ideas?
О блять, Дуд, тебя точно донатить надо, хотя бы за то, что вьехал в проблему :) Ковырялся уже, сука, везде. Cli и apache конфиги одинаковые. Отпишусь чо и как, если победю
вспомнил. Забыл отписатся. Да. Написал врапер. Криво, но исходя из ситуации и таска. обращаюсь теперь так: fopen('ttp://user:pass@host.com'). Там, где ftp работает корректно оставил, так как есть;
Основная проблема это url_stat, которая некорректно отрабатывала, сначала прицепил заглушку, она отдавала всегда 777 (0040777 и 0777), при чём надо было понимать где dir, а где нет, потому как is_dir, использующий эту функцию так же криво работал. В итоге, решил ходить по http, и спрашивать права на удаленном сервере. Права апача, или нжинкса, сервере короче, конечно должнв быть такие же как и у фтп юзера:
function url_stat($path) {
$url = parse_url($path);
$stat_path = 'http://' . $url['host'] . '/fstat/?p=' . $url['path'] ;
$stat = file_get_contents($stat_path);
$stat = unserialize($stat);
return$stat;
/*$stat = @stat(str_replace('ttp://', 'ftp://', $path));
if($stat){
$mode = $stat['mode'];
if($mode == 16804){//dir
$mode = 0040777;
} else {
$mode = 0777;
}
$stat['mode'] = $mode;
return$stat;
} else {
returnfalse;
}
//$perms = fileperms(str_replace('ttp://', 'ftp://', $path));
$mode = 0777; // There are no protections on this, so all writable.
$mode = 0040777; // There are no protections on this, so all writable.
$return = array(
'dev' => 1,
'ino' => 1,
'mode' => $mode,
'nlink' => 0,
'uid' => 0,
'gid' => 0,
'rdev' => 0,
'size' => 0,
'atime' => 0,
'mtime' => 0,
'ctime' => 0,
'blksize' => 0,
'blocks' => 0,
);
return$return;*/
}
камменты оставил, возможно кому пригодятся и на сервере соответственно: