[CLOSED-SOLVED] php5.3.3 не воспринимает тэг начала кода "<?"

Доброго всем времени суток!

Столкнулся с траблой после установки php-5.3.3, ставил из дерева portage, никаких затыков при установке не возникло, apache тоже потом запустился без проблем, модуль подгрузил и ни на что не ругался, но php не заработал - все *.php страницы выводятся на экран как обычный текст! Поковыряв и подумав попробовал сделать в консоли

# echo '<? phpinfo(); ?>' | php

результат:

<? phpinfo(); ?>

...как так??
А вот когда сделал

# echo '<?php phpinfo(); ?>' | php

тогда вывод на экране был именно таким, каким и должен быть. Подскажите кто знает, почему перестал работать тэг

"<?"

? И как побороть сию траблу?

P.S. Если сделать то же через apache результат в окне браузера получается такой же

P.P.S не знал, что тут в комментах php тэги работают :)

Думаю, в php.ini можно

Думаю, в php.ini можно включить конструкцию

<? ?>

Спасибо за совет, проверил,

Спасибо за совет, проверил, но к сожалению не помогает, да и по дефолту short_open_tag = On

Хватит говнокодить!!Ставьте

Хватит говнокодить!!

Ставьте


<?php .. ?>

fix by slepnoga :)

Working on Gentoo Linux for Asus P535 and Qtopia :-)

А как быть со сторонними

А как быть со сторонними/уже сделанными скриптами? Переписывать прикажете? У меня их несколько сотен на сервере :(

Так как AS IS делаем бекап

Так как AS IS делаем бекап ;) А потом так:

$ cd /КАТАЛОГ_СО_СКРИПТАМИ
$ find . -type f -name '*.php' | while read f; do sed -i "s:<?[^php]:<?php:g" "$f"; done

# если php код есть и в html
$ find . -type f -name '*.html' | while read f; do sed -i "s:<?[^php]:<?php:g" "$f"; done

А то потом говорят что php кривой, такой, сякой.. Писать надо правильно :)

Working on Gentoo Linux for Asus P535 and Qtopia :-)

Простите пожалуйста, в мане

Простите пожалуйста, в мане сказано, что теги равносильны и должны работать, так что делали всё по чертежу, чтоб было меньше /разговоров/, потому кривой всё равно php остаётся :-P

Но за совет всё равно спасибо, правда я скорее всего не смогу его применить: скрипты не в одном каталоге, а разбросаны по папкам в соответствии с vхостами + еще в mysql дофига хранится, к тому же на сервере не только мои сайты, а фича ради которой обновляюсь нужна только мне, так что на предложение подредактировать скрипты меня скорее всего вместе с php отправят туда, где солнце никогда не светило...

Тема потеряла актуальность,

Тема потеряла актуальность, мне уже не нужно решение... :( Обновление проводилось с единственной целью: в php 5.3 был поправлен баг (точнее, был выпущен патч) с ограничением на размер файла при работе с файлами больше 2 Гб, проверил в консоли - как не работал он с большими файлами так и не работает... А жаль...

UPD: + баг с заголовком Content-Length как я понял, актуален не только для win ибо у меня он тоже обрезается до значения 2147483648 байт

P.S. Если кто нибудь подскажет как можно через readfile() запихнуть в буфер вывода больше 2 Гб поделитесь пожалуйста секретом - буду благодарен безмерно

=-O

*Эмм.. Что же это вы делаете с пхп :)

Вычитывай файл частями и кидай в буфер, но ИМХО правильнее было бы дать прямую ссылку на файл потому как гонять
большие файлы через такую цепочку трата ресурсов.

Working on Gentoo Linux for Asus P535 and Qtopia :-)

Знаю, а что делать...

Знаю, а что делать... Приходится извращаться т.к. дать прямую ссылку - большая проблема: как по идеологическим соображениям так и из за того, что файлы в системе хранятся в кодировке cp1251...

Кидать частями - это интересно, но увы, не умею... Подскажете как?

Например так: // указываем

Например так:

/**
 * @brief читает порциями файл в поток stdout
 * @remarks аналог функции readfile()
 * @param $filename имя файла для чтения
 * @param buf_len размер буфера для чтения, по умолчанию равен 64 кбайта
 * @return true, если успешно
 */
function readfile_verybig($filename, $buf_len = 0xffff)
{
    // я оптимист :D
    $result = true;

    // указываем режим b - binary
    if($f = fopen($filename, 'rb'))
    {
        while(!feof($f))
        {
            if(false === ($data = fread($f, $buf_len)))
            {
                $result = false;
                break;
            }
            
            if(false === fwrite(STDOUT, $data, $buf_len))
            {
                $result = false;
                break;
            }
        }

        fclose($f);
    }
    else
        $result = false;

    return($result);
}

// далее по коду просто
readfile_verybig("matrix.mkv");

// или так, порциями по 4 кбайта
readfile_verybig("matrix.mkv", 4096);

P.S. Чето меня поперло :D

Working on Gentoo Linux for Asus P535 and Qtopia :-)

Увы, не катит... :'-( failed

Увы, не катит... :'-(

failed to open stream: File too large

Хм ну судя по всему патч не

Хм ну судя по всему патч не вошел в эту версию php

Working on Gentoo Linux for Asus P535 and Qtopia :-)

ln -s кирилический файл $(ls

ln -s кирилический файл $(ls -i "кирилический файл"| awk '{print $1}')

отдавать файлы (тем более большие) через php это верх идиотизма.

qnikst написал(а): ln -s

qnikst написал(а):
ln -s кирилический файл $(ls -i "кирилический файл"| awk '{print $1}')

Рад бы, но там несколько Тбайт инфы, десятки (а может и сотни, не считал) тысяч файлов и инфа постоянно обновляется... В чем главное неудобство, думаю, сами догадываетесь. ...хотя читая ваш пост появилась одна мыслишка, так что спасибо :) сейчас проверю...

qnikst написал(а):
отдавать файлы (тем более большие) через php это верх идиотизма.

Отчасти согласен, а что делать? Можете предложить варианты?

P.S. Чесна гря, уже задумываюсь над тем, чтобы влезть в исходники php, чего очень не хотелось бы...

а что делать? Можете

 а что делать? Можете предложить варианты?

генерь одноразовые ссылки, отдавай через них нжинксом или апачем ( mod_ftp)

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Действительно мысль :) а я

Действительно мысль :) а я как то даже и не задумывался о "динамических" ссылках, ведь имя то им можно дать в чем угодно, хоть латиницей, хоть в utf8. Спасибо идея действительно стоящая! :) И ведь такое несложное решение, а не дошло самостоятельно... :(

ну мой вариант был просто

ну мой вариант был просто предложением, как сделать временную ссылку без каких-либо серьёзных изменений в чём-либо кроме базы данных.
Почему php плохо - потому-что апач и тем более nginx имеюх хорошо отработанные средства отдачи файлов, не запускаются лишние процессы php, не производится лишних действий и использований памяти.
Однако есть проблема: если нужна авторизация, то "нахаляву" её не реализовать. Т.е. у nginx есть возможность использования "защищённых" url, когда он перед тем как отдать файл, запрашивает определённый скрипт на предмет разрешения и по заголовку от него понимает, что делать. Поскольку там используются redirect-ы то по идее и проблему с кириллическими именами можно обойти.

А вообще любое решение, если оно решает задачу уже хорошо. Поэтому если вы научили php отдавать такие файлы, то это хорошо, а дальше уже нужно смотреть на то, нужны ли более удобные (или практичные) реализации.

Ура! Нашел решение "корневой"

Ура! Нашел решение "корневой" проблемы, ради которой и затеял сначала обновление :) Опишу его тут, несмотря на то, что (как говорит товарищ qnikst) это извращение - вдруг кому нибудь пригодится :)

Итак, сначала пересобираем php с изменением CFLAGS

~ # CFLAGS="-D_FILE_OFFSET_BITS=64" emerge php

после чего функции fopen(), readfile() и filesize() (а может и еще какие нибудь) начинают корректно работать с файлами > 2 Гб. Источник информации тут и автор сулит серьёзные проблемы с apache после такой сборки, но у меня ни одной проблемы обнаружено не было.
После этих действий уже можно качать через php большие файлы (проверял максимум на 11,2 Гб) но тогда при закачке размер файла будет неизвестен браузеру до её окончания, полосы прогресса так же не будет, а всё из за аналогичного ограничения для заголовка Content-length передаваемого функцией header(). Для того, чтобы она работала правильно, применяем к php этот патч, он для версии 5.3.3 поэтому я, чтобы не возиться с редактированием патча, ebuild'ом и т.п. сделал сперва

~ # CFLAGS="-D_FILE_OFFSET_BITS=64" ebuild /usr/portage/dev-lang/php/php-5.2.14.ebuild unpack

затем внёс вручную изменения в нужные файлы - там и дописать то надо всего 3 символа - и затем просто

~ # CFLAGS="-D_FILE_OFFSET_BITS=64" ebuild /usr/portage/dev-lang/php/php-5.2.14.ebuild merge
~ # /etc/init.d/apache2 restart

Вот и всё :) теперь мы не только без проблем качаем большие файлы, но еще и видим их реальный размер :) ... А вообще отчасти я согласен с qnikst: передача файлов таким образом - немного извращение и в дальнейшем я попробую переделать скрипты, чтобы работало через одноразовые ссылки, как посоветовал slepnoga.

Огромное спасибо всем, кто принял участие в обсуждении и помог советами ;-)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".