LINUX.ORG.RU

[PHP] а какие реальные пролемы появлялись у Вас при работе с PHP ?

 


0

0

Часто слышу, что писать на PHP - не кошер. Не понимаю почему. На мой взгляд этот язык создан чтобы на нём писали web (и только web).

Зачем привинчивать костыли к перлу, чтобы он мог конкурировать?

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

★★★★★
Ответ на: комментарий от anonymous

> что есть вполне приятный PDO
да все знают, но никто не юзает, не удобно видите-ли, так что толку - чуть

FollowTheRabbit
()
Ответ на: комментарий от KRoN73

>А почему у меня юникод с 2004-го работает? :) Я ссылку выше кидал, все ходы записаны :)

Десяток-другой функций, переписанных сравнительно недавно, не считается.

Хм. А почему у меня все четыре ядра легко загружаются? :D

Четыре посетителя пришло ? ;-) И сожрали весь проц ;-) В то же время пока поток стоит на ожидании данныхот БД, планировщик мог бы в это время переключить на другой поток, но таких же штук у пхп нет в принципе. Я вообще молчу про возможность что-то исполнять в фоне.

В любом случае это не принципиально :)

Кому как. Для коротких скриптов вроде куда ни шло, но как-только дело доходит для чего-то посложнее, то оказывается, что тот сборщик мусора, который есть, работает настолько чудесно, что для верности пишут обычно unset для переменных, не ?

ef37 ★★
()
Ответ на: комментарий от anonymous

> Я к тому, что если у тебя 7.(9), то и выводи 7.9, а не 8.

[quote]
void echo ( string $arg1 [, string $... ] )
[/quote]

http://ru2.php.net/manual/en/function.echo.php

[quote]
If either operand is a float, then both operands are evaluated as floats, and the result will be a float. Otherwise, the operands will be interpreted as integers, and the result will also be an integer.
[/quote]

http://php.net/manual/en/language.types.type-juggling.php



Что выдает echo(0.7)? Учитывая что echo - это опреация над строками, округление кажется вполне уместным.

stevejobs ★★★★☆
()
Ответ на: комментарий от anonymous

>Я к тому, что если у тебя 7.(9), то и выводи 7.9, а не 8

Плавучка не знает, что такое 7.(9). Она может знать, что такое 7.9999999999. А отбрасывание дробной части для такого числа даст 7.

Нет, серьёзно, неужели столь важные моменты в институтах больше не преподают?

Причем не отличить, целое там 8 или такое вот «округлённое».


Опять же, это фундаментальные моменты в области программирования.

В высокоуровневых языках не стоит так жестоко уходить в машинные нюансы с этими плавающими точками.


А телепатию пока компьютеры не осилили.

KRoN73 ★★★★★
()
Ответ на: комментарий от FollowTheRabbit

>php хорош для маленьких проектов
[...]

Та техника работы с sql, которая используется почти всегда


Э... Ты уж определись, или большие проекты, или прямая работа с SQL :) Это вещи мало совместимые...

KRoN73 ★★★★★
()
Ответ на: комментарий от stevejobs

> Что выдает echo(0.7)? Учитывая что echo - это опреация над строками, округление кажется вполне уместным.

Проверил, echo(0.7) таки выдает «0.7». Хм)

stevejobs ★★★★☆
()
Ответ на: комментарий от anonymous

>Я к тому, что если у тебя 7.(9), то и выводи 7.9, а не 8

Это неправильно. 7.9 отличается от 7.(9) на 0.09, а 8 - только на 0.0000000000000008 с копейками.

legolegs ★★★★★
()
Ответ на: комментарий от KRoN73

Ты уж определись, или большие проекты, или прямая работа с SQL :) Это вещи мало совместимые...

друг собеседовался в мэйлру перловиком, говорит что в основном спрашивают извраты над SQL. Кстати, не взяли, в следующий раз собирается учить извращения над SQL еще более упорно.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

> Что выдает echo(0.7)? Учитывая что echo - это опреация над строками, округление кажется вполне уместным.

[~]$ php
<?php echo(0.7); ?>

0.7


ы?

isden ★★★★★
()
Ответ на: комментарий от ef37

>Десяток-другой функций, переписанных сравнительно недавно, не считается.

А что считается?

Четыре посетителя пришло ? ;-)


Да нет, четыре тысячи, например :)

В то же время пока поток стоит на ожидании данныхот БД, планировщик мог бы в это время переключить на другой поток


Так потоков итак - многие сотни. Какая разница, что один из них простаивает?

то оказывается, что тот сборщик мусора, который есть, работает настолько чудесно


Удивительно даже, как это для скрипта, время нормальное жизни которого составляет десятые или даже тысячные доли секунды, почему-то не актуальна проблема сборки мусора :D

что для верности пишут обычно unset для переменных, не ?


А когда я на Java принудительно постоянно пишу присванивание NULL, чтобы освободить память - это тоже говорит о том, что Java пригодна только для маленьких скриптов? ;)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Нет, серьёзно, неужели столь важные моменты в институтах больше не преподают?

Да знаю я, о чём говорится. И про представления числе в машинном виде знаю, ёмаё. И (9) я написал, чтобы не писать длинный набор цифр (который, естественно, не 9999, а 999100500 итд).

Я про то, что представлять пользователю (программисту) надо так, чтобы было видно, дробное это число, или настоящее целое, которое везде будет выводиться как ожидается (в пхп в том числе).

Опять же, это фундаментальные моменты в области программирования.

И вывод в пхп не даёт понять, разные ли они там.

А телепатию пока компьютеры не осилили.

Опять же, питон честно пишет. Имхо понятнее, если вывод будет такой как есть, чем тот, который разработчики посчитали более красивым.

Хотя да, раз echo такая хитрая, и для строк, то мои претензии конкретно к пхп по этому вопросу безосновательны (бага нет), претензии у меня вообще к такому подходу.

Единственный адекватный оператор вывода не показывает правду:)

anonymous
()
Ответ на: комментарий от stevejobs

>Проверил, echo(0.7) таки выдает «0.7». Хм)

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

legolegs ★★★★★
()
Ответ на: комментарий от isden

> [~]$ php

ы?


тебе смешно, а я в Максимальной, и стараюсь cmd.exe в суе не употреблять.

уже проверил echo(0.7) - но для этого пришлось откопать заархивированный в зипник сайт (сайт туда был закатан прямо как есть - вместе с апачем, чтобы можно было заказчику по почте отправлять :)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

>друг собеседовался в мэйлру перловиком

Товарищ, который до меня www.aviaport.ru писал, ушёл оттуда с повышением на руководство отделом в Mail.Ru... Я после него два года плевался от кода :) Чистый SQL в каждой затычке, ни малейшего запаха от MVC или компонентов, классический стиль Personal Home Page :D

Помнишь, я как-то в теме про соционику расписывал особенности белой и чёрной логики в приложении к программированию? Вот это рафинированный пример запущенной ЧЛ был :) Всё в одну кучу спагетти! :)

KRoN73 ★★★★★
()
Ответ на: комментарий от legolegs

> Ты вот тоже дремучий. По умолчанию везде кроме пистона функции вывода настроены на печать флоатов разумным числом цифр.

да я как-то вообще не задумывался до этого треда, что можно попробовать вывести флоат стандартными функциями вывода :)) (перед этим не совершив преобразование числа в String ручками)

stevejobs ★★★★☆
()
Ответ на: комментарий от KRoN73

>А что считается?

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

А когда я на Java принудительно постоянно пишу присванивание NULL

Очевидно, дао жабы тебе недоступно =)

legolegs ★★★★★
()
Ответ на: комментарий от stevejobs

> тебе смешно, а я в Максимальной, и стараюсь cmd.exe в суе не употреблять.

заведи себе powershell или виртуалку. ну или coLinux.

isden ★★★★★
()
Ответ на: комментарий от isden

> заведи себе powershell или виртуалку. ну или coLinux.

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

stevejobs ★★★★☆
()
Ответ на: комментарий от KRoN73

> А когда я на Java принудительно постоянно пишу присванивание NULL, чтобы освободить память

сборщику мусора не доверяешь? :)

isden ★★★★★
()
Ответ на: комментарий от isden

>> тебе смешно, а я в Максимальной, и стараюсь cmd.exe в суе не употреблять.

заведи себе powershell или виртуалку. ну или coLinux.

Какие сложности... Пусть фрю ставит и не мучается.

legolegs ★★★★★
()
Ответ на: комментарий от anonymous

>Я про то, что представлять пользователю (программисту) надо так, чтобы было видно, дробное это число, или настоящее целое

Ну, как бы, тут вопрос совсем не в видимо представлении. Так что большие сомнения в «Да знаю я, о чём говорится» ;)

И вывод в пхп не даёт понять, разные ли они там.


Вообще-то, десятичная точка в аргументах однозначно даёт указание на тип. И var_dump или is_float тебе однозначно тип тоже укажут. А вот когда ты пытаешься округлить плавающую точку отбрасыванием дробной части - это однозначно указывает на недостатки в образовании, а не на недостатки в языке. Отбрасывание дробной части никак не связано с округлением. Хочешь округлять и не знаешь, есть ли в языке функция округления - прибавляй 0,5 перед отбрасыванием дробной части.

int(7.8) == 7. Это тебя не удивляет?

KRoN73 ★★★★★
()
Ответ на: комментарий от isden

>> А когда я на Java принудительно постоянно пишу присванивание NULL, чтобы освободить память

сборщику мусора не доверяешь? :)

Я уверен, что это у них взаимно. Т.е. сборщик мусора срать хотел на эти NULL и чистит когда хочет и что хочет.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Это когда ррраз и старый код заработал с юникодом.

1. А такое хоть где-нибудь есть? :)
2. А что делать, если старые файлы все были с текстами в cp1251 или koi8? Телепатию внедрять? Автоопределения кодировок? :)
3. Если же речь идёт про работу с БД, всякие подстроки и регистры - то тут именно «ррраз и заработало».

А когда я на Java принудительно постоянно пишу присванивание NULL

Очевидно, дао жабы тебе недоступно =)


Ага. Я ещё не могу телепатически внушать сиглетонам, чтобы они сами понимали, когда можно освободить глобальные списки объектов и т.п. :)

KRoN73 ★★★★★
()
Ответ на: комментарий от legolegs

>Т.е. сборщик мусора срать хотел на эти NULL и чистит когда хочет и что хочет.

Всякая селёдка - рыба. Но не каждая рыба - селёдка.

Сборщик мусора удалит объект тогда, когда захочет (или когда его вызовут), но только если этот объект никем не используется. Если объект используется, то хоть будет срать на NULL сборщик, хоть не будет, но объект он не удалит :)

KRoN73 ★★★★★
()
Ответ на: комментарий от legolegs

Сраные гении всегда хранят т.н «глобальные переменные» в каком-нибудь аццком массиве(коллекции), объявленном как синглтон или ThreadLocal. Поэтому единственный способ хоть как-то почистить память в подобной программе - это занулять NULLами элементы этих глобальных массивов, иначе никакой горбатый не поможет, хоть завызывайся.

stevejobs ★★★★☆
()
Ответ на: комментарий от KRoN73

>Ну, как бы, тут вопрос совсем не в видимо представлении.

Вообще-то, я рассуждаю о поведении echo, и только о нём. Кто-то не те мысли видит в моих сообщениях :)

Вообще-то, десятичная точка в аргументах однозначно даёт указание на тип. И var_dump или is_float тебе однозначно тип тоже укажут.

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

А вот когда ты пытаешься округлить плавающую точку отбрасыванием дробной части

Да я не пытаюсь. Я хочу увидеть на экране настоящее число, а не попытку пхп его изобразить поудобнее.

Отбрасывание дробной части никак не связано с округлением.

С округлением вниз - вполне связано:)

int(7.8) == 7. Это тебя не удивляет?

Нет. Меня удивляет echo, которое мне именно округляет за меня.

anonymous
()
Ответ на: комментарий от anonymous

> Да я не пытаюсь. Я хочу увидеть на экране настоящее число, а не попытку пхп его изобразить поудобнее.

у тебя компьютер с двоичной памятью?

у меня для тебя плохие новости

stevejobs ★★★★☆
()
Ответ на: комментарий от anonymous

> Нет. Меня удивляет echo, которое мне именно округляет за меня.

хм, забавно.

<?php
$v = floatval((0.1+0.7)*10.0);
echo $v;
var_dump($v);
?>

8
float(8)

isden ★★★★★
()
Ответ на: комментарий от KRoN73

>А что считается?

Когда вместо использования strtolower(что вроде как логично) используют костыли типа:

utf8_encode(strtolower(utf8_decode($string)))

или использования mb_convert_case

то это не считается нормальной поддержкой юникода.

Удивительно даже, как это для скрипта, время нормальное жизни которого составляет десятые или даже тысячные доли секунды, почему-то не актуальна проблема сборки мусора :D

На большее он не годен, короткие простые скрипты. Попробуйте написать что-нибудь работающее достаточно долго(типа демона какого-нибудь) или лопатящее большие объемы. Мне как-то приходилось делать загрузку больших CSV файлов (несколько сотен тысяч записей). На порядка 5 тыс. записей потребление памяти было около 30 Мб. Пришлось оптимизировать. После того случая я немало узнал об управлении памятью в этом вашем пхп ;-) Правда это была 4-ка.

Так потоков итак - многие сотни. Какая разница, что один из них простаивает?

Потоков нет ни одного, если mod_php, то это процессы. Разницу в потребляемых ресурсах нужна объяснять ?

А когда я на Java принудительно постоянно пишу присванивание NULL, чтобы освободить память - это тоже говорит о том, что Java пригодна только для маленьких скриптов? ;)

GC Java-машины работает на порядок лучше, там же не просто подсчет ссылок ;-)

ef37 ★★
()
Ответ на: комментарий от anonymous

Вообще-то, я рассуждаю о поведении echo

Но возмущение вызвал именно вопрос с отбрасыванием дробной части. А echo - это всего лишь вопрос человекочитабельности. Тебя сильно убивает, что «df -h» не позволяет увидеть точный размер свободного места?

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

Если тебе вдруг потребовался intval() - то это уже показатель того, что у тебя в аргументах может быть вещественное число.

Я хочу увидеть на экране настоящее число

$ php -r 'printf("%.20f", (0.1+0.7) * 10 );'
7.99999999999999911182

С округлением вниз - вполне связано:)

Округление и округление вниз - это разные вещи.

int(7.8) == 7. Это тебя не удивляет?

Нет. Меня удивляет echo, которое мне именно округляет за меня.

А тебя не удивляет, что отвёрткой сложно забивать гвозди?

KRoN73 ★★★★★
()
Ответ на: комментарий от ef37

> Мне как-то приходилось делать загрузку больших CSV файлов (несколько сотен тысяч записей). На порядка 5 тыс. записей потребление памяти было около 30 Мб. Пришлось оптимизировать.

ОХ ЛОЛ

Однажды я устраивался в фирмочку PHP-кодером. Проверочным заданием надо было написать рисовальщик графика, который берет данные из CSV. Когда пришел на собеседование, весь мой код поперечеркивали красными маркерами в «неверных» местах.

когда я объяснил, что страницы «ненужного» кода - это обработка ошибок, а готовый CSV-парсер для похапэ я не нашел, т.к. не нашел ни одного, который умеет работать с нормальными объемами данных, у людей случился баттхерт.

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

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

stevejobs ★★★★☆
()
Ответ на: комментарий от ef37

>Когда вместо использования strtolower(что вроде как логично) используют костыли типа:

utf8_encode(strtolower(utf8_decode($string)))


Никогда такого не использовал :)

то это не считается нормальной поддержкой юникода.


А почему у меня и без такого всё работает? :D

На большее он не годен, короткие простые скрипты.


А это - 90% всех Web-задач сегодня. За оставшиеся же 10% - я писал уже выше, что PHP - не серебряная пуля. Тебя же не убивает то, что на Питоне нельзя написать драйвер видеокарты, а на Си++ вменяемые люди не пишут сайтов? :)

Попробуйте написать что-нибудь работающее достаточно долго(типа демона какого-нибудь)


Зачем? Для этого есть более адекватные инструменты.

или лопатящее большие объемы.


А вот это - практикую. Да, PHP тут не лучший вариант но и он нередко оправдан.

Потоков нет ни одного, если mod_php, то это процессы. Разницу в потребляемых ресурсах нужна объяснять ?


Да, можно. А то я как-то не вижу больших затрат в памяти на PHP по сравнению с тем же Django :)

GC Java-машины работает на порядок лучше, там же не просто подсчет ссылок ;-)


Да я, как бы, знаю. Просто говорю, что даже в случае Java обычно приходится держать в уме управление памятью :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Нет, просто знаю, как он работает :)

А че там знать, в пыхе это происходит в 3-х случаях:

а) gc_enable (появился 5-ке, о чудо), дважды подумать перед его использованием, запуск gc - достаточно дорогая операция b) переменная выпала из видимости c) конец скрипта

ef37 ★★
()
Ответ на: комментарий от KRoN73

1. А такое хоть где-нибудь есть? :)

В плюсах:

-#typedef std::string string;
+#typedef QString string;

В PHP: http://www.php.net/manual/en/function.explode.php#94652 :)

2. А что делать, если старые файлы все были с текстами в cp1251 или koi8? Телепатию внедрять? Автоопределения кодировок? :)

В смысле литералы в исходниках? Ну, во первых розги автору, а во-вторых iconv.

Ага. Я ещё не могу телепатически внушать сиглетонам

Про синглтоны сказано не было, так что я подумал о чём-то вроде

SomeConnection conn = new SomeConnection(bla);
SomeData = conn.RecieveAll();
conn = null;
WorkWith(SomeData);
legolegs ★★★★★
()
Ответ на: комментарий от isden

>а, по идее, не должен.

Это, вообще, «хакерская штучка» :) Его и документировали-то относительно недавно, ЕМНИП. Сколько лет через print_r() отлаживали... :D

var_dump — Dumps information about a variable


information about он и выдаёт. А вот про value - ничего не сказано :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Но возмущение вызвал именно вопрос с отбрасыванием дробной части. А echo - это всего лишь вопрос человекочитабельности.

Возмущение вызвало то, что 8 (int) и 7.999чтототам (float) - достаточно разные штуки в программировании, и ведут себя при всяких intval-ах по-разному. А echo выводит одинаково. И вот, приходится везде писать кучу var_dump, а хочется проще же.

А тебя не удивляет, что отвёрткой сложно забивать гвозди?

Да, я такой

anonymous
()
Ответ на: комментарий от KRoN73

> information about он и выдаёт. А вот про value - ничего не сказано :)

value как раз таки и входит в information about. там нигде не написано что он округляет.

isden ★★★★★
()
Ответ на: комментарий от anonymous

>И вот, приходится везде писать кучу var_dump, а хочется проще же.

upd: да ещё и он врёт. Нет в жизни счастья.

anonymous
()
Ответ на: комментарий от KRoN73

>>хм, забавно.

Ничего забавного, var_dump тоже округляет :)

Ёпрст, а он-то зачем? Хорошо хоть что serialize не округляет.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>#typedef std::string string;

И как оно на char* повлияет? :)

В смысле литералы в исходниках? Ну, во первых розги автору, а во-вторых iconv.


Видишь ли, если автор изначально писал правильно, то у него именно " ррраз и старый код заработал с юникодом" сразу же будет. У меня сейчас фреймворк не только с произвольными кодировками работает, но позволяет для одного проекта кашу кодировок использовать :) (вынужденная мера старого наследия в основном проекте). А если в Си строки через char* описывались, то тебе никакие typedef'ы не помогут...

Про синглтоны сказано не было


А я их и имел в виду. Когда у тебя сотни тысяч активных объектов, связанных десятками причудливых кольцевых связей и обслуживают сотни клиентов в течении недели, то там малейший просчёт со сборкой мусора может очень сильно боком выходить :) Особенно зверски бывает, когда проблемы вылезают где-то на синхронности параллельных потоков. Типа, изредка из-за конкуренции потоков что-то недоочистится, при отладке такое фиг поймаешь, а память в итоге - течёт... Приходится живую многогиговую систему под профайлером держать несколько суток, потом сбрасывать дамп, искать, кто там чрезмерно разжирел и ковыряться в сотнях использований утекающего места... Жуть :)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

>Возмущение вызвало то, что 8 (int) и 7.999чтототам (float) - достаточно разные штуки в программировании

У тебя не вызывает возмущения, что Солнце и Луна - достаточно разные штуки в астрономии? :D Ты хоть раз в бинарном дампе int и float видел? :)

Да, я такой


Мне нечего тебе сказать на это :)

KRoN73 ★★★★★
()
Ответ на: комментарий от isden

>value как раз таки и входит в information about. там нигде не написано что он округляет.

Хорошо. Запишем это в один из серьёзных недостатков PHP :D

KRoN73 ★★★★★
()
Ответ на: комментарий от legolegs

>Хорошо хоть что serialize не округляет.

Кстати, да. Хороший вариант для тех, кто хочет увидеть, как оно внутри устроено :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Да, можно.

Насколько я знаю, с точки зрения внутренней организации Linux не делает различия между процессами и потоками — все это потоки ядра, просто некоторые логически объединены в процессы.

В Solaris, например, это не так. Там есть четкое понятие LWP - low weight process, то есть поток-поток, который гораздо дешевле и быстрее, чем поток-процесс.

Если интересно, то есть очень хорошая книга Solaris Internals, PrenticeHall PTR кажется.

ef37 ★★
()
Ответ на: комментарий от KRoN73

>Никогда такого не использовал :)

А какое ты использовал? Надеюсь, не my_brave_new_strtolower?

на Си++ вменяемые люди не пишут сайтов?

Фреймворки так-себе и хостинг дорогой, хнык.

И как оно на char* повлияет? :)

Какой такой char*? Мущщина, я из приличной семьи и данные юзера в char* не храню.

А если в Си строки через char* описывались, то тебе никакие typedef'ы не помогут...

#define char fixme :)

Жуть

Жаль, фава-фанбоев в треде нет, такая кулстори пропала :)

legolegs ★★★★★
()
Ответ на: комментарий от KRoN73

>У тебя не вызывает возмущения, что Солнце и Луна - достаточно разные штуки в астрономии? :D Ты хоть раз в бинарном дампе int и float видел? :)

Я не зря сказал про «програмирование», в языках обычно чётко различают int и float. Мало ли что там в бинарном дампе:)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.