(PHP 5 >= 5.2.0, PHP 7, PHP 8)
stream_notification_callback — Играет роль callback-функции для параметра контекста notification
$notification_code
,$severity
,$message
,$message_code
,$bytes_transferred
,$bytes_max
Функция с типом 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)