PHP
流 | Streams

stream_notification_callback

stream_notification_callback

(PHP 5 >= 5.2.0, PHP 7)

stream_notification_callback - 通知上下文参数的回调函数

描述

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

可调用函数,由通知上下文参数使用,在事件期间调用。

注意:这不是一个真正的函数,只是函数应该如何的一个原型。

参数

notification_code

其中一个STREAM_NOTIFY_*通知常量。

severity

其中一个STREAM_NOTIFY_SEVERITY_*通知常量。

message

如果事件可用描述性消息则通过。

message_code

如果事件可用描述性消息代码,则通过。

此值的含义取决于使用的特定包装。

bytes_transferred

如果适用,bytes_transferred将填充。

bytes_max

如果适用,bytes_max将填充。

返回值

没有值返回。

示例

示例#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             /* Ignore */             break;         case STREAM_NOTIFY_REDIRECTED:             echo "Being redirected to: ", $message;             break;         case STREAM_NOTIFY_CONNECT:             echo "Connected...";             break;         case STREAM_NOTIFY_FILE_SIZE_IS:             echo "Got the filesize: ", $bytes_max;             break;         case STREAM_NOTIFY_MIME_TYPE_IS:             echo "Found the mime-type: ", $message;             break;         case STREAM_NOTIFY_PROGRESS:             echo "Made some progress, downloaded ", $bytes_transferred, " so far";             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 ?>

上面的例子会输出类似于:

Connected... Found the mime-type: text/html; charset=utf-8 Being redirected to: http://no.php.net/contact Connected... Got the filesize: 0 Found the mime-type: text/html; charset=utf-8 Being redirected to: http://no.php.net/contact.php Connected... Got the filesize: 4589 Found the mime-type: text/html;charset=utf-8 Made some progress, downloaded 0 so far Made some progress, downloaded 0 so far Made some progress, downloaded 0 so far Made some progress, downloaded 1440 so far Made some progress, downloaded 2880 so far Made some progress, downloaded 4320 so far Made some progress, downloaded 5760 so far Made some progress, downloaded 6381 so far Made some progress, downloaded 7002 so far

示例#2命令行下载客户端的简单进度条

<?php function usage($argv) {     echo "Usage:\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:         /* Ignore */         break;     case STREAM_NOTIFY_REDIRECTED:         echo "Being redirected to: ", $message, "\n";         break;     case STREAM_NOTIFY_CONNECT:         echo "Connected...\n";         break;     case STREAM_NOTIFY_FILE_SIZE_IS:         $filesize = $bytes_max;         echo "Filesize: ", $filesize, "\n";         break;     case STREAM_NOTIFY_MIME_TYPE_IS:         echo "Mime-type: ", $message, "\n";         break;     case STREAM_NOTIFY_PROGRESS:         if ($bytes_transferred > 0) {             if (!isset($filesize)) {                 printf("\rUnknown filesize.. %2d kb done..", $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 "\nDone!\n";     exit(0 } $err = error_get_last( echo "\nErrrrrorr..\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会输出类似的东西太:

Connected... Mime-type: text/html; charset=utf-8 Being redirected to: http://no2.php.net/distributions/php-5.2.5.tar.bz2 Connected... Filesize: 7773024 Mime-type: application/octet-stream [========================================> ] 40% (3076/7590 kb)

另请参阅

← stream_is_local

stream_register_wrapper →