©
本文档使用
php.cn手册 发布
(PHP 5 >= 5.2.0)
stream_notification_callback — A callback function for the notification context parameter
$notification_code
, int $severity
, string $message
, int $message_code
, int $bytes_transferred
, int $bytes_max
)A callable function, used by the notification context parameter, called during an event.
Note:
This is not a real function, only a prototype of how the function should be.
notification_code
One of the STREAM_NOTIFY_*
notification constants.
severity
One of the STREAM_NOTIFY_SEVERITY_*
notification constants.
message
Passed if a descriptive message is available for the event.
message_code
Passed if a descriptive message code is available for the event.
The meaning of this value is dependent on the specific wrapper in use.
bytes_transferred
If applicable, the bytes_transferred
will be
populated.
bytes_max
If applicable, the bytes_max
will be
populated.
没有返回值。
Example #1 stream_notification_callback() example
<?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 );
?>
以上例程的输出类似于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Example #2 Simple progressbar for commandline download client
<?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 );
?>
Executing the example above with: php -n fetch.php http://no2.php.net/get/php-5-LATEST.tar.bz2/from/this/mirror php-latest.tar.bz2 will output something similar too:
1 2 3 4 5 6 7 |
|
[#1] recycling dot sp dot am at gmail dot com [2010-09-10 05:08:15]
Please note that the callback function never gets called when the stream is (at least) of type socket. It is probably the same for the file:// proto although I've not done further tests.
I'm using php 5.3.3.