• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • stream_notification_callback()

    (PHP 5 >= 5.2.0, PHP 7)

    A callback function for thenotificationcontext parameter

    说明

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

    Acallablefunction, used by thenotification context parameter, called during an event.

    Note:

    This isnota real function, only a prototype of how the function should be.

    参数

    $notification_code

    One of theSTREAM_NOTIFY_*notification constants.

    $severity

    One of theSTREAM_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_transferredwill be populated.

    $bytes_max

    If applicable,the$bytes_maxwill be populated.

    返回值

    没有返回值。

    范例

    Example #1stream_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);
    ?>
    

    以上例程的输出类似于:

    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
    

    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.bz2will output something similar too:

    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)
    

    参见

    • Context 参数
    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.
    A couple of notes regarding the examples here (I'm using PHP 7.0.18):
    1) fopen() did not provide STREAM_NOTIFY_PROGRESS for me but `file_get_contents()` worked fine.
    2) The bytes transferred when transferring a zip file seems to always be shy by 8192 (8k). This varies depending on filetype and also breaks STREAM_NOTIFY_PROGRESS when the filesize is below 8k. I modified the function and it's now displaying the correct amount transferred and percentage downloaded on zip files above 8k. I'm not sure why the callback is so inconsistent but hopefully this is helpful to someone. This was also modified to only display progress:
    <?php
    $ctx = stream_context_create();
    stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));
    $fileData = @file_get_contents('http://example.com/test.zip',false,$ctx);
    function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
      static $filesize = null;
      switch($notification_code) {
      case STREAM_NOTIFY_FILE_SIZE_IS:
        $filesize = $bytes_max;
        break;
      case STREAM_NOTIFY_CONNECT:
        echo "Connected...\n";
        break;
      case STREAM_NOTIFY_PROGRESS:
        if ($bytes_transferred > 0 && $filesize >= 8192) {
          $bytes_transferred += 8192;
          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;
      }
    }
    ?>