M. Sokolewicz wrote:
> Hi Jochem,
> 
> in your post I see:
> Last-Modified: Fri, 22 Jun 2007 19:20:30 GMT
> 
> and:
> 
> -rw-r--r-- 1 apache apache 11924 Jun 22 21:20 foo.jpg
> 
> Those two look like they're 2 hours off from eachother! Perhaps Apache
> does some magic on the unix timestamp first?

I noticed it too - I tested Etag generation with filemtime - 2 hours and
that didn't give me anything near the result apache is generating (neither
did '+ 2 hours' btw :-).

additionally I checked with the values for FileSize and Inode and php is giving
identical values for those.

the filemtime differences must be due simply to timezone differences -
if I run the value of the Last-Modified header for any given image file through
strtotime() (on the server in question) I get the exact same integer as I do 
when
I run filemtime() on the image file in question.

what the frak is apache using for the file modification time?

> 
> Just a thought there.
> - Tul
> 
> Jochem Maas wrote:
>> hi Tul,
>>
>> thanks for the feedback ... can I borrow your brain for a little
>> longer? ....
>>
>> M. Sokolewicz wrote:
>>> hey Jochem,
>>> as far as I can see, this should work for you:
>>> <?php
>>> $stats = stat('/dev/shm/file');
>>> $etag = sprintf('"%x-%x-%x"', $stats['ino'], $stats['size'],
>>> $stats['mtime']); // lowercase hexadecimal numbers separated by dashes
>>> header('Etag: '.$etag);
>>> ?>
>>
>> this is what I thought - actually I originally used dechex() - which
>> gave the
>> same output as sprintf("%x", ...) ... which is not surprising.
>>
>> sidenote: I'm actually only using the modification time in the etag
>> right now.
>> I figure this keeps it a little faster - there is next to no chance to
>> that the filemtime will change and the file will be the same and using
>> the inode
>> info is silly because moving the files locally (for whatever reason)
>> shouldn't affect
>> whether a 304 can be given (imho). the fact that this may result in
>> many files with
>> identical Etags maybe incorrect but I don't see the problem as the URL
>> (and therefore
>> the local file) is going to be different.
>>
>> BIG BUT: apache is not generating the same hexadecimal value for the
>> filemtime of a
>> given file as I get from the various attempts with php
>>
>> for a given file I get:
>>
>> apache Etag        : 8e6bbb80
>> mtime via stat()     : 1182540030
>> mtime via filemtime()    : 1182540030
>> sprintf("%x") Etag    : 467c20fe
>> dechex() Etag        : 467c20fe
>>
>> the http headers for the URL of the file in question are:
>>
>> Date: Fri, 22 Jun 2007 23:00:13 GMT
>> Server: Apache
>> Last-Modified: Fri, 22 Jun 2007 19:20:30 GMT
>> Etag: "8e6bbb80"
>> Accept-Ranges: bytes
>> Content-Length: 11924
>> Content-Type: image/jpeg
>> X-lori-time-2: 1182553213537
>>
>> an 'ls -l' on the file in question gives (name of file changed to
>> protect the innocent):
>>
>> -rw-r--r-- 1 apache apache 11924 Jun 22 21:20 foo.jpg
>>
>> I swear it's the same file but apache is generating the hexadecimal
>> representation of the
>> filemtime differently than a 'straight' dec2hex conversion (ala
>> dechex() and sprintf())
>>
>> doing a hexdec() on the apache generated Etag shows that this is not a
>> question
>> of mtimes being slightly off (for some reason):
>>
>> hexdec("8e6bbb80") = 2389425024
>>
>> I'm stumped, the comments for etag_ulong_to_hex() in the apache source
>> even states:
>>
>>     "Generate the human-readable hex representation of an unsigned long
>>      (basically a faster version of 'sprintf("%lx")')"
>>
>> I'm rather wary of the 'basically' it smells fishy to me ... rather
>> like saying I'm basically
>> a women - sure there is a resemblance, but bit of investigation will
>> show plenty of differences.
>>
>> I have been checking with static image files (ones that go no where
>> near a resampling script)
>> and the same problem occurs.
>>
>>
>>
>>
>> my desk is covered in hair :-/
>>
>> PS - completely offtrack but what's "X-lori-time-2" - I've noticed
>> since not long ago,
>> I have no idea what it is or what purpose it serves, and seemingly nor
>> do the search engines.
>>
>>> Assuming your apache is configured to use the inode, modification time
>>> and filesize in its etag.
>>>
>>> The function you attached simply converts integers of type long to
>>> hexadecimal strings. It is not the actual function creating the etag
>>> itself.
>>
>> ....
>>
>>>> I'd like to be able to generate an Etag header in php that matches
>>>> what Apache generates, I ended up in the apache source code here:
>>>>
>>>> http://svn.apache.org/viewvc/httpd/httpd/branches/2.0.x/modules/http/http_protocol.c?view=markup
>>>>
>>>>
>>>>
>>
>> ....
>>
>>>> static char *etag_ulong_to_hex(char *next, unsigned long u)
>>>> {
>>>>     int printing = 0;
>>>>     int shift = sizeof(unsigned long) * 8 - 4;
>>>>     do {
>>>>         unsigned long next_digit = ((u >> shift) & (unsigned long)0xf);
>>>>         if (next_digit) {
>>>>             *next++ = HEX_DIGITS[next_digit];
>>>>             printing = 1;
>>>>         }
>>>>         else if (printing) {
>>>>             *next++ = HEX_DIGITS[next_digit];
>>>>         }
>>>>         shift -= 4;
>>>>     } while (shift);
>>>>     *next++ = HEX_DIGITS[u & (unsigned long)0xf];
>>>>     return next;
>>>> }
>>>>
>>
>> ....
> 

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to