|
Posted by Jerry Stuckle on 03/11/07 13:48
John C. Frickson wrote:
>
>
> 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.
What's in your Apache error log?
Or, if you are logging PHP errors to a separate log file (unusual, but
possible - check phpinfo()), what's in it?
And if there is such a severe error that PHP/Apache can't send your data
to the browser, it probably can't send an error message, either. But it
will log something.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Navigation:
[Reply to this message]
|