0
Другие записи за это число:
2010/05/31 - Про фотки и движок
<< предыдущая заметкаследующая заметка >>
31 мая 2010
блядские версии PHP

Только что правил одну проблему: у человека на хостинг не встал движок. То есть движок встал, а пароль админа не записывался. Оказалось: в блядской поставке PHP отсутствует простейшая функция file_put_contents. Заметим: не права PHP на запись файла (что дикая редкость в наши дни), а сама функция. Причем, инсталлятор работал, потому что я туда уже вставил когда-то заплатку:

if(!function_exists('file_put_contents')) { function file_put_contents($url,$s) { $f=fopen($url,'w'); fputs($f,$s); fclose($f); chmod($url,0666); } }

Но в сам движок блога (который по понятным причинам не связан с автономным инсталлятором) почему-то не поставил — о чем я думал? Соответственно, при попытке задать пароль движок пытался прописать хэш в файл конфига (чтобы пользователю не делать это руками по ftp как в первых версиях движка) и обламывался. Сейчас вписал заплатку и в движок.

Подумалось: скажите, кто сталкивался, а какие еще функции могут отсутствовать в разных поставках PHP, и надо писать заплатки?

Мне пока приходит в голову только CURL. Не помню, встречается ли он у меня где-то в движке, но обязательно будет нужна отправка POST-запросов — мало ли, модуль копирования в ЖЖ делать или что-то еще. Столкнулся с этим на прошлой неделе на Нокии — там CURL был, но вис. Поэтому перепишу все без CURL. И на ICONV явно придется вешать заплатку (его в Нокии нет, поэтому движок там пока не поднялся). Эту гадость (ICONV) кстати частично эмулирует своей заплаткой модуль Аякса JsHttpRequest.php (единственный чужой модуль, которым пользуется движок). Надо бы его оттуда вытащить в основное место и таблиц кодировок еще добавить.

А какие еще могут отсутствовать основные функции в разных версиях PHP?

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Windows Firefox
3
0
Roman
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
у меня из php-сообщений вылазит только:

 «Warning: set_time_limit() has been disabled for security reasons in [...]/blog/install.php on line 9»

ну и еще у меня «memcache сдох...», хотя в php-поставке это memcache вроде бы включено...

но это до сих пор никак не влияло на работу движка ;)
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Да, с memcache надо тоже довести до ума, все времени не было, хотя уже разобрался, как, чтобы он автоматически включался и автоматически нащупывал свой порт.
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
time_limit означает, что движок попросил неограниченное время на выполнение в скрипте install.php (из тех соображений, что обновлять файлы движка по сети может занять длительное время, если их много), но ему не дали.

На практике это означает, что при сильных обновлениях через install (на практике такое бывает только в момент первой инсталляции) придется запустить его несколько раз подряд, пока не обновит все. Скрипт устроен так, что сам разберет, какие файлы он скачать не успел или докачал не полностью.
Windows Firefox
1
0
Roman
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
ну я приблизительно что-то в этом роде и подозревал ;)
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Гораздо печальнее, что у меня внутри Нокии движок пока не встал. А ведь я хотел сделать в движке режим зеркала, который бы позволял на Нокии или на ноутбуке в поездке писать обзоры и отвечать на комментарии в автономном режиме, а при появлении интернета, оно бы само автоматически синхронизировалось с "основным" движком - заливало туда свои обновления и выкачивало в локальную копию то, что обновилось на сайте за это время (комментарии, например), чтобы после разобраться на досуге или в самолете или на даче, и поотвечать.
Windows Safari Chrome
3
0
vlom
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Так вот он какой, гипертекстовый фидонет!
Windows Opera
0
0
Wot
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Вообще, поскольку PHP собирается из исходников может не быть чего угодно, но это конечно экстремизм.

А к стати какая там версия PHP ?
Linux Firefox
1
0
alff31
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
PHP Version 4.4.4
Хостинг от sweb.ru.
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
делал для себя такую штуку - проверяльщик минимальной версии PHP, которой требуют скрипты http://www.webtask.ru/phpversioning/
Nokia-E90 Safari
 Москва
0
0
LLeo Nokia
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Здесь не та проблема.

Вопрос не в том, чтобы подобрать версию PHP для движка, а в том, чтобы обеспечить его работоспособность на большинстве версий при помощи заплаток и хитростей. Обойдя, так сказать, максимальное количество граблей.

Причем, такие штуки как iconv и curl вообще не зависят от версии PHP.
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Там указывается не только версия, но и дополнительные необходимые модули для пхп.
Используете curl вместо fsockopen? Проверьте наличие оного через extension_loaded или напишите свою библиотеку.
Есличе, iconv включен в пхп с версии 4.0.5 .

Мой скрипт просто выдирает названия функций и находит минимальную версию ПХП для каждой. В принципе, можно выводить такой список по убывающей для наглядности, а дальше google.com/codesearch в помощь на запрос function[\s\r\n]+file_put_contents .

Каждому мудаку не объяснишь почему у него не работает движок. Но можно увеличить резервы собственного времени если сделать в скрипте проверки как раз на версию и загруженные модули. У самого была такая мания сотворения заплаток для работоспособности моих движков. Черт побери, это очень увлекательно!
Nokia-E90 Safari
 Москва
0
0
LLeo Nokia
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Так есть какие-то готовые заплатки? Типа той, что я опубликовал по поводу file_put_contents?
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Здрасте приехали, этих запладок полный google.com/codesearch

Например, моя выглядит так:
if(!function_exists('file_put_contents'))
{
if(!defined('FILE_APPEND'))
{
define('FILE_APPEND', 1);
}
function file_put_contents($file, $d, $flag = false)
{
$mode = ($flag == FILE_APPEND || strtoupper($flag) == 'FILE_APPEND') ? 'a' : 'w';
$f = @fopen($file, $mode);
if ($f === false)
{
return 0;
}
else
{
if (is_array($d)) $d = implode($d);
$bytes_written = fwrite($f, $d);
fclose($f);
return $bytes_written;
}
}
}
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Мне кажется или у меня сильно короче получилось? ;)
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
В вашем варианте функция не возвращает количество записанных байт, зачем-то делает чмод после записи (может добавить параметр? и не предоставляет самый главный охуенчик - добавлять данные в файл). Ваша замена работоспособна и прекрасно коротка, но работает хуево.
Nokia-E90 Safari
0
0
LLeo Nokia
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Это все, что мне надо, без лишнего говна. Интересно, зачем людям количество записанных байтов? Они что, не уверены, что записалось то, что они хотели?

Что касается chmod - я это делаю для того, чтобы файл (например конфиг) был доступег плльзователю по ftp в том случае, если сервер сконфигурирован так, что файл, записаный PHP, юзеру не доступен на запись по умолчанию.
Windows Safari Chrome
4
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Бывет и так, что полностью не записывается то, что хочешь. Может, это как-то связано с квотами места, параллельной работой или сбоями диска.
Конечно, сравнение кол-ва записанных байт и длины данных лучше бы перенести в саму функцию, но такое значение возвращает встроенный в ПХП file_put_contents. Предсказуемость результата на выходе снимет у меня лишние волнения по поводу дальнейшей разработки и поддержки.
Windows Opera
0
0
bolk
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
http://pear.php.net/package/PHP_Compat
модуль для эмуляции отсутствующего
Mac Opera
14
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
> Интересно, зачем людям количество записанных байтов? Они что, не уверены, что записалось то, что они хотели?

Как ни печально, но ты, lleo, говнокодер. Если делаешь замену стандартной функции, будь добр делать ее так, чтобы поведение повторяло оригинал. Это касается и chmod тоже.
Linux Firefox
 Москва
1
13
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Пиздец, какая интересная логика - внутри своих единоличных разработок обеспечивать в процедуре ту часть функционала, которая мне никогда не потребуется. Это на какого дядю с плеткой вы трудились, что вам так мозги засрали?

Я правильно понимаю, что когда вам приходится есть шашлык, уже снятый с шампура, вы его на палец натыкаете, чтобы повторить оригинальный процесс откусывания? :)
Mac Opera
6
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Очень типичный для говнокодера ответ. Ты бы вместо того, чтоб огрызаться, подумал, почему так.

Объясню. Если тебе не важен результат, возвращаемый file_put_contents, заведи себе функцию my_file_put_contents, которая будет работать так, как тебе надо. И везде именно ее и используй. Внутри она может быть реализована как угодно - через стандартную file_put_contents, через fopen/fputs/fclose или еще 20-ю способами. Но внешнее поведение ее _всегда_ будет одним и тем же. Этим ты не введешь в заблуждение никого, и себя в том числе. Тем более что делается это чрезвычайно просто, а собственные усилия в будущем экономит.

Что же касается "единоличных разработок" - я ошибаюсь, или этот движок уже куча народа использует?
Linux Firefox
 Москва
0
12
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Вот он, программизм головного мозга в терминальной стадии. А в документацию PHP заглядывать никогда не пробовали? Там, знаете ли, от версии к версии у каждой второй функции появляются дополнительные фичи и параметры. Напишите скорее разработчикам PHP, пусть всякий раз называют функцию другим именем. А то мало ли, введется кто-то в заблуждение, не обнаружив привычных элементов у одноименной функции. Ведь пишущих на PHP - миллионы, а пишущих внутренний код моего движка - я один. Скорее, скорее, предотвратить катастрофу!
Windows Opera
0
0
Gryzchick
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Надо действительно написать разработчикам PHP, а то с функциями у них полный дурдом. Очень плохая аналогия. И тем не менее, даже разработчики PHP разделили mysql_escape и доработанный mysql_real_escape.
Mac Opera
8
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
То, что авторы ПыхПых-а - говнокодеры, никто и не отрицает. Но это же не повод самому быть таким же, не? А то здорово получается - они срут где попало, значит и мне можно!

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

Я ведь объясняю очевидные вещи исключительно оттого, что отношусь к тебе "с оттенком доброжелательства". А апломб твой и горячий слог на меня не действуют, можешь не стараться.
Linux Firefox
 Москва
0
9
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
А, вот теперь все понятно. Сейчас вспомню, как полагается на такое отвечать по инструкции. Э-э-э... СУКО ТЫ ГОВОРИШЬ ЧТО ЭТО БЕЗВРЕДНО А У МЕНЯ ДРУГ ОТ ЭТОГО ГОВНА УМЕР!!! Нет, не то. Вот правильный ответ: вы так это произносите, будто в этом есть что-то плохое!
Mac Opera
11
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Поражение логики — самое коварное заболевание роботов. И коварно оно вовсе не тем, что неизлечимо — сказки про неизлечимость ППЛ вам еще расскажут многочисленные дилетанты с красным огоньком. Коварно оно именно тем, что больной не готов серьезно лечиться.
(c) lleo

Коротушка, ярко выраженный случай
Windows IE
5
0
AU
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
none верно пишет. Предлагаемый подход сбережет время в будущем, даже если в даном случае это кажется лишним.
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Дополнительные параметры появляются далеко не у каждой функции и, как правило, они не влияют на работу предыдущей версии засчет значений по умолчнию этих новых параметров.
Windows Safari Chrome
0
1
alexeybobkov
В вашем утверждении отсутствует логика. Если поведение переписанной функции будет повторять оригинал, зачем тогда её вообще заменять?
Mac Opera
3
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Логика отсутствует именно в вашем утверждении. В данном случае замена нужна, т.к. file_put_contents нет в наличии в конкретной сборке php.

А уж если делаешь собственную реализацию стандартной функции, поведение обязано соответствовать оригиналу. Это называется "внешний контракт". Пользователя этой функции вообще не интересует как именно она устроена внутри, но он может полагаться на то, что ее внешнее поведение всегда будет одинаковым.
Linux Firefox
 Москва
0
2
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Description
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )

Note: Context support was added with PHP 5.0.0.

Страшно подумать, как живут пользователи fopen, попав на PHP 4. Полагаю, любой, использующий функцию fopen, обязан в коде своей программы проверить версию PHP и для старых версий - написать модуль, эмулирующий опцию Context для совместимости. Она конечно нахуй никому не нужна была сроду, но вдруг кто-нибудь, кто возьмется переписывать код вашей программы, решит использовать эту таинственную опцию, а она не реализована!
Mac Opera
2
1
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Ну шо я вам могу сказать за этот персик? (c) тетка с Привоза

Таки да, обязан. Если, конечно, не говнокодер.
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
У вас какие-то странные примеры от марсианских разработчиков. Если context используется в fopen, значит мне необходимо найти хостинг с php5 (кстати, очень замечательный стимул для распространения новых версий языка). В php5 все скрипты, написанные для php4 будут работать.

Переписывание функции - крайняя мера, когда ничего уже нельзя сделать, чтобы скрипт заработал.
Linux Firefox
 Москва
0
7
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Речь не об этом, просто товарищ настойчиво предлагает реализовать дополнительные особенности file_get_contents (типа возврат реального числа записанных байт, хотя если записалось не все, что я просил, то это просто пиздец), которыми я никогда в жизни не пользовался ни в коде движка, ни в других работах, и пользоваться не собираюсь. Типа, бюрократии ради.

Судя по характерным оборотам и особенностям языка - товарищ просто шутки ради троллит и стебется, не со зла, а развлечься. Поэтому всерьез не надо :)
Mac Opera
6
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Молодец, lleo! Еще чуть-чуть самообладания, и мы сможем продолжить беседу в конструктивном ключе!

Насчет file_put_contents. Меня, вообще говоря, конкретно эта функция не интересует. Можешь оставить как есть, я все равно твоим движком пользоваться не буду. Но - подход! Я так сделал и знать ничего не хочу! Не хочешь знать - получи ярлык. По-моему, справедливо.
Mac Opera
6
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Да, и вот еще что. Я не настаиваю на полной реализации file_put_contents. Я говорю о двух вариантах:

1. Своя функция my_file_put_contents. Своя реализация, делает только то, что тебе нужно. Как реализована внутри - неважно. Нигде в коде движка ПыхПышная file_put_contents не вызывается, за исключением только внутренностей my_file_put_contents. Просто, доступно и проблем дурацких нет.
2. Полная реализация file_put_contents, если ее не оказалось в поставке. Со всеми флагами и поведением, да. Очевидно, что этот вариант годится только если первый не подходит по каким-либо причинам.

Иные варианты, или смесь их (как у тебя сделано) - говнокодерство, за исключением совсем особых обстоятельств. Точка.
Windows Opera
6
0
Zulkar
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Это не бюрократия, это реальная необходимость. У вас в движке есть модули, которые могут использовать file_put_contents и полагаться на то, что эта функция возвращает число записанных байт. Если этого нет, либо будет работать неправильно модуль, либо каждый из разработчиков модулей будет добавлять свою собственную реализацию этой функции. Как ни печально, но именно из-за этого PHP и считается языком быдлокодеров. Хотя сам язык неплох.
Windows Safari Chrome
0
1
alexeybobkov
Про необходимость замены - да, вы правы, я был невнимателен и не заметил контекста разговора.
Насчёт всего остального... вы что-то слишком категоричны. Заменять стандартную реализацию на собственную иногда приходится (особенно если программируется нечто сильно отличное от сферического коня в вакууме).
У нас, например, переписана printf из стандартной библиотеки C++. Она добавляет время с точностью до миллисекунд в начало каждой стороки. Почему? А потому что НАМ ТАК НУЖНО. И никто даже по случайно не должен выводить сообщение на консоль без времени.
Я уже не говорю про простой патч, который у Леонида. Вам никогда не приходилось делать патчи?
Linux Opera
10
0
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Понимаете, если функция стандартна и ее поведение специфицировано, то делать ее замену, но с другим поведением - означает ходить по граблям. Конечно, бывают случаи, когда это оправдано, но ОЧЕНЬ редко.

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

Расмотрим ситуацию у lleo. У него получается своеобразная солянка - если в конкретной поставке есть функция file_put_contents, файл, созданный с ее помощью, будет иметь права, соответствующие umask процесса, в котором он исполняется (apache). Если же такой функции вдруг нет - начинает действовать собственная реализация и (о чудо!) файлы будут получаться с совсем другими правами! Очень вероятно, возникнут баги, в которых разобраться будет крайне тяжело, особенно когда эта деталь (собственная реализация) забудется. То, что она забудется, несомненно, об этом lleo и сам пишет в начале - о забывчивости.

А с возвращаемым значением? lleo, очевидно, не в курсе, зачем надо проверять возвращаемое значение. Он считает, что достаточно просто вызвать функцию, а как она отработала - это уже не его дело. А если на сервере дисковая квота? А если файл на nfs лежит? Эти и многие другие причины даже не приходят ему в голову.

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

lleo человек безусловно талантливый, но когда он занимается программированием, этого лучше не видеть, ей-богу.
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Простите что дергаю за такие личные ниточки, но вы сами заговорили об этом. Вас драл отец, а вы сейчас мстите ему, надирая задницу Каганову. Если бы вы действительно не обижались на отца, то и не вспомнили бы никогда такой эпизод из своей жизни. Конечно, я не имею никакого морального права указывать вам на это, но хочу заметить про азы общения - умный никода не назовет дурака дураком, ему это даже в голову не придет.
Mac Opera
3
1
none
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Оставим в стороне вопрос с отцом (хотя форумная психология меня повеселила, да).

Но Каганову я вовсе не пытаюсь надрать задницу, это вы что-то напутали. Просто не люблю говнокодеров. Хотя, надо признать, поциент исправляется - вон, последний комментарий уже похож на что-то человеческое. Все-таки мы lleo любим, хотя иногда он и заебывает.

И вот еще, кстати. Насчет азов общения. Умный, мол, не назовет дурака дураком и прочие серенады - вас кто-то обманул, ей-богу. Не доверяйте больше этим людям, они вас еще не раз обманут. Я вас жалею, поэтому правду говорю. Вот ей-ей!
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Да, вы меня действительно обманули. Ей-ей!
Windows Firefox
0
0
dimmik
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
"Умный, мол, не назовет дурака дураком и прочие серенады - вас кто-то обманул, ей-богу."
Это не умный. Это мудрый.
А Ллео - говнокодер, да. Он вроде и не скрывал никогда.

Но мы его любим не только за это.
Mac Safari
0
0
Дима
Ай-ай-ай. Разве можно так палиться, что вы читали Лиз Бурбо? Она ж просила никому не пересказывать содержание ее книг.
Windows Safari Chrome
0
0
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
То есть, вы написли этот комментарий, чтобы рассказать как читали Лиз Бурбо?
Mac Safari
0
0
Дима
Да.
Windows Safari Chrome
0
1
курец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Она ж просила никому не пересказывать содержание ее книг.
Linux Firefox
0
0
Артем Павлов
Оффтоп

В аяксовом модуле search.php в режиме поиска всех тэгов у меня плохо отрабатывал запрос "SELECT DISTINCT `tag` FROM `dnevnik_tags` ORDER BY COUNT(`tag`)" (возвращал только одно значение). Я отыскал другой способ - "SELECT `tag` , COUNT( `tag` ) AS freq FROM `dnevnik_tags` GROUP BY `tag` ORDER BY freq", тогда все заработало как надо. Не знаю, будет ли он работать везде, но люди советуют именно его.
Linux Firefox
0
0
Артем Павлов
Тогда кстати, сразу можно будет написать примерно следующее
foreach($mm as $l) $o.="[li][span class=scr onclick=\"majax('search.php',{a:'tag',tag:'".h($l['tag'])."'})\"]".h($l['tag'])."[/span]&nbsp;".$l['freq']."[/li]";
без дополнительных запросов к базе. Ну и отправить сразу на клиент.

Движок, зараза, не дает тэги использовать, пришлось все угловые скобки на квадратные заменить...
Windows IE
0
1
{name}
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Да чё вы к человеку пристали, НЕНРАВИТСЯ ПИШИТЕ САМИ.
Windows Firefox
0
0
{name}
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Доброго времени суток.
Пишу сюда, т.к. на http://lleo.aha.ru/blog/lleoblog комменты уже закрыты.
Попробовал поставить Ваш движок - что-то пока не получилось.
При запуске install.php вроде все нормально - выводится:
PHP working, congratulations :) - ok
CURL module - ok
ICONV module - ok
GB module - ok
Permissions - ok
Connect to http://lleo.aha.ru/blog/ - ok
Admin passworis d not define: admin is anybody, who open this page - ok
$filehost = /var/www/blog/ - ok
Далее нажимаю Check, Update.
Тут вылезает первое предупреждение: Warning: chmod() [function.chmod]: No such file or directory in /var/www/blog/install.php on line 201
Далее опять Check.
Notice: Undefined index: USER in /var/www/blog/install.php on line 420
и страничка заполнения config.php
После заполнения все норм.
Create .htaccess - ok
Admin passworis d not define: admin is anybody, who open this page - ok
Но при попытке зайти в mysite.ru/blog/admin говорит, что страница "Has not found"...
Это у меня косяк и руки кривые или в скрипте какая-то ошибка?
Конфигурация сервера: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch Server, права на директорию, где лежит install.php - 0777
Буду благодарен, если сможете помочь.
Nokia-E90 Safari
0
0
LLeo Nokia
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
У вас на сервере не включена поддержка .htaccess, без нее движок работать не сможет.
Linux Firefox
0
0
turaru
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Стало быть, под nginx (который наше всё) работать не будет.
Linux Safari Chrome
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
А ничего, что у меня сайт под nginx, и все прекрасно работает?
Linux
0
0
turaru
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Ничего, если за nginx сидит апач.
Windows Opera
4
0
bolk
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Лео, в руководстве по PHP написано в какой версии появилась функция и какие модули обязательны. Ты всё-таки прочитай хоть раз руководство по языку.

Отсутствие file_put_contents означает, что перед нами PHP4.

Такую эмуляцию file_put_contents как делаешь ты, делать нельзя. Между обнулением файла и fputs может произойти операция чтения и у тебя прочитается файл нулевого размера.

Правильно — открыть файл на добавление (режим «a»), заблокировать эксклюзивно flock($f, LOCK_EX), обнулить файл (ftruncate), перемотать к началу (rewind), записать, закрыть.
Linux Firefox
 Москва
0
3
Леонит Каганофф
Такую эмуляцию file_put_contents как делаешь ты, делать нельзя. Между обнулением файла и fputs может произойти операция чтения...

Дружище, все конечно прекрасно, только надо уметь мыслить в рамках прикладной задачи. Которая не подразумевает подсчет записанных байт, параллельный доступ и т.п. Где у меня в движке применяется file_put_content? Ну уж наверно не при показе страниц посетителю, верно?

Использовать запись в файлы при запросах посетителя - это архитектурная дикость, не оправданная ничем. Запись некого файла на физический носитель - чисто админская фича, которая используется разве что в блоке инсталляции и апгрейда движка, при изменения админом опций заливки фотографий, ну может еще где-то в подобных местах, где админ производит настройку. Какое параллельное чтение? О чем вы?

Поэтому вы делаете ту же ошибку - пытаетесь построить "универсальность" как самоцель в отрыве от прикладной задачи. Прикладная задача не подразумевает многопользовательский доступ при записи файла. А если такое возникло - то это повод не совершенствовать функцию записи, а подумать, где архитектурная ошибка в проекте и как такое произошло, что запись файла стала многопользовательским развлечением.
Windows Opera
3
0
bolk
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
> Дружище, все конечно прекрасно, только надо уметь мыслить в рамках прикладной задачи. Которая не подразумевает подсчет записанных байт, параллельный доступ и т.п. Где у меня в движке применяется file_put_content? Ну уж наверно не при показе страниц посетителю, верно?
Не знаю, честно. Я за адекватную эмуляцию ещё и потому, что через несколько месяцев мне не придётся вспоминать что умеет, а что нет реализация этой функции в конкретном проекте.
Linux Firefox
 Москва
0
3
Леонит Каганофф
Еще раз попробую сформулировать: запись файла на диск - это очень стремная в плане безопасности и ресурсов операция. При веб-проектировании ее нельзя применять там, где идет посетительский поток. Поэтому вспоминать следует не о том, насколько хорошо обрабатывается параллельный доступ при записи файла, а о том, как спроектирована система, чтобы параллельных операций не возникало, и запись файла на диск была исключительно редким событием лишь в целях изменения настройки и конфигурации.

Проще говоря, можно заботиться о заплатках на рот, чтобы не залетали мухи, а можно заботиться о том, чтобы не возникало надобности ходить с открытым ртом. Мне второй вариант кажется более правильным.
Windows Opera
3
0
bolk
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Леонид, я тебя, конечно, уважаю, но уж точно не тебе учить меня как делать сайты, в том числе посещаемые ;)

Я рад, если у тебя нет прямых (из PHP) файловых операций записи, тогда, видимо, тебе не нужна такая функция. Но если ты хочешь, чтобы твой код дорабатывали (а ты этого хочешь, я не ошибаюсь?), лучше будет, если file_put_contents будет привычно вести себя под любой версией PHP.
Linux Firefox
 Москва
0
5
Леонит Каганофф
Я, если перечитать ветку, вообще никого и не учил (учили как раз меня), просто излагал свое мнение по некому вопросу. Если же ты воспринял мои слова как поучение и принялся отпираться и хвастаться сделанными сайтами - это не в плюс тебе ;)

Что касается сути вопроса, повторяю в третий раз: НЕТ, я НЕ ХОЧУ, чтобы мой код дорабатывали так, чтобы возникали множественные попытки записи файлов на диск. Нахуй гнать таких доработчиков.
Windows Safari Chrome
0
2
дима лобурец
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Из того, что написано ничего, ну или почти ничего не понял, но Ллео прав.
Linux Firefox
0
0
turaru
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Да, к разборке малость опоздал.

В PHP можно отключить практически любую функцию через директиву disable_functions в php.ini, чем многие хостеры и пользуются, отключая всякие подозрительные функции работы с файлами и удалёнными URL-ями.

Так что лучше проверять присутствие всяких экзотических функций перед использованием.

всего комментариев: 64

<< предыдущая заметка следующая заметка >>