|
|
|
| Перенося сайты на сервер, я встретился с такой проблемой: очень много папок (сотни папок с поддиректориями) должны иметь права доступа 777. Делать это вручную - долго и утомительно. Хотелось бы сделать служебный скриптик, который бы отыскал ВСЕ папки в корне сайта, и установил бы на них и на вложенные папки права доступа 777.
Как я полагаю, за основу можно было бы взять функцию удаления папок, имеющуюся на этом Форуме, и вместо удаления unlink сделать установление прав chmod($dire, 0777);
// Удаление директории
function DirDelete($dire)
{
if(is_dir($dire))
{
$dir = opendir($dire);
while (false !== ($filename = readdir($dir)))
{
if($filename!='.' && $filename!='..')
{
if(is_file($dire."/".$filename)) unlink($dire."/".$filename);
if(is_dir($dire."/".$filename)) DirDelete($dire."/".$filename);
}
}
closedir($dir);
rmdir($dire);
}
if(is_dir($dire)) echo "Произошли ошибки при удалении директории ".$dire."!";
}
DirDelete("kniga"); // Здесь имя удаляемой директории. Удаляется вместе с папками и файлами!
|
Однако непонятно, как задать имя папки, если работа ведется начиная с корня сайта? | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 10:40)
| |
<?php
foreach (glob($_SERVER['DOCUMENT_ROOT']."*", GLOB_ONLYDIR) as $dir) {chmod($dir, 0777);}
?>
|
Но я бы предпочел по ssh
А... фразу про вложенные я проглядел. Тогда:
<?
function rglob($pattern='*', $flags = 0, $path='')
{
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
$files=glob($path.$pattern, $flags);
foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); }
return $files;
}
foreach (rglob($_SERVER['DOCUMENT_ROOT']."*", GLOB_ONLYDIR) as $dir) {chmod($dir, 0777);}
|
| |
|
|
|
|
|
|
|
для: Loki
(30.12.2008 в 11:13)
| | а оно пройдет, когда php подключен, как модуль apache? | |
|
|
|
|
|
|
|
для: Trianon
(30.12.2008 в 11:15)
| | Зависит от того, как файлы попали на сервер. Если по фтп - скорее всего нет, а если были созданы скриптом, тогда - вполне. | |
|
|
|
|
|
|
|
для: Loki
(30.12.2008 в 11:20)
| | А у меня как раз такая ситуация - php подключен, как модуль apache, и файлы закачены посредством фтп.
Как быть в этом слкчае?
=========
рнр можно и и переподключить на время специально для этой операции. Например сделать PHP как CGI или PHP как FastCGI (хотя я и не знаю, что это такое). | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 12:37)
| | тогда через консоль | |
|
|
|
|
|
|
|
для: Loki
(30.12.2008 в 13:16)
| | А если закачать архив, и затем его разъархивировать скриптом.
Это не поможет делу? | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 10:40)
| | вообще-то это одна команда chmod -R ... | |
|
|
|
|
|
|
|
для: Trianon
(30.12.2008 в 11:13)
| | Оба foreach - инвалиды...
Что бы это значило? | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 13:06)
| | . | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 13:06)
| | Всмысле Warning: Invalid argument supplied for foreach() ?
значит первым параметром foreach оказался не массив, следовательно rglob() как и возможно glob() ничего не вернула.
Если потом в планах есть редактировать файлы вручную через FTP лучше ничего не делать функциями работающими через файловую систему,
или потом будет возможность что-то делать только скриптами (cms вобщем нужна потом).
// если не говорить о ssh
я так думаю | |
|
|
|
|
|
|
|
для: xx77
(30.12.2008 в 14:45)
| | И всё же, как избавить от инвалидности и довести до рабочего состояния вот этот предложенный Loki код:
function rglob($pattern='*', $flags = 0, $path='')
{
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
$files=glob($path.$pattern, $flags);
foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); }
return $files;
}
foreach (rglob($_SERVER['DOCUMENT_ROOT']."*", GLOB_ONLYDIR) as $dir) {chmod($dir, 0777);}
|
| |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 16:41)
| | сделайте другими функциями
<?php
$time=0;
function g_t($bool=false){ //время
global $time;
list($m, $s) = sscanf(microtime(), '%f %u');
if($bool) printf("%.7f", (($m += $s) - $time));
else $time=$m + $s;
}
set_time_limit(0);
ini_set('max_execution_time', 0);
g_t();
function xxxxxx($dir) {
$dh = opendir( $dir );
while($file = readdir($dh)) {
if (is_dir($dir . '/' . $file) && $file{0} != '.') {
echo $file . ' - ';
// if (chmod($dir . '/' . $file, 0777)) echo 'ok';
echo '<br>' ."\n";
xxxxxx($dir . '/' . $file);
}
}
}
xxxxxx('.');
g_t(1);
?>
|
| |
|
|
|
|
|
|
|
для: xx77
(30.12.2008 в 17:22)
| | В исходной формулировке вопроса самой последней строкой я привел выражение
DirDelete("kniga"); // Здесь имя удаляемой директории. Удаляется вместе с папками и файлами!
|
определяющее директорию, с которой начинается обработка.
В моем случае - это корень сайта.
Не могли бы Вы подсказать, как пишется выражение для корня сайта? | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 17:33)
| | из любой дирректории такие функции будут работать если записать полный путь к корню
xxxxxx('/home/site/www');
Возможно и с относительными путями будет работать как xxxxxx('../../../www'); но я-бы так не делал
и ещё масса препятствий может получиться, таких как safe_mode , как выше говорилось является-ли владелец дирректорий тем-же пользователем от имени которого выполняются скрипты, и даже однажды столкнулся с тем что is_dir() не работала уровнями выше скрипта. | |
|
|
|
|
|
|
|
для: Владимир55
(30.12.2008 в 10:40)
| |
Перенося сайты на сервер, я встретился с такой проблемой: очень много папок (сотни
папок с поддиректориями) должны иметь права доступа 777. Делать это вручную - долго и
утомительно. Хотелось бы сделать служебный скриптик, который бы отыскал ВСЕ папки в
корне сайта, и установил бы на них и на вложенные папки права доступа 777.
|
А с помощью какого нибудь клиента не проще? Я беру WinSCP и делаю все права на все вложенные папки и файлы нескольким щелчками мыши. | |
|
|
|
|
|
|
|
для: GeorgeIV
(30.12.2008 в 17:43)
| | "и делаю все права на все вложенные папки и файлы нескольким щелчками мыши."
286 папок, в каждой из которых по 4-10 подддиректорий, в некоторых из которых есть еще по одной поддиректории... Вот и хотелось как по-проще - и на сейчас, и, главное, на будущее. | |
|
|
|