php-stream_context_set_params()中的通知未调用

时间:2018-11-22 07:08:07

标签: php wordpress fopen file-put-contents

我正在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文件为空。这意味着根本没有调用通知回调。

任何人都知道为什么会发生这种情况吗?

这是一个代码相似但问题不同的问题: Download files file_put_contents with 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 :(得分:1)

http://php.net/stream_context_set_params文档中所述,notification回调仅针对ftphttp连接触发。当您使用它(通过另一个协议)将内容写入本地目录时,很明显为什么从未调用过回调。