php - stream_context_set_params() 中的通知未调用
php - notification in stream_context_set_params() not called
我在 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/
文件夹中成功下载了文件,但没有打印任何通知/进度。
我也尝试在 my_stream_notification_callback()
函数中写入 error_log()
,但它没有写入任何内容,而且 debug.log
文件是空的。这意味着根本没有调用通知回调。
有人知道为什么会这样吗?
这是一个代码相似但问题不同的问题:
显然,在为 class/object 方法函数修复回调函数后,代码对他有效。虽然我正在尝试一个更简单的回调函数,但它应该绝对有效。
有什么想法吗?
-- 编辑 --
我在 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()
有 context/notifications 的问题而 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()
调用,它起作用了!
如 http://php.net/stream_context_set_params 的文档中所述,notification
回调仅针对 ftp
和 http
连接触发。当您使用它向本地目录写入内容(通过另一个协议)时,很明显为什么永远不会调用回调。
我在 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/
文件夹中成功下载了文件,但没有打印任何通知/进度。
我也尝试在 my_stream_notification_callback()
函数中写入 error_log()
,但它没有写入任何内容,而且 debug.log
文件是空的。这意味着根本没有调用通知回调。
有人知道为什么会这样吗?
这是一个代码相似但问题不同的问题:
有什么想法吗?
-- 编辑 --
我在 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()
有 context/notifications 的问题而 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()
调用,它起作用了!
如 http://php.net/stream_context_set_params 的文档中所述,notification
回调仅针对 ftp
和 http
连接触发。当您使用它向本地目录写入内容(通过另一个协议)时,很明显为什么永远不会调用回调。