php - уведомление в stream_context_set_params () не вызывается - PullRequest
0 голосов
/ 22 ноября 2018

Я использую этот код в php (Wordpress) для проверки прогресса загрузки:

// Create context
$context = stream_context_create();
stream_context_set_params( $context, [ 'notification' => 'my_stream_notification_callback' ] );

// Declare progress function
function my_stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
    print_r(func_get_args());
}

// Call download
$wp_upload_dir = wp_upload_dir();
file_put_contents( $wp_upload_dir['basedir'] . '/contact.htm', fopen( 'http://php.net/contact', 'r' ), null, $context );

Код успешно загружает файл в папке /wp-content/uploads/, но не печатает никаких уведомлений / прогресса.

Я также пытался записать в error_log() функцию my_stream_notification_callback(), но там ничего не записывается, а файл debug.log пуст.Что означает, что обратный вызов уведомлений вообще не вызывается.

Кто-нибудь знает, почему это произойдет?

Вот вопрос с похожим кодом, но с другой проблемой: Загрузка файлов file_put_contentswith progress Очевидно, код работает для него после того, как функция обратного вызова была исправлена ​​для функции метода класса / объекта.Хотя я пытаюсь использовать более простую функцию обратного вызова, которая должна определенно работать.

Есть идеи?

- РЕДАКТИРОВАТЬ -

Я нашел пример наphp.net здесь: http://php.net/manual/en/function.stream-notification-callback.php

Я использовал этот пример, и он, кажется, работает.

См. код, который я использовал (немного изменился по сравнению с примером):

$ctx = stream_context_create();
stream_context_set_params( $ctx, [
    "notification" => function ( $notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max ) {
        print_r(func_get_args());
    },
] );

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

Теперь этот код работает и печатает уведомления о прогрессе:

Означает ли это, что у file_put_contents() или fopen() есть проблемы с контекстом / уведомлениями, которых у file_get_contents() нет?

- РЕДАКТИРОВАТЬ -

Вот изменение, которое действительно работает:

file_put_contents( $wp_upload_dir['basedir'] . '/contact.htm', fopen( 'http://php.net/contact', 'r', null, $context ) );

Значит, вместо применения $ context к file_put_contents() мы применяем его кfopen() звони и все работает!

1 Ответ

0 голосов
/ 22 ноября 2018

Как указано в документации на http://php.net/stream_context_set_params,, обратный вызов notification запускается только для соединений ftp и http.Поскольку вы используете его для записи чего-либо в локальный каталог (через другой протокол), становится совершенно очевидно, почему обратный вызов никогда не вызывается.

...