Диалог выбора файла php

Обновлено: 04.07.2024

В этой статье я расскажу об основах загрузки файлов в PHP. Во-первых, мы рассмотрим параметры конфигурации PHP, которые должны быть установлены для успешной загрузки файлов. После этого мы разработаем реальный пример загрузки файла.

Настройка параметров PHP

Существует несколько настроек конфигурации PHP, которые вам следует предварительно проверить для успешной загрузки файлов. В этом разделе мы рассмотрим все параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.

Если вы не знаете, где найти файл php.ini, вы можете использовать php_ini_loaded_file() , чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его из браузера.

Вот выдержка из установочного файла с некоторыми полезными значениями по умолчанию.

Ключевые настройки

file_uploads

Значение директивы file_uploads должно быть установлено на On , чтобы разрешить загрузку файлов. Значение по умолчанию для этой директивы - On .

upload_max_filesize

upload_tmp_dir

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

post_max_size

Директива post_max_size позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью POST-запросов, это значение должно быть больше, чем указано в директиве upload_max_filesize . Например, если ваш upload_max_filesize составляет 16M (16 мегабайт), вам может потребоваться установить post_max_size в 20M .

max_file_uploads

Это позволяет вам установить максимальное количество файлов, которые могут быть загружены за раз. По умолчанию 20 , разумное количество.

max_input_time

Это максимальное количество секунд, которое скрипту разрешено анализировать входные данные. Вы должны установить его на разумное значение, если вы имеете дело с большими загрузками файлов. 60 (60 секунд) является хорошим показателем для большинства приложений.

memory_limit

Директива memory_limit указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам необходимо убедиться, что значение этой директивы больше, чем указано в директиве post_max_size . Значение по умолчанию - 128M (128 мегабайт), поэтому, если у вас нет очень больших post_max_size и upload_max_filesize , вам не нужно беспокоиться об этом.

max_execution_time

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

Теперь давайте построим реальный пример, чтобы продемонстрировать загрузку файлов в PHP.

Создание формы HTML

После того, как вы настроили параметры PHP, вы готовы испытать возможности загрузки файлов PHP.

В нашем репозитории GitHub есть пример кода, который я собираюсь обсудить в этой статье. Итак, если вы хотите следовать ему, загрузите его из GitHub.

Мы собираемся создать два файла PHP: index.php и upload.php. Файл index.php содержит код, который отвечает за отображение формы загрузки файла. С другой стороны, файл upload.php отвечает за загрузку файла на сервер.

Кроме того, файл будет загружен в каталог uploaded_files, поэтому вам нужно убедиться, что эта папка существует и доступна для записи пользователем web-server .

В этом разделе мы рассмотрим ключевые части файла index.php.

Давайте посмотрим на файл index.php на GitHub:

Хотя это может показаться типичной формой PHP, существует важное различие в значении атрибута enctype тега <form> . Он должен быть установлен в multipart/form-data , так как форма содержит поле файла.

Атрибут enctype указывает тип кодировки, который должен использоваться при отправке формы, и он принимает одно из следующих трех значений:

  • application/x-www-form-urlencoded : Это значение по умолчанию, когда вы не устанавливаете значение атрибута enctype явно. В этом случае символы кодируются перед отправкой на сервер. Если у вас нет поля файла в вашей форме, вы должны использовать это значение для атрибута enctype .
  • multipart/form-data : Когда вы используете значение multipart/form-data для атрибута enctype , оно позволяет загружать файлы с использованием метода POST. Кроме того, он гарантирует, что символы не кодируются при отправке формы.
  • text/plain : Обычно это не используется. С помощью этой настройки данные отправляются без кодирования.

Затем мы выводим поле файла, которое позволяет вам выбрать файл с вашего компьютера.

Итак, это был файл index.php. В следующем разделе мы рассмотрим, как обрабатывать загруженный файл на стороне сервера.

Логика загрузки

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

Загрузите код из файла upload.php на GitHub. Мы рассмотрим важные части этого файла.

В файле upload.php мы проверили, действительно ли это валидный запрос POST.

В PHP, когда файл загружается, суперглобальная переменная $_FILES заполняется всей информацией о загруженном файле. Она инициализируется как массив и может содержать следующую информацию для успешной загрузки файла.

После проверки запроса POST мы проверяем, что загрузка файла прошла успешно.

Вы можете видеть, что переменная $_FILES является многомерным массивом, первый элемент - это имя поля файла, а второй элемент содержит информацию о загруженном файле, как мы уже говорили выше.

Если загрузка файла прошла успешно, мы инициализируем несколько переменных с информацией о загруженном файле.

В приведенном выше коде мы также выяснили расширение загруженного файла и сохранили его в переменной $fileExtension .

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

Важно, чтобы вы ограничивали тип файла, который может быть загружен на определенные расширения, и не разрешали все. Мы это сделали, проверив расширение загруженного файла с помощью набора расширений, который мы хотим разрешить для загрузки.

Наконец, мы используем функцию move_uploaded_file для перемещения загруженного файла в определенное место по нашему выбору.

Функция move_uploaded_file принимает два аргумента. Первым аргументом является имя файла загруженного файла, а второй аргумент - путь назначения, в который вы хотите переместить файл.

Как это все работает вместе

Не забудьте создать каталог uploaded_files и сделать его доступным для записи пользователем web-server. Затем перейдите и запустите файл index.php, который должен отобразить форму загрузки файла, которая выглядит так:

Indexphp File Output
Indexphp File Output
Indexphp File Output

Заключение

Сегодня мы обсудили основы загрузки файлов на PHP. В первой половине статьи мы рассмотрели различные параметры конфигурации, которые должны быть установлены для загрузки файлов на работу. Затем мы рассмотрели реальный пример, который продемонстрировал, как загрузка файлов работает на PHP.

Надеюсь, вам понравилась эта статья, и вы можете свободно размещать свои вопросы и предложения ниже!

Сегодня я хочу рассказать вам о разнообразных ситуациях, в которых требуется загрузка файлов на сайт с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .


Простая загрузка файлов на сайт при помощи PHP

Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:

Создайте простую HTML-форму : потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php :

Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload , форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php :

Важно: не забудьте добавить enctype=”multipart/form-data” в тег <form> .

Простая загрузка файлов на сайт при помощи PHP

Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES . То есть, используя $_FILES , можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP :

Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php .

Ниже приведена полная версия PHP move uploaded file примера :

Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP .

Вопрос: Почему приведенный выше скрипт небезопасен?
Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “ живом ” сервере, то любой хакер сможет загрузить собственные PHP-скрипты , и взломать ваш сайт и сервер.

Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.

Что такое $_FILES?

То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:

То есть, для каждого поля <input type=”file” name=”inputfile“/> в массиве создается элемент. Если вы создадите <input type=”file” name=”test”>, то название элемента также будет изменено на test . Например:

Теперь для каждого input file , перемещаемого с помощью move uploaded file PHP , создается пять элементов ( name , type , tmp_name , error , size ). Давайте познакомимся с этими элементами поближе:

  1. name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt ;
  2. type: тип загруженного файла или mime-type , если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg . Если загрузить текст, то элемент получит значение text/plain . Для разных типов файлов разным будет и mime-type . Ниже приведены самые распространенные mime-типы :
  • JPEG: image/jpeg ;
  • PNG: image/png ;
  • Текст: text/plain ;
  • Word: application/msword .
  • tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir , указанной в файле php.ini .
  • error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе загрузки. Например, когда размер файла превышает максимальный или когда не был указан файл для загрузки. Для любой возникшей ошибки имеется числовое значение и константа. Ниже приведен полный список ошибок, которые могут возникнуть в PHP move uploaded file примере :
  • UPLOAD_ERR_OK (значение 0) . Означает, что файл был успешно загружен без ошибок;
  • UPLOAD_ERR_INI_SIZE (значение 1) . Размер файла превышает указанный в переменной upload_max_filesize в файле php.ini ;
  • UPLOAD_ERR_FORM_SIZE (значение 2) . Размер файла превышает установленное в переменной формы MAX_FILE_SIZE значение;
  • UPLOAD_ERR_PARTIAL (значение 3) . Файл загружен не полностью;
  • UPLOAD_ERR_NO_FILE (значение 4) . Отсутствует файл для загрузки;
  • UPLOAD_ERR_NO_TMP_DIR (значение 6) . Указанной директории для временного хранения не существует;
  • UPLOAD_ERR_CANT_WRITE (значение 7) . Невозможно записать файл на диск.
  • size: размер загруженного файла в байтах.

Что такое move_uploaded_file?

Если файл был успешно перемещен, то вы получите ответ true или false . В первом примере мы использовали следующую строку кода:

А теперь давайте сделаем красиво, и выведем информацию:

Изменяем лимит размера загружаемого файла

У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:

Если нужно сильно увеличить filesize , то не забудьте изменить время исполнения php-скриптов .

Как обезопасить PHP-скрипт загрузки файлов

Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.

В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini . Ниже приведена улучшенная версия скрипта:

Мультизагрузка файлов при помощи PHP-скрипта

Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP . Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта

  1. Используя разные имена Input .
  2. Используя одно и то же имя input, но с привлечением массива.

1. Используя разные имена Input:

Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:

$_FILES представит массив следующего содержания:

Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки ( изображение ), а другой – для загрузки резюме ( файла в формате .doc ):

2. Используем одно поле input, но с применением массива:

Как и в случае с другими типами input , для move uploaded file PHP мы можем использовать массив с input type , указанным в php . То есть:

То есть, для приведенного выше HTML , $_FILES предоставит данные со следующей структурой:

Дайте знать, что вы думаете по этой теме статьи в комментариях. Мы очень благодарим вас за ваши комментарии, дизлайки, подписки, лайки, отклики!

Пожалуйста, оставьте свои отзывы по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, дизлайки, отклики, подписки, лайки!


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

А ещё @support запланировал немного изменить диалог выбора файла:

Есть несколько причин, почему @support сделал кастомную реализацию выбора файла:

В следующей версии интерфейс можно будет запускать только на том же пк, где находится бот. Но потом его можно будет запускать отдельно, на любом устройстве, в том числе и на мобильном.
Именно для этого был сделан свой диалог открытия файла, чтобы использовать файл на сервере, где работает БАС, а не там, где запущен интерфейс.
БАС и дальше будет развиваться в этом направлении, будут еще несколько компонентов, которые работают в браузере отдельно от софта, например, планировщик, управление фермой.

По этому единственный способ передать содержимое файла в скрипт через стандартный диалог выбора файла, это прочитать файл в веб интерфейсе через File API и перенести содержимое в ресурс с типом "строка". Вариант с передачей содержимого файла через глобальную переменную или базу я расскажу в следующий раз.

0_1560630005338_b09d7bad-61f0-48c4-bf26-8225997abb64-изображение.jpg

Для начала создадим проект и добавим в него ресурс file с типом "строка"

0_1560630223096_9f6c6f0a-bddc-4754-a200-acae4400c989-изображение.jpg

выгрузим проект на сервер bablosoft и сгенерируем интерфейс скрипту:

Далее надо создать простой input для выбора файла в любом удобном для вас месте:

0_1560630997962_a77c9a05-2283-4fc2-8504-56cdc565a3d2-изображение.jpg

чтобы пользователь не изменял содержимое файла в строке, спрячем элемент с ресурсом:

Затем находим строку /////Events в окне Javascript и создаём обработчик события с чтением файла в переменную:

следом находим функцию GetResourceValue, она идёт тремя строками ниже, и добавляем в неё условие для ресурса file

0_1560634186885_87972735-5640-4bf2-a99a-8fba16f820da-изображение.jpg

0_1560632750716_69444a51-f23e-4f9f-b719-b444c260f59b-изображение.jpg

В скрипте всего два действия:

Вот так выглядит результат:

Самый простой вариант применения, это в функции OnApplicationStart распарсить строку по переносу строк \r\n в массив и перенести его в локальный ресурс, чтобы в скрипте использовать как обычный ресурс:

0_1560633082806_76499872-6c1b-4df7-8140-845d093a5241-изображение.jpg


Не знаю для чего может понадобится выгрузка нескольких файлов в скрипт через стандартный диалог выбора файла, но для этого надо будет добавить в input атрибут multiple:

В статье рассмотрены вопросы организации загрузки файлов на сервер с помощью PHP, работы с каталогами и файлами на сервере, запуск программ и использование переменных среды. Все это становится актуальным при необходимости решения задач, связанных с изменением Web-содержимого или предоставления дружественного интерфейса пользователю вместо традиционного ftp или scp.

Также мы рассмотрим создание HTML-формы для интерфейса, реализующего функционал загрузки файлов на сервер.

Код HTML-формы

Форма содержит поля для ввода имени файла и дает возможность выбора такого файла из числа доступных на локальной машине.

Для посылки данных используется метод POST. Дескриптор <form> содержит атрибут enctype=”multipart/form-data” для указания серверу, что вместе с простой информацией будет посылаться и файл.

Форма содержит поле, указывающее на размер файла в байтах. Она имеет скрытый тип, изменяемый по желанию пользователя, – это размер файла (он должен быть согласован с сервером, у которого тоже есть подобные настройки – см. php.ini).

Поле ввода типа file обязательно, и задается следующим образом: <input name = “userfile” tipe=”file”>. Само имя может быть любым и должно совпадать с именем принимающего данные на стороне сервера сценария PHP.

Нужно отметить, что процедура загрузки файлов на сервер очень проблематична с точки зрения безопасности и требует тщательного слежения за обновлениями версий PHP, выходом и применением всех патчей.

Загружающий PHP-сценарий

Код сценария, принимающего данные формы, имеет вид:

В приведенной программе имена функций и переменных зависят от версии PHP и настроек конфигурации, в частности, от включения настройки register_globals.

При загрузке файл помещается во временное хранилище для файлов Web-сервера. Если файл не переименовать и не переместить до окончания сценария, то он будет удален. Данные для обработки в сценарии хранятся в суперглобальном массиве $_FILES. Его элементы будут сохранены с именем дескриптора <file> из формы. Так как имя элемента формы имеет вид userfile, то содержимое массива $_FILES будет иметь следующие свойства:

  • значение в $_FILES[‘userfile’][‘tmp_name’] совпадает с хранилищем временных файлов на Web-сервере;
  • значение в $_FILES[‘userfile’][‘name’] представляет собой имя файла в локальной файловой системе пользователя формы;
  • значение в $_FILES[‘userfile’][‘size’] определяет размер файла в байтах;
  • значение в $_FILES[‘userfile’][‘type’] определяет MIME-тип файла – в нашем случае text/plane;
  • значение в $_FILES[‘userfile’][‘error’] определяет код ошибки, которая может возникнуть при загрузке файла.

Теперь есть все данные о том, где находится файл и как он именуется, следовательно, его можно скопировать в более пригодное место, чтобы он не был удален как временный по окончании работы скрипта. При этом удаляются все возможные HTML-дескрипторы и осуществляется перенос файла в рабочий каталог.

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

Сначала проверяется код ошибки, возвращаемый $_FILES[‘userfile’][‘error’]. При этом каждому коду ошибки соответствует своя константа. Перечень возможных констант и соответствующих им кодов ошибок приведен ниже:

  • upload_error_ok = 0 – ошибок не было;
  • upload_err_ini_size = 1 – размер загружаемого файла превышает максимальное значение, заданное в php.ini директивой upload_max_filesize;
  • upload_err_form_size = 2 – размер загруженного файла превышает размер, заданный в HTML-форме;
  • upload_err_partial = 3 – загружена только часть файла;
  • upload_err_no_file = 4 – файл не загружен совсем.

Работа с каталогами

После загрузки файлов на сервер было бы логичным дать пользователю возможность просматривать их содержимое. Для этого необходимо обеспечить вход в каталоги, куда эти файлы загружаются. Эти вопросы решаются программно на уровне соответствующих системных разрешений. Сценарий, обеспечивающий просмотр каталога с загруженными файлами, представлен ниже и представляет собой PHP-скрипт, помещенный внутрь HTML кода:

Здесь применяются функции opendir(), closedir(), readdir(). Opendir() открывает каталог для чтения и возвращает дескриптор каталога так же, как и функция fopen(). После того как каталог открыт, можно прочитать имя файла с помощью специального вызова readdir($dir). Если каталог пустой или имя файла определено как «0», то функция возвратит false. Файлы при их выводе не сортируются, поэтому если нужен отсортированный список файлов каталога, то можно прочитать их имена в массив и отсортировать его перед выводом на экран. После завершения работы с каталогом вызывается функция closedir($dir) для его закрытия.

Возможно применение механизма ограничения доступных для просмотра файлов и каталогов, чтобы пользователь мог видеть только то, что ему позволено. Целесообразно, при необходимости, применение функции rewindirdir($dir), которая перемещает указатель чтения имен файлов в начало каталога.

Вместо перечисленных выше функций можно использовать класс dir, предоставляемый библиотекой классов php. В нем есть свойства handle и path, а также методы read(), close(), rewind(), выполняющие точно такие же действия, как и их простые аналоги.

Если имеется путь к файлу, то возможно получение дополнительных сведений об имени каталога и файла. Функции dirname($path) и basename($path) возвращают те части пути, которые соответственно содержат каталог и файл. Эту информацию можно применять для создания структуры каталогов, основанной на осмысленных именах файлов и каталогов.

Функция disk_free_space($path) может включить в список содержимого каталога индикацию свободного места для загружаемых файлов. При передаче этой функции пути к каталогу, она возвращает количество свободного места в байтах в файловых системах UNIX и Windows.

Работа с каталогами

Кроме простого просмотра каталогов, возможны операции по их созданию и удалению средствами PHP. Для этого применяют функции mkdir() и rmdir(). Заметим, что возможности таких манипуляций с каталогами определены только в тех случаях, когда доступ к ним разрешен пользователю, от лица которого выполняется сценарий.

Функция mkdir() принимает два параметра – путь к требуемому каталогу (включая имя создаваемого каталога) и права доступа, назначаемые для создаваемого каталога. Например, запись вида mkdir(“/tmp/testing”, 0777); – в данном примере задаваемые права на каталог совсем не обязательно будут результирующе такими же. В этом случае значение umask инвертируется и комбинируется с помощью операции AND, что и определит окончательное формирование параметров доступа. Например, если umask равна 022, то права доступа получатся в виде 0755. Для учета и предотвращения этого эффекта перед созданием каталога нужно сбросить текущее значение umask следующим образом:

Здесь задействована функция umask(), которая используется для получения нового значения прав доступа и для сброса имеющегося. Она заменяет текущее значение umask переданным ей параметром и возвращает старое значение при вызове ее без параметров. В системе Windows функция не производит никаких действий.

remove() предназначена для удаления каталога и применяется следующим образом:

В обоих случаях удаляемый каталог должен быть пустым.

Взаимодействие с файловой системой

Помимо функций просмотра и получения информации о каталогах и файлах на Web-сервере и записи информации в них возможно осуществление ряда других операций. Сценарий, реализующий получение дополнительной информации о файлах, имеет вид:

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

В общем случае все команды, выполняемые на сервере, могут быть объединены в четыре способа их реализации.

  1. Функция exec() – ей в качестве аргумента передается командная строка, которую нужно выполнить. Например, exec(“ls –la”); эта функция не имеет непосредственных выходных данных и возвращает последнюю строку результата выполнения команды.
  2. passthru() – передает свои выходные данные в браузер. Используется при выводе изображения в различных форматах. Не возвращает никакого значения.
  3. system() – передает в браузер выходные данные команды. Пытается передать выходные данные каждой строки. Это отличает ее от passthru().
  4. Обратные кавычки – фактически это оператор выполнения команды. Результат выполнения возвращается в виде строки, которую затем можно отобразить в браузере или использовать другим путем.

Если имеют место более сложные запросы, то возможно использование функций popen(), proc_open(), proc_close(), предназначенных для создания внешних процессов и передачи данных по каналам к ним и от них.

Ниже приведен сценарий, содержащий эквивалентные примеры использования всех четырех способов:

Один из этих способов может применяться вместо рассмотренного ранее сценария просмотра каталогов. Данный код не является переносимым и не может исполняться в среде Windows. При этом если в текст команды необходимо включать пользовательские данные, то их сначала нужно пропускать через функцию escapeshellcmd(). Это не даст возможности неавторизованным пользователям преднамеренно или случайно исполнять команды в системе Web-сервера. Можно в этих же целях воспользоваться функцией escapeshellarg() для отмены всех аргументов, которые нужно передать команде оболочки.

Взаимодействие с окружением

В арсенал средств PHP входит и возможность взаимодействия с переменными окружения. В этих целях используются функции getenv() и putenv(). Они позволяют соответственно получить и устанавливать эти переменные для дальнейшего использования. Речь идет о среде переменных Web-сервера, в которой выполняется PHP-сценарий.

Возможно устанавливать требуемые значения переменной среды с помощью putenv(), например:

При необходимости можно ограничить список переменных окружения, которые доступны для переустановки пользователями. Для этого можно воспользоваться директивой safe_mode_allowed_env_vars файла php.ini. При работе PHP в безопасном режиме пользователи могут менять только те переменные окружения, которые префиксно перечислены в этой директиве.

Выводы

В статье мы подробно разобрали вопросы использования PHP для организации загрузки файлов на сервер, работы с каталогами и переменными окружения. Далее мы займемся изучением работы с сетевыми протоколами и других сложных для начинающего разработчика аспектов использования PHP.

Читайте также: