stream_notification_callback

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

stream_notification_callbackИграет роль callback-функции для параметра контекста notification

Описание

stream_notification_callback(
    int $notification_code,
    int $severity,
    ?string $message,
    int $message_code,
    int $bytes_transferred,
    int $bytes_max
): void

Функция с типом callable, которую передают как аргумент для контекстного параметра notification, которая вызывается при наступлении события.

Замечание:

Это не настоящая функция, а только прототип того, как нужно реализовывать функцию.

Список параметров

notification_code

Константа оповещения из семейства STREAM_NOTIFY_*.

severity

Константа оповещения из семейства STREAM_NOTIFY_SEVERITY_*.

message

Параметр передаётся, если у события есть доступ к описательному сообщению.

message_code

Параметр передаётся, если у события есть доступ к описательному коду сообщения.

Смысл этого значения зависит от обёртки.

bytes_transferred

Если применимо, то функция заполнит параметр bytes_transferred.

bytes_max

Если применимо, то функция заполнит параметр bytes_max.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия Описание
8.3.0 Реализована поддержка STREAM_NOTIFY_COMPLETED; ранее PHP никогда не вызывали это уведомление.

Примеры

Пример #1 Пример использования функции stream_notification_callback()

<?php

function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max)
{
switch (
$notification_code) {
case
STREAM_NOTIFY_RESOLVE:
case
STREAM_NOTIFY_AUTH_REQUIRED:
case
STREAM_NOTIFY_COMPLETED:
case
STREAM_NOTIFY_FAILURE:
case
STREAM_NOTIFY_AUTH_RESULT:
var_dump($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max);
/* Игнорируем */
break;

case
STREAM_NOTIFY_REDIRECTED:
echo
"Перенаправлены на: ", $message;
break;

case
STREAM_NOTIFY_CONNECT:
echo
"Подсоединились...";
break;

case
STREAM_NOTIFY_FILE_SIZE_IS:
echo
"Получили размер файла: ", $bytes_max;
break;

case
STREAM_NOTIFY_MIME_TYPE_IS:
echo
"Получили mime-тип файла: ", $message;
break;

case
STREAM_NOTIFY_PROGRESS:
echo
"Есть прогресс, функция скачала ", $bytes_transferred, " байтов";
break;
}
echo
"\n";
}

$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));

file_get_contents("http://php.net/contact", false, $ctx);


?>

Вывод приведённого примера будет похож на:

Подсоединились...
Получили mime-тип файла: text/html; charset=utf-8
Перенаправлены на: http://no.php.net/contact
Подсоединились...
Получили размер файла: 0
Получили mime-тип файла: text/html; charset=utf-8
Перенаправлены на: http://no.php.net/contact.php
Подсоединились...
Получили размер файла: 4589
Получили mime-тип файла: text/html;charset=utf-8
Есть прогресс, функция скачала 0 байтов
Есть прогресс, функция скачала 0 байтов
Есть прогресс, функция скачала 0 байтов
Есть прогресс, функция скачала 1440 байтов
Есть прогресс, функция скачала 2880 байтов
Есть прогресс, функция скачала 4320 байтов
Есть прогресс, функция скачала 5760 байтов
Есть прогресс, функция скачала 6381 байтов
Есть прогресс, функция скачала 7002 байтов

Пример #2 Пример простого индикатора для загрузчика файлов из командной строки

<?php

function usage($argv)
{
echo
"Использование:\n";
printf("\tphp %s <http://example.com/file> <localfile>\n", $argv[0]);
exit(
1);
}

function
stream_notification_callback(
$notification_code,
$severity,
$message,
$message_code,
$bytes_transferred,
$bytes_max,
) {
static
$filesize = null;

switch (
$notification_code) {
case
STREAM_NOTIFY_RESOLVE:
case
STREAM_NOTIFY_AUTH_REQUIRED:
case
STREAM_NOTIFY_COMPLETED:
case
STREAM_NOTIFY_FAILURE:
case
STREAM_NOTIFY_AUTH_RESULT:
/* Игнорируем */
break;

case
STREAM_NOTIFY_REDIRECTED:
echo
"Перенаправлены на: ", $message, "\n";
break;

case
STREAM_NOTIFY_CONNECT:
echo
"Подсоединились...\n";
break;

case
STREAM_NOTIFY_FILE_SIZE_IS:
$filesize = $bytes_max;
echo
"Размер файла: ", $filesize, "\n";
break;

case
STREAM_NOTIFY_MIME_TYPE_IS:
echo
"Mime-тип файла: ", $message, "\n";
break;

case
STREAM_NOTIFY_PROGRESS:
if (
$bytes_transferred > 0) {
if (!isset(
$filesize)) {
printf("\rНеизвестный размер файла.. Закачано %2d Кб..", $bytes_transferred / 1024);
} else {
$length = (int) (($bytes_transferred / $filesize) * 100);

printf(
"\r[%-100s] %d%% (%2d/%2d kb)",
str_repeat("=", $length) . ">",
$length,
(
$bytes_transferred / 1024),
$filesize / 1024
);
}
}
break;
}
}

isset(
$argv[1], $argv[2]) or usage($argv);

$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));

$fp = fopen($argv[1], "r", false, $ctx);
if (
is_resource($fp) && file_put_contents($argv[2], $fp)) {
echo
"\nГотово!\n";
exit(
0);
}

$err = error_get_last();
echo
"\nОш-ш-ш-ш-шиб-бка..\n", $err["message"], "\n";
exit(
1);

?>

Выполнение приведённого примера со следующими опциями: php -n fetch.php http://no2.php.net/get/php-5-LATEST.tar.bz2/from/this/mirror php-latest.tar.bz2 выведет что-то похожее на это:

Подсоединились...
Mime-тип файла: text/html; charset=utf-8
Перенаправлены на: http://no2.php.net/distributions/php-5.2.5.tar.bz2
Подсоединились...
Размер файла: 7773024
Mime-тип файла: application/octet-stream
[========================================>                                                           ] 40% (3076/7590 kb)

Смотрите также