|
Posted by Jerry Stuckle on 03/12/07 19:32
John C. Frickson wrote:
>
>
> On 2007-03-11 13:34, Jerry Stuckle wrote:
>> John C. Frickson wrote:
>>>
>>>
>>> On 2007-03-11 07:48, Jerry Stuckle wrote:
>>>> 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.
>>>>
>>>
>>> Nothing in the Apache error log (where PHP errors usually go).
>>> The Apache access log shows a "200" response code and a short
>>> number of bytes (such as 10343101 when it should be 11500016).
>>>
>>> I'm cross-posting this to a couple other groups that might be
>>> relevant.
>>
>> In that case data WAS sent to the browser. But since it was
>> incomplete it looks like the browser just didn't display anything.
>>
>> That's not unusual.
>
> In my original message I wrote "Using a network monitor, I see
> the connection being established, the HTTP GET being sent, but
> no content coming back." The browser did NOT receive ANY data.
And your Apache log says around 10M was sent. What happened to it?
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Navigation:
[Reply to this message]
|