ID: 45945
Comment by: djimenez at conduit-it dot com
Reported By: djimenez at conduit-it dot com
Status: Open
Bug Type: Apache2 related
Operating System: Ubuntu - gutsy gibbon
PHP Version: 5.2.6
New Comment:
I used amazon ec2 to test and reconfirm this bug on a base install of
apache2 and php5.2.6 in ubuntu intrepid ibex. No changes to the
php.ini (which I've included without comments and empty sections):
[PHP]
engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision = 12
y2k_compliance = On
output_buffering = Off
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
expose_php = On
max_execution_time = 30 ; Maximum execution time of each script,
in seconds
max_input_time = 60 ; Maximum amount of time each script may spend
parsing request data
memory_limit = 16M ; Maximum amount of memory a script may
consume (16MB)
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "EGPCS"
register_globals = Off
register_long_arrays = On
register_argc_argv = On
auto_globals_jit = On
post_max_size = 8M
magic_quotes_gpc = On
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[Syslog]
define_syslog_variables = Off
[mail function]
SMTP = localhost
smtp_port = 25
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mSQL]
msql.allow_persistent = On
msql.max_persistent = -1
msql.max_links = -1
[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Sybase]
sybase.allow_persistent = On
sybase.max_persistent = -1
sybase.max_links = -1
sybase.min_error_severity = 10
sybase.min_message_severity = 10
sybase.compatability_mode = Off
[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10
[bcmath]
bcmath.scale = 0
[Informix]
ifx.default_host =
ifx.default_user =
ifx.default_password =
ifx.allow_persistent = On
ifx.max_persistent = -1
ifx.max_links = -1
ifx.textasvarchar = 0
ifx.byteasvarchar = 0
ifx.charasvarchar = 0
ifx.blobinfile = 0
ifx.nullformat = 0
[Session]
session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_divisor = 100
session.gc_maxlifetime = 1440
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4
url_rewriter.tags =
"a=href,area=href,frame=src,input=src,form=,fieldset="
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
Previous Comments:
------------------------------------------------------------------------
[2008-08-31 01:48:44] djimenez at conduit-it dot com
output buffering was set to Off, though setting it to something else
still had the same result with the test on my box.
------------------------------------------------------------------------
[2008-08-31 00:32:04] [EMAIL PROTECTED]
What have you set your output_buffering to? (check from phpinfo()
output)
------------------------------------------------------------------------
[2008-08-29 04:15:37] djimenez at conduit-it dot com
Description:
------------
Apache2 supports byte range response with an output filter. Static
files
over 8000 bytes work fine, but mod_php5 served content only works
correctly if it is <= 8000 bytes
To test I used telnet to submit an HTTP Range request for the included
PHP file from an apache2 server configured with mod_php5. Example
requests are in the actual results.
Reproduce code:
---------------
<?php
// upto and including 8000 bytes will allow the byterange filter to
work
//
// NOTE: 8000 byte limit was found by manual trial and error, may vary
per system, but
// my guess would be it has to do with a byte buffer either in mod_php5
or apache2
echo str_repeat(".", 8000);
// anything over 8000 bytes will "fail" (full response)
//echo "\n...one toke over the line";
?>
Expected result:
----------------
Apache's byterange output filter should handle range requests for PHP
responses > 8000 bytes.
Actual result:
--------------
While the test scripts second echo is commented, I get the expected
results:
$ telnet dev.conduit-it.com 80
Trying 10.42.84.2...
Connected to dev.conduit-it.com.
Escape character is '^]'.
GET /test.php HTTP/1.1
Host:dev.conduit-it.com
Range:bytes=0-24
Connection:close
HTTP/1.1 206 Partial Content
Date: Fri, 29 Aug 2008 03:43:20 GMT
Content-Range: bytes 0-24/8000
Content-Length: 25
Connection: close
Content-Type: text/html
.........................Connection closed by foreign host.
We can also see it working for multiple ranges:
$ telnet dev.conduit-it.com 80
Trying 10.42.84.2...
Connected to dev.conduit-it.com.
Escape character is '^]'.
GET /test.php HTTP/1.1
Host:dev.conduit-it.com
Range:bytes=0-24,50-74
Connection:close
HTTP/1.1 206 Partial Content
Date: Fri, 29 Aug 2008 03:45:44 GMT
Content-Length: 240
Connection: close
Content-Type: multipart/byteranges; boundary=455911696d6f354a2
--455911696d6f354a2
Content-type: text/html
Content-range: bytes 0-24/8000
.........................
--455911696d6f354a2
Content-type: text/html
Content-range: bytes 50-74/8000
.........................
--455911696d6f354a2--
Connection closed by foreign host.
So apache is doing all the work for us, until we uncomment the second
echo statement in the repro. script. This puts us over the 8000 byte
limit. At that point, both example requests will return full 200 OK
responses (so content is 8000 periods + our message)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=45945&edit=1