PHP

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

В 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 вы всегда подключаетесь к корню, поэтому учтите этот момент.
Добавлено: 22 Августа 2013 03:25:55 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...