В PHP есть единственная функция – mkdir(), которая позволяет создавать на сервере сайта директории, которые порой так необходимы в хозяйстве. Например, при создании нового материала вам необходимо создать под него папку, куда опять же средствами вашей CMS вы будете заливать все необходимые файлы.
Пример:
mkdir("/path/to/my/dir", 0700);
Т.е. в определенной директории мы создаем новую папку и например задаем ей режим mode 0700, например для того, чтобы в папку можно было записывать файлы режим mode меняем на 0777.
Но вот тут то и возникает проблема с mkdir(). При выполнении этого php скрипта при включенной функции сервера safe_mode происходит проверка владельца (UID) и если не совпадает владелец скрипта и папки, то возможно вы не сможете, например, записать файл в созданную директорию, удалить файл в ней или, например через FTP у вас не получится удалить саму папку.
Но есть более изящное решение этой проблемы, без необходимости просить хостера отключать вам функцию safe_mode (данная функция включена абсолютно на всех хостингах по умолчанию, с целью обеспечения безопасности). В основе своей платные хостинги предоставляют и доступ к ftp, именно от этого мы и будем отталкиваться.
$conn_ftp = @ftp_connect('your_ftp_server', 21, 5);
Первая переменная в функции это адрес вашего ftp сервера, вторая порт, по которому вы соединяетесь с ftp и последняя это допустимый таймаут соединения. Немного о таймауте, он необходим для последующих сетевых операций, если его не вводить, то ставится значение по умолчанию, равное 90 секундам. После соединения мы проверяем прошло ли оно успешно и отправляем логин и пароль:
if($conn_ftp) // соединение прошло успешно
{
$login_result = @ftp_login($conn_ftp, 'user', 'pass'); // вводим свои логин и пароль для FTP
if($login_result) // проверка логина и пароля прошла успешно
{
ftp_pasv ($conn_ftp, TRUE);
}
}
После проверки логина и пароля нам необходимо определиться с пассивным режимом и выставить ему значения TRUE или FALSE - это необходимо если дальнейшие функции FTP будут работать неправильно. Теперь после определения пассивного режима мы можем создавать наши папки, я опишу все функции которые могут пригодиться вам в дальнейшем:
$file = ftp_mkdir ($conn_ftp, 'public_html/materials/345');
//Создание директории 345 в папке materials, если папки materials не существует,
//то она так же будет создана, так же и с папкой public_html (данная директория
//указана для того, чтобы вы видели весь путь, а так это просто папка с сайтом)
ftp_chdir ($conn_ftp, 'public_html/materials');
//Если у вас точно есть папка materials, то вам не обязательно прописывать весь
//путь, можно просто сначала в нее перейти и потом в ней создать папку 345 используя
//следующий код ftp_mkdir ($conn_ftp, '345')
ftp_chmod($conn_ftp, 0777, $file);
//Все папки по умолчанию создаются с режимом mode 0755, данная команда позволит сменить
//его на 0777, что позволит вам заносить файлы в созданную папку.
Теперь приведу полный пример рабочего кода, чтобы вы увидели как все это выглядит, например у меня:
$dir_name = time(); //Здесь я создаю имя папки по времени запуска скрипта
$conn_ftp = @ftp_connect('your_ftp_server', 21, 5);
if($conn_ftp) // соединение прошло успешно
{
$login_result = @ftp_login($conn_ftp, 'user', 'pass'); // вводим свои логин и пароль для FTP
if($login_result) // проверка логина и пароля прошла успешно
{
ftp_pasv ($conn_ftp, TRUE);
ftp_chdir ($conn_ftp, 'public_html/materials');
ftp_mkdir ($conn_ftp, $dir_name);
ftp_chmod($conn_ftp, 0777, $dir_name);
}
}
Стоит еще сказать немного об указании директорий при создании, если вы укажете в начале слэш, то папка будет создаваться относительно корня ftp. При подключении к серверу FTP вы всегда подключаетесь к корню, поэтому учтите этот момент.