Я использую этот код в 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()
звони и все работает!