Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP:Обрыв соединения при upload'е больших файлов

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Столкнулся со странной проблемой. При аплоаде больших файлов на медленном канале через некоторое время обрывается соединение. Но самое странное то, что после обрыва закачанная часть файла передается скрипту, как-будто все прошло нормально. С точки зрения скрипта это выглядит так:

Код:
 
    name: Universal_Report_Setup.exe
    type: application/x-msdownload
    tmp_name: /tmp/phptxsbGn
    error: 0
    size: 5081960
 

В поле size размер загруженной части файла (полностью он превышает 10М). Причем при загрузке файла на быстром канале все происходит нормально.
 
На сервере стоит:
ОС: Fedora Core 4
Apache 2.0.54
PHP 4.3.11
 
Параметры php.ini:

Код:
 
file_uploads = On
upload_max_filesize = 60M
upload_tmp_dir = /tmp
 

 
Минимальный код, повторяющий ошибку:

Код:
<?php
if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {
    $str = "";
    foreach ( $_FILES["testfile"] as $cur_key => $cur_val ) {
        $str .= $cur_key.": ".$cur_val."\r\n";
    }
 
    $fname = "./".$_FILES["testfile"]["name"];
 
    if ( !move_uploaded_file($_FILES["testfile"]["tmp_name"], $fname) ) {
        $str .= "Copying file error\r\n";
    }
 
    if ( ($size = filesize($_FILES["testfile"]["tmp_name"])) != $_FILES["testfile"]["size"] ) {
        $str .= "Filesize error (Uploaded: ".$size.")\r\n";
    }
 
    if ( $fp = fopen("out.log", "ab") ) {
        fwrite($fp, $str);
        fwrite($fp, "\r\n\r\n");
        fclose($fp);
        echo "Save done<br>";
    }
    else {
        echo "error<br>";
    }
}
?>
<form enctype="multipart/form-data" action="" method="post">
Send this file: <input name="testfile" type="file">
<input type="submit" value="Send File">
</form>

 
В идеале было бы хорошо найти способ не рвать соединение. Но будет достаточно идентифицировать ошибку и предупреждать о ней пользователя.
 
PS В качестве крайнего метода остается возможность использовать FTP, но очень не хочется к этому прибегать.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 15:49 30-05-2007
Ternik



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dacuan
а это может в конфиге апача смотреть? там есть вроде директива отвечающая за жизнь запроса.

Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 16:24 30-05-2007
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dacuan
время жизни скрипта какое?  
хотя он не запускается, пока файл не зальется..  
сервер полностью твой?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 17:46 30-05-2007 | Исправлено: Cheery, 17:46 30-05-2007
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IMHO надо увеличить в php.ini параметр max_execution_time

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 23:57 30-05-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kokoc

Цитата:
IMHO надо увеличить в php.ini параметр max_execution_time

Как сказал Cheery

Цитата:
хотя он не запускается, пока файл не зальется..

Так что эта настройка не должна учитываться. В настоящий момент это значение равно:

Код:
max_execution_time = 30

Но обрыв соединения происходит примерно через 10-20 минут.
 

Цитата:
сервер полностью твой?

Да, могу менять любые настройки и ставить любые программы.
 
 
 

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 10:38 31-05-2007
podlom

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Поскольку по поводу настройки вроде бы все полно изложено предлагаю такой механизм проверки: перед загрузкой файла брать его контрольную сумму функцией md5() и/или sha1() и после загрузки файла на сервер проверять его контрольную сумму.

Всего записей: 34 | Зарегистр. 10-10-2005 | Отправлено: 11:26 31-05-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
podlom

Цитата:
Поскольку по поводу настройки вроде бы все полно изложено предлагаю такой механизм проверки: перед загрузкой файла брать его контрольную сумму функцией md5() и/или sha1() и после загрузки файла на сервер проверять его контрольную сумму.

Ага, представляю ситуацию. Сидит двочка-секретарша за компом, перед выгрузкой файла в консоли пишет  

Код:
md5sum file_to_upload.bin

копирует полученное значение в поле ввода, выбирает файл для загрузки и жмет "закачать".
 
Думаю нежиснеспособный метод. По большому счету хватит и размера файла, но и эта операция "слишком сложна" для клиента.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 13:08 31-05-2007
podlom

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Ага, представляю ситуацию. Сидит двочка-секретарша за компом, перед выгрузкой файла в консоли пишет  

Зачем так? Просто надо сделать скриптик, которому будет передаваться только имя файла, а он сам будет генерить файл с хеш-сумой. Вполне жизнеспособно (даже для простого пользователя).
Весь процес можно нормально автоматизировать, но это дело вкуса каждого как.

Всего записей: 34 | Зарегистр. 10-10-2005 | Отправлено: 13:39 31-05-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
podlom

Цитата:
Просто надо сделать скриптик

Подразумевается JavaScript? Сомневаюсь, что javaScript'у будет разрешено лазить по файловой системе да еще и читать файлы.
 
Дело сдвинулось с мертвой точки. После явного указания в .htaccess значения LimitRequestBody 62914560 перестало выдавать недокаченные файлы за нормальные. Но соединение до сих пор рвет.
 

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 16:52 31-05-2007
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Рвет произвольно или по прошествии N секунд/N мегабайт?
А я бы все равно проверил бы set_time_limit() - тем более что оно в секундах, max_input_time, max_input_time
2) вот еще и и еще

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 00:09 01-06-2007
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А какое значение параметров memory_limit и post_max_size? Теоретически они должны быть больше чем  upload_max_filesize.

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 09:55 01-06-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kokoc

Цитата:
Рвет произвольно или по прошествии N секунд/N мегабайт?

Рвет приблизительно через 15-20 минут. Объем загруженной информации разный от 2 до 11 МБ (зависит от загруженности канала клиента).

Цитата:
2) вот еще и и еще

Вторую сылку читал ранее, именно после нее пробовал явно указать LimitRequestBody, что получилось -- см. выше. В первой обсуждается проблема с физическим объемом ОЗУ на сервере. На мой случай не похоже.
 
sTa1kEr
 

Цитата:
А какое значение параметров memory_limit и post_max_size?


Код:
 
memory_limit = 128M
post_max_size = 60M
 

Объем выгружаемого файла не превышает 20М.
 
Нутром чую, что проблема в каком-то таймауте, но в каком найти не могу. TimeOut у Апача для POST-запросов означает время между ближайшими TCP-пакетами, поэтому не оно.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 13:20 01-06-2007
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще теортетически проблема со стеком TCP/IP.
Иногда подобная проблема встречается при отправке писем с аттачами по ADSL; часто помогает уменьшение MTU c 1500 до 1492 или ниже.  Еще антивирусы могут влиять, сканируя поток.  
Где именно уменьшать - на серевере или клиенте - не могу сказать.
Впрочем, маловероятно.
 
А при передаче файлов по FTP такой проблемы нет?
 
Еще на вскидку:
1) достаточно ли свободного места на HDD и не превышаются ли квоты - вдруг где-то остаются полускачанные куски файлов
2) стоить проанализировать логи апача (error_log  и пр.), а также системные (/var/log/messages)
3) может, косяк в конкретных версиях Apache, PHP или FC - глянуть в bugtrack
4) см. http://php.mirror.camelnetwork.com/manual/ru/features.file-upload.php#54016
5) Если это "Russian Apache", то отключить перекодировку
6) Поотключать ненужные подгружаемые модули апача
 
Больше не знаю, чем помочь...

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 00:41 02-06-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kokoc

Цитата:
Еще теортетически проблема со стеком TCP/IP.


Цитата:
А при передаче файлов по FTP такой проблемы нет?

По FTP все передается великолепно, так что TCP, думаю можно оставить в покое.
 

Цитата:
1) достаточно ли свободного места на HDD и не превышаются ли квоты - вдруг где-то остаются полускачанные куски файлов

Свободно более 100 Gb

Цитата:
2) стоить проанализировать логи апача (error_log  и пр.), а также системные (/var/log/messages)

error_log пустой, /var/log/messages тоже

Цитата:
3) может, косяк в конкретных версиях Apache, PHP или FC - глянуть в bugtrack

тем и занимаюсь

Цитата:
4) см. http://php.mirror.camelnetwork.com/manual/ru/features.file-upload.php#54016

Проблема возникает и на Firefox тоже

Цитата:
5) Если это "Russian Apache", то отключить перекодировку

Давно отключена, да и не в этом проблема "русского апача"
 

Цитата:
Больше не знаю, чем помочь...

 
Спасибо за помощь... Буду копать дальше.
 
 

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 10:49 02-06-2007
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP:Обрыв соединения при upload'е больших файлов


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru