заголовок длины содержимого из php перезаписывается!

Я пытаюсь понять, почему заголовок Content-Length php перезаписывается. Это демо.php

<?php
header("Content-Length: 21474836470");die;
?>

запрос на получение заголовков

curl -I http://someserver.com/demo.php
HTTP/1.1 200 OK
Date: Tue, 19 Jul 2011 13:44:11 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze3
Content-Length: 2147483647
Cache-Control: must-revalidate
Content-Type: text/html; charset=UTF-8

См. Content-Length? Его максимальный размер составляет 2 147 483 647 байт, то есть 2 ГБ.

Теперь, если изменить demo.php так

<?php
header("Dummy-header: 21474836470");die;
?>

заголовок не перезаписывается.

HTTP/1.1 200 OK
Date: Tue, 19 Jul 2011 13:49:11 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze3
Dummy-header: : 21474836470
Cache-Control: must-revalidate
Content-Type: text/html; charset=UTF-8

Вот загруженные модули

root@pat:/etc/apache2# ls /etc/apache2/mods-enabled/
alias.conf        authz_host.load  dav_fs.load    expires.load  php5.conf    reqtimeout.load  status.conf
alias.load        authz_user.load  dav.load       headers.load  php5.load    rewrite.load     status.load
auth_basic.load       autoindex.conf   dav_lock.load  mime.conf     proxy.conf   setenvif.conf
authn_file.load       autoindex.load   dir.conf       mime.load     proxy_http.load  setenvif.load
authz_default.load    cgi.load         dir.load       negotiation.conf  proxy.load   ssl.conf
authz_groupfile.load  dav_fs.conf      env.load       negotiation.load  reqtimeout.conf  ssl.load

Вот phpinfo(): http://pastehtml.com/view/b0z02p8zc.html

Apache поддерживает файлы размером более 2 ГБ, так как у меня нет проблем с прямым доступом к большому файлу:

curl -I http://www.someserver.com/somehugefile.zip (5.3 Gig)
HTTP/1.1 200 OK
Date: Tue, 19 Jul 2011 14:00:25 GMT
Server: Apache/2.2.16 (Debian)
Last-Modified: Fri, 15 Jul 2011 08:50:22 GMT
ETag: "301911-1548e4b11-4a817bd63ef80"
Accept-Ranges: bytes
Content-Length: 5713578769
Cache-Control: must-revalidate
Content-Type: application/zip

Вот uname -a

Linux pat.someserver.com 2.6.38.2-grsec-xxxx-grs-ipv6-32 #1 SMP Fri Apr 15 17:41:28 UTC 2011 i686 GNU/Linux

Надеюсь, кто-нибудь может помочь!

ваше здоровье


person Michael    schedule 19.07.2011    source источник
comment
Это все еще 32-битный Apache с 32-битным PHP - PHP разрезает ваш bigint на подписанный 32-битный int, отсюда и усечение.   -  person Marc B    schedule 19.07.2011
comment
Просто предположение: PHP автоматически переопределяет этот заголовок. Возможно, вы используете 32-битную систему, поэтому PHP не может работать с большими целыми числами.   -  person Karolis    schedule 19.07.2011


Ответы (2)


Похоже, что php применяет Content-length к int

person RiaD    schedule 19.07.2011

Да, это определенно 32-битная штука. Ну, я не хочу настраивать PHP, перекомпилировать или что-то в этом роде, поэтому пока я проверю размер файла, и если он больше 2 ГБ, я не отправлю заголовок.

Спасибо всем за ваш вклад

person Michael    schedule 20.07.2011