Все ленты — последние статьи

Директива safe_mode = on, mkdir и решение проблем создания папок на сервере

Директива safe_mode = on, mkdir и решение проблем создания папок на сервере

В PHP есть единственная функция — mkdir(), которая позволяет создавать на сервере сайта директории, которые порой так необходимы в хозяйстве. Например, при создании нового материала вам необходимо создать под него папку, куда опять же средствами вашей CMS вы будете заливать все необходимые файлы.

Пример:
1 mkdir("/path/to/my/dir", 0700);

 

Т.е. в определенной директории мы создаем новую папку и например задаем ей режим mode 0700, например для того, чтобы в папку можно было записывать файлы режим mode меняем на 0777.

Но вот тут то и возникает проблема с mkdir(). При выполнении этого php скрипта при включенной функции сервера safe_mode происходит проверка владельца (UID) и если не совпадает владелец скрипта и папки, то возможно вы не сможете, например, записать файл в созданную директорию, удалить файл в ней или, например через FTP у вас не получится удалить саму папку.

Но есть более изящное решение этой проблемы, без необходимости просить хостера отключать вам функцию safe_mode (данная функция включена абсолютно на всех хостингах по умолчанию, с целью обеспечения безопасности). В основе своей платные хостинги предоставляют и доступ к ftp, именно от этого мы и будем отталкиваться.
1 $conn_ftp = @ftp_connect('your_ftp_server', 21, 5);

Первая переменная в функции это адрес вашего ftp сервера, вторая порт, по которому вы соединяетесь с ftp и последняя это допустимый таймаут соединения. Немного о таймауте, он необходим для последующих сетевых операций, если его не вводить, то ставится значение по умолчанию, равное 90 секундам. После соединения мы проверяем прошло ли оно успешно и отправляем логин и пароль:
1 if($conn_ftp) // соединение прошло успешно
2 {
3 $login_result = @ftp_login($conn_ftp, 'user', 'pass'); // вводим свои логин и пароль для FTP
4 if($login_result) // проверка логина и пароля прошла успешно
5 {
6 ftp_pasv ($conn_ftp, TRUE);
7 }
8 }

После проверки логина и пароля нам необходимо определиться с пассивным режимом и выставить ему значения TRUE или FALSE — это необходимо если дальнейшие функции FTP будут работать неправильно. Теперь после определения пассивного режима мы можем создавать наши папки, я опишу все функции которые могут пригодиться вам в дальнейшем:
01 $file = ftp_mkdir ($conn_ftp, 'public_html/materials/345');
02 //Создание директории 345 в папке materials, если папки materials не существует,
03 //то она так же будет создана, так же и с папкой public_html (данная директория
04 //указана для того, чтобы вы видели весь путь, а так это просто папка с сайтом)
05
06 ftp_chdir ($conn_ftp, 'public_html/materials');
07 //Если у вас точно есть папка materials, то вам не обязательно прописывать весь
08 //путь, можно просто сначала в нее перейти и потом в ней создать папку 345 используя
09 //следующий код ftp_mkdir ($conn_ftp, '345')
10
11 ftp_chmod($conn_ftp, 0777, $file);
12 //Все папки по умолчанию создаются с режимом mode 0755, данная команда позволит сменить
13 //его на 0777, что позволит вам заносить файлы в созданную папку.

Теперь приведу полный пример рабочего кода, чтобы вы увидели как все это выглядит, например у меня:
01 $dir_name = time(); //Здесь я создаю имя папки по времени запуска скрипта
02 $conn_ftp = @ftp_connect('your_ftp_server', 21, 5);
03 if($conn_ftp) // соединение прошло успешно
04 {
05 $login_result = @ftp_login($conn_ftp, 'user', 'pass'); // вводим свои логин и пароль для FTP
06 if($login_result) // проверка логина и пароля прошла успешно
07 {
08 ftp_pasv ($conn_ftp, TRUE);
09 ftp_chdir ($conn_ftp, 'public_html/materials');
10 ftp_mkdir ($conn_ftp, $dir_name);
11 ftp_chmod($conn_ftp, 0777, $dir_name);
12 }
13 }

Стоит еще сказать немного об указании директорий при создании, если вы укажете в начале слэш, то папка будет создаваться относительно корня ftp. При подключении к серверу FTP вы всегда подключаетесь к корню, поэтому учтите этот момент.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Павлов Александр