Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аплоад файлов большого объема, Проблема в загрузке объемных фото 
:(
    Опции темы
KonstRuctor
Дата 11.4.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Добрый день всем!

Описание проблемы

У меня на сайте работает фотогалерея пользователей, они сами присылают свои фотографии.
Стоит ограничение 150 килобайт на одно фото, все работает без проблем.

Однако многие пользователи жалуются, что для отправки на мой сайт
 фотографию нужно предварительно готовить в редакторе: ужать до 150
 килобайт, да чтобы еще качество не сильно пострадало.
 Многим пользователям это сложно (или лениво) делать.
 К тому же конкурирующие сайты (тот же вконтакте) предлагают
 загрузку объемных файлов прямо с камеры, что очень удобно

 Для загрузки фотографий я использую известный скрипт аплоада Colin
 Verota http://www.verot.net/php_class_upload.htm
 Этот скрипт гибко настраивается и устраивает меня полностью.

 Однако при настройке скрипта на загрузку объемных файлов (около 1 мегабайта) и на
 реальном сайте браузер выдает белую страницу (или ошибку, в зависимости
 от браузера) примерно через 30-60 секунд. (За это время файл не
 успевает загрузиться на сервер?) Я тестировал и дома, и на работе;
 просил проверить моих знакомых из разных стран и городов, ни у кого
 не получилось загрузить фото. Иногда скрипт геренит само изображение, а миниатюру не генерит.

При этом по старой схеме (где стоит ограничение 150 килобайт) все работает
изумительно.

 Что я делал:
 1) в php-скрипте прописывал строчку ini_set("max_execution_time", "30000");
 не помогает

 2) в файле .htaccess прописывал php_value max_execution_time 900
 не помогает

3) писал письма хостинг-провайдеру
не помогает

Что можно сделать еще? Спасибо

Это сообщение отредактировал(а) KonstRuctor - 11.4.2009, 00:44
PM MAIL WWW ICQ   Вверх
enof
Дата 11.4.2009, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: нет
Всего: 35



Включите вывод ошибок. Скрипт не смотрел, но скорее всего, если идет обработка изображений, то кончается выделенная память.
Цитата(KonstRuctor @  11.4.2009,  01:43 Найти цитируемый пост)
30-60 секунд.

странно.
PM MAIL ICQ Skype   Вверх
KonstRuctor
Дата 11.4.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Вывод ошибок включен.
Но браузер не выдает ошибку, просто белый экран, внизу написано "Готово"
PM MAIL WWW ICQ   Вверх
ksnk
Дата 11.4.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 2
Всего: 386



В логах сервера ошибок нет?
Нужно проверить, 
* либо файл не загружается, тогда нужно искать слова MAX_FILE_SIZE в форме, заливающей файлы и править их, либо править параметр upload_max_filesize в php.ini, либо post_max_size 
* либо загружается, но грохается на этапе обработки - банально не хватает памяти для больших картинок. У меня примерно такое вылечилось, когда я поставил 
Код

ini_set('memory_limit','128M');
 в тот участок кода, который непосредственно с изображением работает.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 11.4.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



т.е. display_error установлено в 1?
в логах-то смотрел?
PM MAIL   Вверх
KonstRuctor
Дата 12.4.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Как я могу править файл php.ini, когда он на сервере у хостера?
Зачем править MAX_FILE_SIZE? Там стоит лимит в 2 мегабайта. Больше мне не надо.
На хостинге мне доступен только access.log, ошибки смотреть не могу.
----------------------------------
Установка в файл .htaccess значения php_value max_execution_time 900
не приносить результата

Установка в php скрипт строчки ini_set('memory_limit','128M');
в то место, где идет обработка изображений
не приносит результата

* * *
Сделал тестовую форму в отдельной папке.
Только аплоад, ничего лишнего. Форма с одним полем и вывод результата на экран.
При моей скорости соединения с инетом я могу залить только 1 мегабайт.
Скрипт отлично работает.
Пытаюсь залить 1,7 или 1,8 мега -- белый экран.
У соседа скорость ниже, он и 600 килобайт залить не может.
* * *
Беда прямо

PM MAIL WWW ICQ   Вверх
ksnk
Дата 12.4.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 2
Всего: 386



Однако - телепаты нужны smile

Можно еще совет протелепать:

по симптомам получается, что кроме всяких-разных ограничений PHP есть еще и какое-то ограничение по времени одного соединения в Апаче. Как оно называется и откуда оно взялось - не знаю, не сталкивался...

Может хостинг поменять, для пробы?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
KonstRuctor
Дата 12.4.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Сделал тестовый файл-загрузчик картинок на сервер.
Задача -- принять от юзера файл на входе, только JPEG, не более 2 Мб
На выходе получить
1) файл 740 пикселей по длинной стороне в папке /test/data
2) файл 150 пикселей по длинной стороне в папке /test/data/tmb
Вот мой код:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Тестовая загрузка файла на сервер</title>
</head>
<body>

<?php

  define('UPLOAD_DIR', dirname (__FILE__).'/data/');
  define('THUMBS_DIR', dirname (__FILE__).'/data/tmb/');
  define('MAX_FILE_SIZE',  2048000);
  define('MAX_WIDTH',      150);
  define('MAX_MAX_WIDTH',  740);
  define('MAX_HEIGHT',     150);
  define('MAX_MAX_HEIGHT', 740);

if (array_key_exists('upload', $_POST))
{

  $max = number_format(MAX_FILE_SIZE/1024, 1).'KB';
  $permitted = array('image/jpeg','image/pjpeg');
  $sizeOK = false;
  $typeOK = false;

  if ( $_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE )
  {
  $sizeOK = true;
  }

  foreach ($permitted as $type) {
    if ($type == $_FILES['image']['type']) {
    $typeOK = true;
    break;
    }
  }

  if ( $sizeOK && $typeOK )
  {
      switch($_FILES['image']['error'])
      {
      case 0:

      if (is_uploaded_file($_FILES['image']['tmp_name']))
      {

        // оригинал файла, который залит во временную директорию
        $original = $_FILES['image']['tmp_name'];
        $name = "up_" . date('YmdHis');
        list($width, $height, $type) = getimagesize($original);

        // Большое ратио
        if     ( $width <= MAX_MAX_WIDTH && $height <= MAX_MAX_HEIGHT ) { $ratio_max = 1;   }
        elseif ( $width > $height )                                     { $ratio_max = MAX_MAX_WIDTH/$width;   }
        else                                                            { $ratio_max = MAX_MAX_HEIGHT/$height; }

        // Маленькое ратио
        if     ( $width <= MAX_WIDTH && $height <= MAX_HEIGHT ) { $ratio = 1;   }
        elseif ( $width > $height )                             { $ratio = MAX_WIDTH/$width;   }
        else                                                    { $ratio = MAX_HEIGHT/$height; }

        $source = imagecreatefromjpeg($original);
        if (!$source)
        {
            $result = 'Проблема с чтением оригинала файла';
        }
        else
        {
          ini_set('memory_limit','128M');
          // Вычисляем размеры миниатюры
          $thumb_width  = round($width * $ratio);
          $thumb_height = round($height * $ratio);

          // Вычисляем размеры большого файла
          $thumb_width_max  = round($width * $ratio_max);
          $thumb_height_max = round($height * $ratio_max);

          // Большое
          $thumb_max = imagecreatetruecolor($thumb_width_max, $thumb_height_max);
          imagecopyresampled($thumb_max, $source, 0, 0, 0, 0, $thumb_width_max, $thumb_height_max, $width, $height);
          $success1 = imagejpeg($thumb_max, UPLOAD_DIR.$name.'.jpg', 85);
          $created_max = $name.'.jpg';

          // Миниатюра
          $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
          imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);
          $success = imagejpeg($thumb, THUMBS_DIR.$name.'.jpg', 100);
          $created = $name.'.jpg';

          if ( $success && $success1 ) {
          $result = "ВСЕ файлы удачно созданы!";
          }
          else {
          $result = 'При аплоаде возникли проблемы';
          }
          imagedestroy($source);
          imagedestroy($thumb_max);
          imagedestroy($thumb);
        }
       }
      }
  }
  elseif ($_FILES['image']['error'] == 4) {
  $result = 'Файл не выбран';
  }
  else {
  $result = "Файл не может быть загружен! превышен лимит. Максимальный размер файла: $max.
  Допустимый формат фйайла: jpg.";
  }

}

if (isset($result))
{
echo "<p><strong>$result</strong></p><br /><br />
<img src=\"/test/data/". $created_max ."\"><br />
<img src=\"/test/data/tmb/". $created ."\">";
}

?>
<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="post" enctype="multipart/form-data" name="uploadImage" id="uploadImage">
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE; ?>" />
<p>
<label for="image">Выберите фотографию:</label>
<input type="file" name="image" id="image" />
</p>
<p>
<input type="submit" name="upload" id="upload" value="Upload" />
</p>
</form>
</body>
</html>

PM MAIL WWW ICQ   Вверх
ksnk
Дата 12.4.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 2
Всего: 386



KonstRuctor, Вообще-то ini_set('memory_limit','128M'); нужно ставить перед imagecreatefromjpeg. Так она совсем не нужна smile

А так, на локалке в Денвере очень даже работает.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
KonstRuctor
Дата 12.4.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Спасибо за содействие! В Денвере просто летает, это факт.
Проверил на Мастерхосте (не катит, но там есть возможность гибко рулить настройками php, не пробовал)
Проверил на Вальюхосте -- идеально работает
Проверил на Леиво -- просто влет работает
У меня на sweb -- никак. И 1 мег никак!!! Начиная примерно с 800 килобайт работает.
Стану завтра провайдеру письмена писать. Может скажет что.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 12.4.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Цитата(ksnk @  12.4.2009,  14:25 Найти цитируемый пост)
Как оно называется и откуда оно взялось - не знаю, не сталкивался...

max_input_time. только это относится к PHP, а не к Apache
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.