|
Posted by John C. Frickson on 03/11/07 04:18
On 2007-03-09 20:41, Jerry Stuckle wrote:
> John C. Frickson wrote:
>> On 2007-03-09 10:28, John C. Frickson wrote:
>>> My company produces reports for our customers in PDF format. I have a
>>> php script that verifies login status and access rights, and sends
>>> the pdf to the client using readfile().
>>>
>>> This has worked fine until recently. One of our customers' reports
>>> is 10.6MB, and the customer never receives it and I can't get it
>>> either. I checked the Apache access_log, and it shows varying
>>> amounts of bytes being sent, but always close to 10MB.
>>>
>>> I tried changing the php script to do fopen(), fread(), echo,
>>> ob_flush() and flush(). After each flush, I write a message to a log
>>> file. The messages in the log file stop at 10MB, as if the php script
>>> is hung.
>>>
>>> Using a network monitor, I see the connection being established, the
>>> HTTP GET being sent, but no content coming back.
>>>
>>> PHP version is 5.1.2
>>> Apache is 2.2.3
>>> OS is SuSE Linux Enterprise Server 10.0 - 64bit
>>>
>>> Current test version looks like this:
>>>
>>> ini_set("output_buffering", "0");
>>> ini_set("implicit_flush", "1");
>>> ini_set("memory_limit", "100M");
>>> ini_set("max_execution_time", "600");
>>> $lth = 0;
>>> $in = fopen($path, "r");
>>> while (!feof($in)) {
>>> $data = fread($in, 8192);
>>> $lth += strlen($data);
>>> $errLog->WriteLog("Read $lth bytes" , "debug.txt");
>>> echo $data;
>>> $errLog->WriteLog("After echo" , "debug.txt");
>>> ob_flush();
>>> $errLog->WriteLog("After ob_flush" , "debug.txt");
>>> flush();
>>> $errLog->WriteLog("After flush" , "debug.txt");
>>> }
>>> $errLog->WriteLog("Got EOF", "debug.txt");
>>> fclose($in);
>>> $errLog->WriteLog("End of Script - read $lth bytes", "debug.txt");
>>>
>>>
>>> The last five lines of the debug.txt log file say:
>>>
>>> Read 10223616 bytes
>>> After echo
>>> After ob_flush
>>> After flush
>>> Read 10231808 bytes
>>> After echo
>>>
>>> So it's never returning from the ob_flush() call. Time from first
>>> log entry to last is about 1 second.
>>>
>>> Any ideas?
>>> John
>>
>> I noticed I didn't have a "Content-Length" header, so I added it
>> and it's now working. Even without the header, it should have
>> worked anyway, shouldn't it?
>
> Not reliably. There is a reason for the Content-Length header - to let
> the browser know how much to expect.
>
> Without the header the browser is free to figure on it's own how long
> the data should be (no browser I know of allows "unlimited length). And
> evidently you finally exceeded the browser default.
>
Except NO data ever got sent to the browser. So it's something in
either PHP or Apache that decided to quit. True, I wrote bad code
by forgetting the Content-Length header, but it's a bit disturbing
that PHP or Apache just didn't send any data without any kind of
warning or error message.
Navigation:
[Reply to this message]
|