ФорумПрограммированиеPHP для идиотов → file() и большие файлы

file() и большие файлы

  • chubaka

    Сообщения: 4 Репутация: N Группа: Кто попало

    Spritz 15 марта 2008 г. 19:00

    Есть файл 3Мб ~100 000 строк, надо вывалить в массив.
    В документации написано что file() не работает с файлами > 10Мб, а у меня на порядок меньше. Самое страшное что альтернатива
    function fileget($sFile) 
    {
    $fd = fopen ($sFile, "r");
    while (!feof ($fd))
    {
      $buffer = fgets($fd, 4096);
      $lines[] = $buffer;
    }
    fclose ($fd);
    }

    тоже не работает. Что делать?
    P.S. Скорость очень критична.
    P.P.S. Восстановление пароля на пыхе не работает?
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 15 марта 2008 г. 19:33, спустя 33 минуты 30 секунд

    В документации написано что file() не работает с файлами > 10Мб, а у меня на порядок меньше.

    Ну и? Не работает что ли?

    Самое страшное что альтернатива тоже не работает

    Что значит не работает? В чем это проявляется?

    Скорость очень критична.

    Если скорость критична, позволю себе сделать вывод, что это не для одноразового/редкого использования? Может, имеет смысл не использовать файлы, а поискать другой способ? Опишите задачу подробней, зачем это нужно?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 16 марта 2008 г. 5:47, спустя 10 часов 13 минут 33 секунды

    Что в sFile?
    В чем проявляется "не работает".
    Зацените: file_get_contents()

    На пыхе всё работает, а если что-то не работает, опишите, пожалуйста, подробнее.
  • metalalisa

    Сообщения: 7 Репутация: N Группа: Кто попало

    Spritz 16 марта 2008 г. 6:26, спустя 39 минут 3 секунды

    file_get_contents() работает не во всех версиях РНР

    поэтому надо делать такой финт


    if (!function_exists('file_get_contents')) {
    function file_get_contents($sFilename) {
    $fd = fopen ($sFilename, "rb") || die "Cannot open $sFilename";
    $contents = fread ($fd, filesize ($sFilename));
    fclose ($fd);
    return $contents;
    }
    }
  • metalalisa

    Сообщения: 7 Репутация: N Группа: Кто попало

    Spritz 16 марта 2008 г. 6:29, спустя 2 минуты 54 секунды


    На пыхе всё работает, а если что-то не работает, опишите, пожалуйста, подробнее.


    глючит Предварительный просмотр. В этом режиме все посты топика видны как будто к ним применили htmlspecialchars()
    А после повторного предпросмотра нового сообщения русские буквы заменяются последовательностями вида &0123#, но после сохранения все ок.
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 16 марта 2008 г. 6:41, спустя 12 минут 1 секунду


    file_get_contents() работает не во всех версиях РНР
    Да 90% функций, которые есть в PHP5 не было в PHP/FI 2 и что все теперь будем переопределять? Или все-таки будем пользоваться недоисторическими версиями?
  • welder

    Сообщения: 2945 Репутация: N Группа: в ухо

    Spritz 16 марта 2008 г. 6:52, спустя 10 минут 41 секунду

    а чо ещё ктото 4ку юзает ?
  • chubaka

    Сообщения: 4 Репутация: N Группа: Кто попало

    Spritz 16 марта 2008 г. 9:27, спустя 2 часа 35 минут 20 секунд


    Зацените: file_get_contents()

    С этой проблемой разобрался, с функцией всё в порядке, проблема была в upload_max_filesize, все простите за глупый вопрос.

    На пыхе всё работает, а если что-то не работает, опишите, пожалуйста, подробнее.

    Мой логин - chuwy, пытался воостановить пароль по лоигну и по email'у, система говорит что отправила, но ничего не приходит. + с metalalisa тож согласен (браузер FF3b4)…
  • chubaka

    Сообщения: 4 Репутация: N Группа: Кто попало

    Spritz 16 марта 2008 г. 9:38, спустя 10 минут 42 секунды

    В продолжение темы…
    есть функция обрабатывающая подобие ini-файлов:
    	function parse() {
    global $aKeywords;
    if (count($aKeywords) == 0) return array();
    $aSections = array();
    $aValues = array();
    $iSections = 0; //Количество секций [blah-blah]
    foreach($aKeywords as $sLine)
    {
    if ($sLine == '') continue;
    if ($sLine{0} == '[')
    {
    $aSections[] = substr($sLine, 1, -1);
    $iSections++;
    continue;
    }
    $aValues[$iSections - 1][] = rtrim($sLine);
    }
    for ($i=0; $i<$iSections; $i++) $aResult[$aSections[$i]] = $aValues[$i];
    return $aResult;
    }[/php]
    В $aKeywords находится массив из file($sFile), в нём около 200.000 значений, т.е. rtrim() повторяется оч много раз и этим сильно тормозит скрипт (на 30 сек).
    Вопрос: Можно как-нибудь другим способом избавиться от \n?
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 16 марта 2008 г. 12:22, спустя 2 часа 44 минуты 16 секунд

    да, с рассылкой писем проблемы. В основном это настройки сервера, каких-то нестандартных хедоров требует.
    в планах есть смена хостинга. но с хедарами тож разбираться буду.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!