1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/reference/session/upload-progress.xml
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

146 lines
7.2 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 184f3f7bd45643cb80f828d0bb001991ec3a5fad Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="session.upload-progress" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Отслеживание прогресса загрузки файлов с помощью сессий</title>
<para>
PHP может отслеживать прогресс загрузки отдельных файлов при
включённой опции
<link linkend="ini.session.upload-progress.enabled">session.upload_progress.enabled</link>.
Данная информация не особенно полезна для запроса, непосредственно
закачивающего файл, однако, в течение данной загрузки приложение
может посылать POST-запросы на отдельную страницу (например,
с помощью <acronym>XHR</acronym>) для проверки статуса.
</para>
<para>
Прогресс закачки будет доступен в суперглобальной переменной
<varname>$_SESSION</varname> во время выполнения загрузки, а также при
отправке POST-запросом переменной с именем, равным значению опции
<link linkend="ini.session.upload-progress.name">session.upload_progress.name</link>.
Как только PHP обнаружит такой POST-запрос, он создаст массив
в <varname>$_SESSION</varname>, ключом которого будет конкатенация
значений опций
<link linkend="ini.session.upload-progress.prefix">session.upload_progress.prefix</link>
и
<link linkend="ini.session.upload-progress.name">session.upload_progress.name</link>.
Ключ обычно можно получить прочитав эти опции, то есть:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
var_dump($_SESSION[$key]);
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Также возможно <emphasis>отменить</emphasis> загружаемый в данный момент файл,
установив ключ <literal>$_SESSION[$key]["cancel_upload"]</literal> в значение &true;.
При загрузке нескольких файлов за один раз, это действие отменит
только текущий загружаемый файл и все следующие за ним, но не удалит
уже успешно загруженные к этому времени файлы.
Если закачка была отменена этим способом, то элемент с ключом
<literal>error</literal> в массиве <varname>$_FILES</varname>
будет установлен в <constant>UPLOAD_ERR_EXTENSION</constant>.
</para>
<para>
Опции <link linkend="ini.session.upload-progress.freq">session.upload_progress.freq</link>
и <link linkend="ini.session.upload-progress.min-freq">session.upload_progress.min_freq</link>
контролируют частоту обновления информации о прогрессе загрузки.
При разумных значениях этих двух настроек, накладные расходы данной
функции практически неощутимы.
</para>
<para>
<example>
<title>Пример</title>
<para>
Пример структуры массива прогресса загрузки.
</para>
<programlisting role="html" xml:id="session.upload-progress.example-form">
<![CDATA[
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
<input type="file" name="file1" />
<input type="file" name="file2" />
<input type="submit" />
</form>
]]>
</programlisting>
<para>
Данные в сессии будут выглядеть примерно так:
</para>
<programlisting role="php" xml:id="session.upload-progress.example-array">
<![CDATA[
<?php
$_SESSION["upload_progress_123"] = array(
"start_time" => 1234567890, // Время начала запроса
"content_length" => 57343257, // Длина содержимого POST
"bytes_processed" => 453489, // Количество полученных и обработанных байт
"done" => false, // true при завершении обработки POST, успешно или нет
"files" => array(
0 => array(
"field_name" => "file1", // Имя поля <input/>
// Следующие 3 элемента аналогичны соответствующим элементам массива $_FILES
"name" => "foo.avi",
"tmp_name" => "/tmp/phpxxxxxx",
"error" => 0,
"done" => true, // True, если обработчик POST закончил обработку данного файла
"start_time" => 1234567890, // Время начала обработки этого файла
"bytes_processed" => 57343250, // Число полученных и обработанных байт этого файла
),
// И ещё один файл, загрузка которого ещё не закончена в том же запросе
1 => array(
"field_name" => "file2",
"name" => "bar.avi",
"tmp_name" => NULL,
"error" => 0,
"done" => false,
"start_time" => 1234567899,
"bytes_processed" => 54554,
),
)
);
]]>
</programlisting>
</example>
</para>
<warning>
<para>
Для успешной работы данной функции необходимо отключить буферизацию запроса веб-сервером.
Иначе PHP увидит загрузку файла только когда загрузка полностью завершится.
Серверы, такие как например Nginx, буферизуют большие запросы.
</para>
</warning>
<caution>
<para>
Информация о прогрессе загрузки записывается в сессию до того, как будет
запущен какой либо скрипт. Поэтому изменение имени сессии с помощью
<function>ini_set</function> или <function>session_name</function> выдаст
сессию без информации о прогрессе загрузки.
</para>
</caution>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->