php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #42641 ob_start(): inconsistent behaviour with undefined callbacks
Submitted: 2007-09-12 09:15 UTC Modified: 2009-02-23 09:38 UTC
Votes:4
Avg. Score:2.2 ± 1.3
Reproduced:2 of 3 (66.7%)
Same Version:1 (50.0%)
Same OS:2 (100.0%)
From: robin_fernandes at uk dot ibm dot com Assigned: mike (profile)
Status: Wont fix Package: Output Control
PHP Version: 5.3CVS-2008-11-01 (not for 5.2!) OS: *
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: robin_fernandes at uk dot ibm dot com
New email:
PHP Version: OS:

 

 [2007-09-12 09:15 UTC] robin_fernandes at uk dot ibm dot com
Description:
------------
ob_start() can initialize multiple output buffers in a single call using a comma delimited list of output callbacks, as follows:
  ob_start('f,f,f');
where function f() is a defined function.

However, behaviour when passing an undefined callback is inconsistent:
  ob_start('non_existent,f');
returns false and initializes no output buffers, whereas
  ob_start('non_existent,f,f');
returns true and initializes 2 output buffers with f as a callback.

Using arrays, the behaviour is consistent. The following both return false and initialize no output buffers:
  ob_start(array('non_existent', 'f'));
  ob_start(array('non_existent', 'f', 'f'));

Tested on Windows XP on PHP 5.2.5-dev (cli) (built: Sep 12 2007 04:04:36).

Reproduce code:
---------------
<?php
function f($str) {
  return $str;
}
function checkAndClean() {
  print_r(ob_list_handlers());
  while (ob_get_level()>0) {
    ob_end_flush();
  }
}
var_dump(ob_start(array('non_existent', 'f')));
checkAndClean();
var_dump(ob_start(array('non_existent', 'f', 'f')));
checkAndClean();
var_dump(ob_start('non_existent,f'));
checkAndClean();
var_dump(ob_start('non_existent,f,f'));  //bug: expecting false with no output buffers. Actually returns true and initialises 2 output buffers.
checkAndClean();
?>

Expected result:
----------------
bool(false)
Array
(
)
bool(false)
Array
(
)
bool(false)
Array
(
)
bool(false)
Array
(
)

Actual result:
--------------
bool(false)
Array
(
)
bool(false)
Array
(
)
bool(false)
Array
(
)
bool(true)
Array
(
    [0] => f
    [1] => f
)

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-09-12 11:17 UTC] jani@php.net
Let's start with the prototype for this function:

bool ob_start ( [callback $output_callback [, int $chunk_size [, bool $erase]]] )

The first parameter is "callback" type, so it expects either a string (function name) or array (object, method).

More information about "callback" pseudo-type: 
http://www.php.net/callback

I don't know where you got the idea that you can pass multiple callbacks in there. It's not said to work like that anywhere in the manual at least. :)

Please fix your example script accordingly (and tune up your display_errors / error_reporting levels..).
 [2007-09-12 14:06 UTC] robin_fernandes at uk dot ibm dot com
Hi,

Thanks for your reply. As documentation isn't always complete/up to date, I looked at the implementation of ob_start() to understand its behaviour.

The code in the 5.2 version of php_ob_init() in output.c splits strings on ',' and attempts to process each part seaparately (line 485). For arrays, if a pair does not represent a method, a comment explicitly states "init all array elements recursively" (line 516).

The prototype in the 5.2 code currently looks like this:
bool ob_start([ string|array user_function [, int chunk_size [, bool erase]]])

The following testcase shows this behaviour in action: http://pastebin.com/f4f15a025

Regarding tuning up the error message display params, I'm currently using: error_reporting  = E_ALL | E_STRICT / display_errors = 1 . Would you expect see warnings/notices with my testcase?

I'll happily raise a documentation bug to ensure this is covered. Alternatively, perhaps the fact that this behaviour is available is itself a bug? Note that this is raised against php5 (not 6 where the output buffering implementation seems to be a bit different).
 [2007-09-13 09:22 UTC] jani@php.net
Yeah, now that I took a closer look I can see there's something like this implemented..I wonder when/why. :)

Please don't open documentation issue yet.
 [2007-09-13 19:05 UTC] mike@php.net
This undocumented behaviour does not exist in any way in HEAD any longer.  The implementation seemed questionable, as an array as parameter usually indicates a method callback.

 [2007-09-14 10:07 UTC] robin_fernandes at uk dot ibm dot com
OK. On this subject, I think I'm running into a few other output buffering issues which seem to be fixed in the php6 snaps. Some of these are illustrated by tests in HEAD that fail on php5 snaps, e.g. http://lxr.php.net/source/php-src/tests/output/ob_017.phpt . Should I raise bugs against php5, or is there a plan to backport some output buffering code from HEAD to php5?
 [2007-09-18 12:28 UTC] jani@php.net
Mike, can you backport the stuff to PHP_5_3 once it's opened?
 [2008-11-02 13:01 UTC] jani@php.net
Mike, just commit it!
 [2009-02-23 09:38 UTC] mike@php.net
Patch for 5.3 has been declined.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Apr 16 21:01:28 2024 UTC