Предположим, у нас есть следующий список деревьев:
www _
\_sources_
\ \_dir1
\ \_dir2
\ \_file
\_cache
Я пытаюсь рекурсивно проанализировать каждый файл в «источниках» и скопировать его в папку «кеш», сохраняя иерархию, но в моей функции mkdir () создает файл вместо каталога. Вне функции mkdir () работает правильно. Вот моя функция:
function extract_contents ($path) {
$handle = opendir($path);
while ( false !== ($file = readdir($handle)) ) {
if ( $file !== ".." && $file !== "." ) {
$source_file = $path."/".$file;
$cached_file = "cache/".$source_file;
if ( !file_exists($cached_file) || ( is_file($source_file) && (filemtime($source_file) > filemtime($cached_file)) ) ) {
file_put_contents($cached_file, preg_replace('/<[^>]+>/','',file_get_contents($source_file)) ); }
if ( is_dir($source_file) ) {
# Tried to save umask to set permissions directly – no effect
# $old_umask = umask(0);
mkdir( $cached_file/*,0777*/ );
if ( !is_dir( $cached_file ) ) {
echo "S = ".$source_file."<br/>"."C = ".$cached_file."<br/>"."Cannot create a directory within cache folder.<br/><br/>";
exit;
}
# Setting umask back
# umask($old_umask);
extract_contents ($source_file);
}
}
}
closedir($handle);
}
extract_contents("sources");
PHP отладка не дает мне ничего, кроме
[phpBB Debug] PHP Notice: in file /var/srv/shalala-tralala.com/www/script.php on line 88: mkdir() [function.mkdir]: ???? ??????????
Других строк, содержащих mkdir (), нет.
ls -l cache/sources
выглядит как
-rw-r--r-- 1 apache apache 8 Mar 31 08:46 file
-rw-r--r-- 1 apache apache 0 Mar 31 08:46 dir1
Очевидно, что mkdir () создает каталог, но не устанавливает для него флаг «d». Я просто не могу понять, почему. Итак, в первый раз, может ли кто-нибудь помочь и сказать мне, как установить этот флаг через восьмеричные разрешения с помощью chmod (), пока я не вижу лучшего решения? (Я уже видел man 2 chmod
и man 2 mkdir
, в флаге "d" ничего нет)
дополнение:
Решается изменением второго условия if на
if ( (!file_exists($cached_file) && is_file($source_file)) || ( is_file($source_file) && (filemtime($source_file) > filemtime($cached_file)) ) )