mkdir и рекурсивная копия в php

У моей функции возникают проблемы с созданием и копированием содержимого в новый каталог (также я не уверен, что это лучший способ сделать это, поэтому приветствуются альтернативные предложения).

У меня есть 2 сетевых диска, смонтированных через /etc/fstab вот так:

//128.251.108.xxx/Data/Agilent_Data /home/lv_admin/uslonsnas001 cifs cred=/etc/.na02passwd,rw,umask=0000,uid=www-data,gid=webgroup 0 0
//128.251.108.xx/c$/Agilent /home/lv_admin/uslonsapp003 cifs cred=/etc/.na02passwd,rw,umask=0000,uid=www-data,gid=webgroup 0 0

В основном, когда меня просят указать путь к файлу из uslonsapp003, я проверяю, существует ли структура каталогов в uslonsnas001, и создаю рекурсивный каталог, если нет. Затем я копирую содержимое из uslonsapp003 в новую структуру в uslonsnas001. Вот мой код:

$pImagePath = "http://uslonsapp003:8080/boardtests/2011/4/29/12/30/8051/Images/E_1-c274.jpg";
//strip off the path name up to '2011' and take off the image name at the end
    $startpos = strpos( $pImagePath, "/boardtests/" ) + strlen( "/boardtests/" );
    $endpos   = strpos( $pImagePath, "/Images/" );
    $file_dir = substr( $pImagePath, $startpos, ( $endpos - $startpos ) );
    $orig_dir = "/home/lv_admin/uslonsapp003/ITFSS/DataStore/BoardTest/" . $file_dir;
    $new_dir  = "/home/lv_admin/uslonsnas001/BoardTest/" . $file_dir;
    if( !is_dir( $new_dir ) )
        if( !shell_exec("mkdir -p $new_dir") )    return array( "status" => 0, "errordesc" => "failed to make dir: '" . $new_dir . "'" );
    if( !shell_exec("cp -r $orig_dir $new_dir") ) return array( "status" => 0, "errordesc" => "failed to copy from: '" . $orig_dir . "' to: '" . $new_dir . "'" );
    return array( "status" => 1 );

Я получаю обе ошибки: "не удалось создать каталог..." и "не удалось скопировать из..."

Это выполняется через Apache, я предполагаю, что это проблема с разрешениями, но это только моя «догадка». Пожалуйста помоги!

Я пытался добавить sudo в начало shell_exec(), но это все равно не работает.

ОБНОВЛЕНО1

Я понял, что mkdir дал сбой, потому что, когда я создал каталог /home/lv_admin/uslonsnas001, я не изменил в нем мод, владельца и группу на тот, который будет его использовать (www-data). Выполнение следующих исправлений этой части:

$ sudo chmod 775 ~/uslonsnas001
$ sudo chown www-data ~/uslonsnas001
$ sudo chgrp webgroup ~/uslonsnas001

Но у меня все еще есть проблемы с командой копирования, теперь я говорю: «Модуль« ODBC »уже загружен»


person sadmicrowave    schedule 23.06.2011    source источник


Ответы (2)


использовать :

mkdir("path/to/your/directory", 0777, true);

где 0777 — это chmod, а bool true — активировать рекурсивный режим.

person Ben    schedule 23.06.2011
comment
Я получаю ту же ошибку при использовании mkdir(), хотя я не могу сказать, что такое ошибка php. Есть ли имя восстановления после ошибки, вызванной mkdir(), которое я могу распечатать? - person sadmicrowave; 23.06.2011
comment
возможно, ваша проблема связана с разрешением корневых каталогов на ваши сетевые диски. Проверьте доступ пользователя к этим корневым каталогам, он может быть создан другим пользователем, кроме root - person Ben; 23.06.2011
comment
проверьте мой OP еще раз, мои строки fstab показывают, что я монтирую его с помощью пользователя www-data. Но в прошлом это не создавало проблем, у меня есть другие программы, которые создают файлы (при условии, что я никогда не создавал каталоги). - person sadmicrowave; 23.06.2011
comment
посмотрите на эту страницу, она может вам помочь - person Ben; 23.06.2011
comment
к сожалению это не помогает. Все, что говорит мне, это то, что мой umask в моей точке монтирования fstab правильный, и я должен иметь возможность писать в монтирование. - person sadmicrowave; 23.06.2011
comment
В итоге я использовал функцию, найденную здесь: codestips.com/php- copy-directory-from-source-to-destination для моей команды копирования. - person sadmicrowave; 24.06.2011
comment
Модуль «ODBC» уже загружен, связан с файлом conf, попробуйте прокомментировать его где-нибудь - person Ben; 24.06.2011

К сожалению, проблема была проста. Моя исходная точка монтирования не была настроена с разрешениями на запись для root. После смены владельца точки монтирования и группы на root все работает.

person sadmicrowave    schedule 17.08.2011