By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,742 Members | 1,206 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,742 IT Pros & Developers. It's quick & easy.

Chunked encoding with php+apache2

P: n/a
I'm trying to figure out how to enable chunked encoding with php over
apache2 for a particular page. My php/apache combination definitely
supports chunked encoding, because a page which calls only phpinfo()
uses it. On the other hand, pages without phpinfo() don't get sent with
chunked encoding (content-length is used instead). Does anyone know
how to specifically enable chunked encoding for a given page?
Thanks,
Jon

Jul 17 '05 #1
Share this Question
Share on Google+
7 Replies


P: n/a
on 02/02/2005 11:51 PM jo************@gmail.com said the following:
I'm trying to figure out how to enable chunked encoding with php over
apache2 for a particular page. My php/apache combination definitely
supports chunked encoding, because a page which calls only phpinfo()
uses it. On the other hand, pages without phpinfo() don't get sent with
chunked encoding (content-length is used instead). Does anyone know
how to specifically enable chunked encoding for a given page?


Why do you want to force chunked encoding on pages that are not
generated dynamically?

Chunked encoding is only useful when you do not know in advance the page
size.

--

Regards,
Manuel Lemos

PHP Classes - Free ready to use OOP components written in PHP
http://www.phpclasses.org/

PHP Reviews - Reviews of PHP books and other products
http://www.phpclasses.org/reviews/

Metastorage - Data object relational mapping layer generator
http://www.meta-language.net/metastorage.html
Jul 17 '05 #2

P: n/a
> Why do you want to force chunked encoding on pages that are not
generated dynamically?

Chunked encoding is only useful when you do not know in advance the page size.


The pages *are* created dynamically -- they're written in php, not
plain html. The top part of the page is generated quickly, but the
last part of the page is not generated until after a lengthy operation,
which takes from 5-10 seconds. I need the top part of the page to
display quickly, and then display the last bit later, when it's finally
available. It seems to me that enabling chunked encoding, and flushing
the output at appropriate times is the best (only?) way to accomplish
this (without resorting to frames or complex Javascript). But extensive
Google and documentation searching has yielded nothing for me, so far,
as how to enable it.

Jul 17 '05 #3

P: n/a
jo************@gmail.com wrote:
The pages *are* created dynamically -- they're written in php [snip] But extensive Google and documentation searching has yielded nothing
for me, so far, as how to enable it.


But if a content-length header gets sent (like you suggest in the OP),
something (either php or apache) is buffering output.

Don't know of any ready made/easy way to turn on chunks. But you could
write an outputbuffer handler that does (but you'd still be at mercy of
Apaches buffering (and the client UAs buffering techniques)).

Jul 17 '05 #4

P: n/a
> Don't know of any ready made/easy way to turn on chunks. But you
could
write an outputbuffer handler that does (but you'd still be at mercy of Apaches buffering (and the client UAs buffering techniques)).


Thanks for the suggestion -- I actually tried that exact thing, but the
content-length was still being sent along, in addition to the chunked
encoding header that I manually added, via the header() function. If
there was a way to control exactly which headers are sent, (i.e.
suppress content-length from being sent) than this method would work,
but I don't know if that's possible.

Jul 17 '05 #5

P: n/a
>If there was a way to control exactly which headers are sent,
(i.e. suppress content-length from being sent) than this
method would work, but I don't know if that's possible.


....plus I'd need to find a way to disable buffering of the entire
output. There's more to it than just disabling headers, I should have
mentioned.

Jul 17 '05 #6

P: n/a
<jo************@gmail.com> wrote in message
news:11**********************@g14g2000cwa.googlegr oups.com...
I'm trying to figure out how to enable chunked encoding with php over
apache2 for a particular page. My php/apache combination definitely
supports chunked encoding, because a page which calls only phpinfo()
uses it. On the other hand, pages without phpinfo() don't get sent with
chunked encoding (content-length is used instead). Does anyone know
how to specifically enable chunked encoding for a given page?
Thanks,
Jon


Chunking doesn't happen if a content-length header is present. From the
source code:

if ((r->connection->keepalive != AP_CONN_CLOSE)
&& ((r->status == HTTP_NOT_MODIFIED)
|| (r->status == HTTP_NO_CONTENT)
|| r->header_only
|| apr_table_get(r->headers_out, "Content-Length")
|| ap_find_last_token(r->pool,
apr_table_get(r->headers_out,
"Transfer-Encoding"),
"chunked")
|| ((r->proto_num >= HTTP_VERSION(1,1))
&& (r->chunked = 1))) /* THIS CODE IS CORRECT, see above. */

The variable chunked would not get set if any of the previous conditions are
true. One of them being the presencce of a content-length header. Another,
which might make you scratch your head, is the presence of
"Thansfer-encoding: chunked".

The Apache 2 output filter will automatically add a content-length header if
it sees an end-of-stream marker AND nothing has been sent yet. From the
source code:

if (ctx->data_sent == 0 && eos) {
ap_set_content_length(r, r->bytes_sent);
}

If PHP passes any data down to Apache before it sends EOS, then chunking
happens. PHP uses a output buffer of 4096 bytes by default. Any page smaller
than that will not get chunked.
Jul 17 '05 #7

P: n/a
> Chunking doesn't happen if a content-length header is present.
From the source code:


Thanks very much for the help -- the apparent behavior makes a lot more
sense now.

Jul 17 '05 #8

This discussion thread is closed

Replies have been disabled for this discussion.