@poopoo
poopoo
30 Mar 2015

Почему-PHP функция filesize на сервере на котором сайт возвращает размер файла только если указать полный абсолютный путь к файлу а на моём компе работает и без полного абсолютного файла.

30 Mar 2015

poopoo, видимо, PHP подключён как-то иначе. Попробуй добавить что-то типа chdir(dirname(__FILE__));в начало файла, может быть поможет.

30 Mar 2015

код то покажи - как relative path указываешь, как absolute

30 Mar 2015

$filename = 'fuck.pdf';
$file = dirname(FILE).'/'.$filename;

    header('Content-type: application/pdf');
    header('Content-Disposition: inline; filename="' . $filename . '"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    header('Accept-Ranges: bytes');

    @readfile($file);
#ovramy/3 в ответ на /2
30 Mar 2015

Файл находится в той же директории что и нужный файл.

#ovramy/4 в ответ на /3
30 Mar 2015

poopoo, а все прочие условия совпадают? То есть ты и там, и там используешь один и тот же файл? (а не, допустим, запихиваешь это в плагин для WordPress’а)

#ovramy/6 в ответ на /3
30 Mar 2015

Что второй? Путь? Просто писал filesize($filename);.

#ovramy/7 в ответ на /5
30 Mar 2015

У меня Apache а там Nginx.

#ovramy/8 в ответ на /6
30 Mar 2015

погляди что у тебя в $file лежит на локале и на сервере

#ovramy/9 в ответ на /7
30 Mar 2015

poopoo, сдаюсь, я без идей. Возможно надо смотреть в сторону того, как именно подключается PHP к энджиниксу, но я тут ничего посоветовать не могу.

#ovramy/10 в ответ на /8
30 Mar 2015

Ну на моём компе: /srv/www/htdocs/m2/protected/modules/user/controllers/fuck.pdf а на сервере почти то же самое — /var/www/htdocs/m2/protected/modules/user/controllers/fuck.pdf

#ovramy/11 в ответ на /9
30 Mar 2015

права на сервере, я так думаю ты проверял?

#ovramy/12 в ответ на /11
30 Mar 2015

ну тогда давай сравнивать какие заголовки отдает локалка и сервер при обращении к fuck.pdf

#ovramy/14 в ответ на /13
30 Mar 2015

а вообще можно плюнуть и изменить строку - header('Content-Length: ' . filesize($file)); на header('Content-Length: ' . filesize($filename)); если уж ты уверен что оно не будет у тебя лежать где-то еще.

#ovramy/15 в ответ на /14
30 Mar 2015

Так в этом то и загвоздка. У меня так работает, а на сервере отправляется файл с размером 0 байт.

#ovramy/16 в ответ на /15
30 Mar 2015

покажи заголовки при скачивании этого файла - сервер что отдает?

#ovramy/17 в ответ на /16
30 Mar 2015

Accept-Ranges: bytes
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: keep-alive
Content-Disposition: inline; filename="fuck.pdf"
Content-Length: 479832
Content-Transfer-Encoding: binary
Content-Type: application/pdf
Date: Mon, 30 Mar 2015 09:02:01 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Server: nginx
Set-Cookie: first_visit=0
X-Powered-By: PHP/5.4.4-14+deb7u7

Это с сервера.

#ovramy/18 в ответ на /17
30 Mar 2015

На локальной машине то же самое, но версия PHP 5.6.1

#ovramy/19 в ответ на /18
30 Mar 2015
var_dump($_SERVER);

И, да, считать пути к файлам - относительными это максимум пидорство. Считай от $ SERVER['DOCUMENT ROOT']

30 Mar 2015

NokitaKaze, относительный путь всегда указывает не в то место, в которое ты хочешь. Всегда считай пути абсолютными.
Это касается и html-верстки тоже. Вот в css можно использовать относительные пути

#ovramy/21 в ответ на /20
30 Mar 2015

DOCUMENT_ROOT указывает на /var/www/htdocs. Удобнее писать dirname(FILE).

#ovramy/22 в ответ на /20
30 Mar 2015

poopoo, не представляю как меняется FILE в разных имплементациях во время include/require, а здесь всё точно

#ovramy/23 в ответ на /22
30 Mar 2015

Content-Length: 479832 - это все же не ноль. размер то взялся?

#ovramy/24 в ответ на /18
30 Mar 2015

Потому что я использую полный абсолютный путь.

#ovramy/26 в ответ на /24
30 Mar 2015

ну дык ты без полного покежь как выводит?
И это, а $file ты тоже показывал когда у тебя полный путь был?

#ovramy/27 в ответ на /26
30 Mar 2015
ob_start();
phpinfo();
file_put_contents('/tmp/phpinfo.html', ob_get_contents());
ob_end_clean();

делай на сервере и читай /tmp/phpinfo.html
Дело по любому где-то в настройках.

#ovramy/31 в ответ на /29
30 Mar 2015

Accept-Ranges: bytes
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: keep-alive
Content-Disposition: inline; filename="fuck.pdf"
Content-Transfer-Encoding: binary
Content-Type: application/pdf
Date: Mon, 30 Mar 2015 09:23:01 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Server: nginx
Set-Cookie: first_visit=0
Transfer-Encoding: chunked
X-Powered-By: PHP/5.4.4-14+deb7u7

Да.

#ovramy/32 в ответ на /27
30 Mar 2015

покажи что в $file если relative указан

#ovramy/33 в ответ на /32
30 Mar 2015

$filename = 'fuck.pdf';
$file = $filename;

#ovramy/35 в ответ на /34
30 Mar 2015

сделай

$_SERVER['DOCUMENT_ROOT'].'/blahblah/fuck.pdf'

и проверяй что будет

#ovramy/36 в ответ на /35
30 Mar 2015

А что будет? Будет работать.

#ovramy/38 в ответ на /36
30 Mar 2015

poopoo, если будет работать, то вопрос закрыт. Отныне и во веки вечные пиши пути, относительно рута

#ovramy/39 в ответ на /38
30 Mar 2015

Но почему здесь работает а там нет? Настройки, как уже предлагали, не смотрел так как сейчас не до этого.

#ovramy/40 в ответ на /39

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.