Делаем правильную платформу или Как повторить Google

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

    Что мы хотим получить?
    Начнем с тезисной постановки задачи и требований к системе, их немного.
    • Система должна автоматически разделять задачи между доступными ей серверами.
    • Одновременный физический отказ (выключение) любых двух серверов никак не повлияет на целостность системы.
    • Физический отказ любого оборудования не влечет за собой отказ целой системы.
    • Включение нового сервера не требует никакой ручной настройки.
    • Клиент может взаимодействовать с любым frontend-сервером равнозначно.
    Два пути.
    Существуют два пути. Первый — путь Microsoft — каждый сервис разрабатывается независимо, при этом каждая группа разработчиков делает собственные решения.
    Второй путь — путь Google — существует единая платформа и единая система, в которой живут приложения (поисковик, почтовик, группы, и т.д.).
    Второй путь заметно выигрывает, поскольку при оптимизации любой части системы, улучшается работа сразу всех сервисов, и при разработке не нужно думать о том, как всё это будет в действительности работать. Первый же очень напоминает басню Крылова про лебедя, рака, и щуку.

    Основные компоненты платформы.
    На каждом сервере может быть запущен любой набор компонентов, количество серверов для каждого компонента определяется автоматически.
    • Хранилище данных. Состояние системы хранится только в нем.
    • Кеш подсистема. Используется для временного хранения горячих данных в памяти.
    • Сервис блокировок. Используется для предотвращения одновременного вызова последовательных процедур.
    • Сервис приложений. В нем живут все конечные сервисы.
    • Сервис взаимодействия с клиентом. Включает в себя Веб-сервер и DNS-сервер.
    Хранилище данных.
    Состояние системы хранится только в нем, никакие другие хранилища для приложений недоступны. Я выбираю MongoDB. Для того чтобы понять как к ней подойти, рекомендую ознакомиться с моей предыдущей статьей — MongoDB — варим хороший кофе, уделите кластеризации особое внимание. Также важен MapReduce.

    Кеш подсистема.
    Необходима для снижения нагрузки на базу данных как на простой выборке объектов, так и на сложных выборках. Я выбираю memcached. Про то как подружить MongoDB и memcached сказано в статье о MongoDB, советую обратить внимание.

    Сервис блокировок.
    Используется для предотвращения одновременного вызова последовательных процедур. Перед тем как выполнить процедуру, которая требует последовательности действий, приложение отправляет запрос сервису блокировок. В ответ оно получает либо согласие на выполнение, либо отказ. Я выбираю phpDaemon::LockServer. В случае падения одного узла, все ведомые им клиенты переключаются на другой узел.

    Сервис приложений.
    В нем живут конечные сервисы. В качестве сервиса приложений может выступать OpenVZ. Приложения также могут быть асинхронными модулями phpDaemon. При разработке приложений нужно перекладывать в очередь любые тяжелые операции.

    Сервис взаимодействия с клиентом.
    Включает в себя Веб-сервер (nginx), DNS-сервер (bind9) и firewall, через который идут запросы напрямую к приложениям. Отказоустойчивость и распределение нагрузки обеспечивается либо через DNS round-robin, либо по BGP с получением статуса AS.

    Хранение файлов.
    Файлы хранятся в базе данных по методологии GridFS, существует реализация в виде FUSE-модуля.

    Пример использования. Описание работы сервиса Веб-поиска.
    Данный сервис делится на несколько составляющих:
    1. Хранение информации о документах.
    Для этого используем коллекцию documents с документами содержащими свойства url, host, type, size, mtime, atime, title, text, description, indexed и др. Шардинг полю по url.

    2. Crawler'ы, сохраняющие содержимое страниц в базу.
    Crawler запрашивает documents.find({host: ..., indexed: 0}), получая блокировку на этот host. Запрашивает каждый документ по сети и складывает его в базу, выставляя при этом indexed: 1.

    3. Полнотекстовый поиск.
    Для эффективного поиска по тексту нужен специальный механизм, который позволит быстро находить документы по заданным словам.

    3.1. Приведение слова к «нормальной» форме. Слова могут записываться в разных словоформах, их все необходимо привести к одной нормальной форме, для этого нужно воспользоваться словарями (см. spelldump из Sphinx), и эвристическими стеммерами для слов отсутствующих в словарях.

    3.2. Хранение индекса.
    Существует два подхода.

    Первый подход чаще используется в поисковых системах со сравнительно небольшим количеством поисковых запросов. Он подразумевает дробление единого поискового индекса на несколько, и параллелизм работы всех узлов при запросе. То есть, когда подается поисковый запрос, опрашиваются все узлы и их ответы склеиваются. В этом подходе для увеличения производительности добавляют зеркала узлов, и балансируют нагрузку между этими узлами-зеркалами. Но это весьма неэффективно, т.к. чем больше индекс, тем больше серверов требуется, при этом вовсе не учитывается популярность слов. Многие слова вообще никогда не будут запрошены.

    Второй подход подразумевает распределение по словам, таким образом при запросе «hot girls», мы сначала узнаем какие сервера отвечают за каждое из этих слов, затем запрашиваем их, и склеиваем результаты. Сервера, которые не отвечают за эти слова мы вообще никак не нагружаем. Это дает огромный выигрыш в производительности.

    Поэтому, мы выбираем второй вариант. При индексации документ разбивается на слова, они приводятся к нормальной форме, и для каждого слова вызывается words.upsert({word: ...,{"$push": {«docs»: ...}}})

    3.3. Поиск.
    При простом поиске «hot girls» подается запрос words.find({word: «hot»}) и words.find({word: «girl»), заметьте что «girl», а не «girls». Затем выявляются пересечения между ними и выполняется ранжирование.
    Для эффективного ранжирования необходимо хранить расстояния между всеми парами слов в документе. Коллекция wordpairs с объектами вида {docid: ..., word1: «hot», word2: «girl», distance: 1}. Таким образом, можно быстро узнать в каких документах hot и girl расположены ближе всего.

    Ссылки на используемое ПО.
    • Nginx — Веб-сервер
    • MongoDB — База данных
    • phpDaemon — сервер включающий в себя сервер блокировок и другие модули
    Заключение
    В действительности, сделать такую систему вовсе не сложно. Тем более, я работаю над соответствующим фреймворком для простого создания подобных систем.
    Очень сложно уместить в статью такой огромный объем информации, но надеюсь мне удалось передать суть. Мне интересно какие аспекты покажутся вам особенно интересными, и я напишу о них в следующий раз.
    Главное, поймите и осознайте, если вы сталкиваетесь с проблемой работая с более простым инструментом, а не используя вместо этого готовое решение, позволяющее абстрагироваться от таких проблем — это вовсе не означает, что проблема решена, скорее всего эта проблема решена настолько через одно место, что вы даже себе не представляете. Вообще, я с подозрением отношусь к продуктам, которые не исповедуют принцип Keep It Simple, Stupid. Когда я не могу проконтролировать что будет происходить на элементарном уровне, я понимаю что не удастся сделать всё правильно, поскольку всякие автоматически оптимизаторы (SQL-запросов, кода, и т.д.) очень часто ошибаются.
    Например, в комментариях к одной из статей, человек спросил возможно ли в MongoDB выполнить аналог SQL-запроса «SELECT * FROM table ORDER BY RAND()*hosts LIMIT 5». Это конечно здорово и удобно, но с тем же успехом мы можем выбрать всю табличку, а затем в скрипте выбрать что нам нужно, это будет не намного сильнее тормозить, поскольку MySQL в этом случае выполняет RAND()*hosts для каждого ряда, сортирует все эти ряды в памяти, и отрезает 5 первых результатов. Само собой, чем больше табличка, тем больше тормоза. Так что надо всегда думать что в действительности происходит в результате ваших действий, иначе вы никогда не научитесь делать высоко-нагруженные системы.
    Спасибо за внимание!
    Метки:
    Поделиться публикацией
    Комментарии 299
    • +34
      Посмеялся, спасибо.
      • +1
        Над чем? Через какое-то время фреймворк опубликую, который решает проблемы автоматической настройки и эффективного использования ресурсов.
        А по поводу Google — почитайте доступные Papers.
        • +14
          Над чем? Без обид, у вас каждое предложение — в мемориз можно, поднимать настроение в грустные дни. Мы радуемся всем отделом.

          Конкретнее, с технической точки зрения ценность каждого второго предложения минимальна, а в целом весь пост выглядит крайне сумбурно, будто ведро с гайками на пол вывалил — нате, собирайте. Скачете с темы на тему, по разным уровням — тут же и про OpenVZ, и про SQL-select-ы.

          >> Через какое-то время фреймворк опубликую
          Я вас за язык не тянул, оповестите, пожалуйста, как появится.
          • +2
            Вы правы, но я ведь написал что тема обширна. По-хорошему, каждое предложение надо заменить на страницу текста, но тогда вы бы наверное сказали что многобукв, да и читать не особенно интересно было бы.
            • +2
              Эм, ну так есть же варианты, как это изложить, помимо скучной стенки текста, которой вы справедливо опасаетесь. Если вам есть что сказать, да еще и подробно, еще и с примерами из практики — это же просто замечательно; надо только материал подать.
              А то, что его много — ничего страшного, говорю же.
            • 0
              — Конкретнее, с технической точки зрения ценность каждого второго предложения минимальна, а в целом весь пост выглядит крайне сумбурно, будто ведро с гайками на пол вывалил — нате, собирайте. Скачете с темы на тему, по разным уровням — тут же и про OpenVZ, и про SQL-select-ы.

              Сразу вспомнил как мой преподаватель когда-то сказал: «Это как взять кучу дерьма, бросить на мозги и смотреть как оно впитается».
              • 0
                хороший был препод
                • –1
                  Почему был? Он ещё у нас преподаёт =).
                  • 0
                    тогда тебе повезло вдвойне…
                    набирайся у него житейской мудрости, пока есть возможность
            • +5
              … Из зала подсказывают, что вы, вероятно, не на papers, а poppers налегали. Евпочя.
            • +6
              ↓↓ Ахтунг! Холивары! ↓↓
            • +4
              вопрос? а почему вы выбрали именно то, что выбрали? при разработке высоконагруженных систем нельзя полагаться просто на слова. нужны какие то графики тестирования нагрузке, а может oracle лучше справится? а может постгре? а почему не используете фиксы фейсбука для мемкеша, так будет быстрее?

              слишком много вопросов возникает.
              • –3
                Oracle и PostgreSQL это реляционки, у них свои проблемы.
                Патчи можно использовать, но это спичечные оптимизации, а не архитектурные.
                • –3
                  Oracle и PostgreSQL — реляционки, у них свои проблемы.
                  Фиксы можно использовать, но они относятся к спичечной оптимизации, а не к архитектуре. Если бы я затронул все спичечные оптимизации каждого из продуктов, надо было бы писать книгу, а не статью, которая призвана дать верное направление для размышления.
                  • +1
                    нужно было затрагивать не спичечные оптимизации, а почему именно эта база данных. показать ее преимущество над остальными. это как раз и есть архитектурное решение. а вы просто выбрали. а если вы не правы?
                    • –3
                      Её преимущество я рассмотрел в отдельной статье. Я и не должен быть прав. Схема, которую я предложил — работает. Ведь я не утверждаю что она самая лучшая и самая быстрая на свете.
                      • +2
                        не все что работает то хорошо ;)
                • +11
                  неужели если от Гугла — то значит «правильно»?
                  • +3
                    Вовсе не значит. И вообще — что такое правильно? Просто это работает, и весьма успешно. Говорю, руководствуясь своим опытом и опытом Google.
                    • 0
                      значит.
                    • +1
                      Интересно, кстати, по поводу phpDeamon — Вам удалось его запустить? Так как это продолжение предыдущего проекта — phpTrueFastCGI (Или примерно так), и не все еще перенесено, то есть по мануалу не получится его запустьи. Я сам делаю примерно такую же систему (и фреймворк), но пока основываюсь на Redis+Net_Server+signal/slot архитектура
                    • +6
                      Поясните почему выбран php и такой тяжеловестный контейнер приложений.
                      • 0
                        Фактически, разрабатывать можно на чем угодно, важно лишь соблюдать концепцию. PHP удобен. OpenVZ подходит для того чтобы оградить приложения друг от друга.
                        • +2
                          PHP удобен.

                          Можно конкретные примеры чем он удобнее к примеру python, perl, java

                          OpenVZ подходит для того чтобы оградить приложения друг от друга.

                          Вам не кажется что технология слишком тяжела для такой простой вещи? Чем хуже запуск сервиса от отдельного пользователя?
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • +3
                              К примеру у python есть модели для FastCGI и WSGI из коробки, есть такая замечательная штука как twisted. В случае если код выносится в модули, то он может быть прекомпилирован и при интерпретации не потребуется трансляция в байткод. У perl опять же есть модели для FastCGI и аналогичные twisted фреймворки. У java есть такая штука как servlet и большое количество различных фреймворков. Какой резон выбирать php в данном случае?
                              • –4
                                А в PHP есть phpDaemon::FastCGI ;-)
                                • 0
                                  И сколько человек им пользуются, если не секрет?
                                  • –6
                                    секрет,
                                    один — автор этого чуда
                                    • 0
                                      спасибо за минусы (два)
                                      значить я был не прав, кроме автора им пользется еще один чудак
                                      • +1
                                        нет — три, еще два минуса появилось.
                                  • –1
                                    Упас, забейте, Акелла промахнулся веткой :/
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      А вот в пхп кэшировать опкод нельзя, да?:)

                                      Прям из коробки есть только в 5.3. В остальных только расширениями.

                                      Для всех фреймворков и buzzwords явы жизнь слишком коротка.

                                      А строить велосипеды на php не коротка? Вы вот посмотрите Spring.

                                      если в команде никто толком не видел эту яву, какой смысл её выбирать?

                                      А какой смысл выбирать php?
                                      • +1
                                        Ява слишком многословен (Map m = new Map(), так кажется?), php лаконичней (а Руби еще лаконичней к слову).
                                        • –2
                                          Блииин! Парсер порезал угловые скобки!

                                          Ява: Map [String, Int ] m = new map [String, Int]; — сказывается уродливый Си++ подобный синтаксис

                                          PHP: $m = array(); — тоже не очень

                                          Руби: m = [] — самое то!

                                          А уж если мы коснемся таких вещей, как замыкания, анонимные блоки кода, тут у Руби нет конкурентов, на нем просто писать приятней же. Плюс все объекты выглядят как объекты, например можно сделать print 'yes' if somestring.startsWith(); Плюс с массивами удобно работать, через методы типа map: new_array = old_array.map { |x| x*x; }

                                          p.s Мануал по Руби читал давно, мог и напутать немного :)

                                          • +9
                                            сказывается уродливый Си++ подобный синтаксис

                                            Сказывается статическая типизация. Не путайте теплое с мягким.

                                            А уж если мы коснемся таких вещей, как замыкания, анонимные блоки кода, тут у Руби нет конкурентов, на нем просто писать приятней же.

                                            Я уже спрашивал, но все же как с производительностью?
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                            • –5
                                              В свое время Бобук говорил рубистам: — Вот когда руби догонит хотя бы питон по скорости тогда и приходите.
                                              Перефразируя его скажу:
                                              -Когда php по производительности догонит java вот тогда и приходите.

                                              Насчет лаконичности это сильно зависит от того что вы там писать будете.
                                              • +2
                                                Насчет скорости, вы абсолютно правы, это единственное, что удерживает меня от того чтобы бросить php. Но писать полотна кода ради того, что делается в Руби 2 строчками — надоедает, сколько уже можно это терпеть? Самые часто используемые вещи требуют много нажатий клавиш — массивы ($x = array('a' => 'b')), обращения к полям объекта ($this->field), анонимные функции, операции со строками и массивами используют уродливые конструкции типа str_replace($find, $replace, $string);

                                                Другой пример, например мы хотим сделать объект БД для выполнения операций в рамках транзакции. Процедурный (уродливый) подход:

                                                $db->startTransaction();

                                                try {
                                                $db-->doSomething(1);
                                                $db-->doSomethingOther(2):

                                                }
                                                catch (Exception $e)
                                                {
                                                $db->rollback();
                                                throw $e;
                                                }

                                                $db->commit();

                                                А вот функциональный подход:

                                                db->transaction { |db|
                                                db->doSomething();
                                                db->doSomethingElse();

                                                }

                                                Надо ли говорить, какой подход лучше? А если завтра вам понадобится поменять что-то в обработке исключений, к примеру, с первым подходом — вам придется лазать по всему коду. Дублирование кода — зло, а именно оно и и меет место в первом случае.

                                                Также, очевидно, что читать и ориентироваться в лаконичном коде общем проще, да и на экран его помещается больше.

                                                И ведь самое главное, ничто в общем-то не мешает сделать хороший синтаксис в Яве/PHP или даже старичке Си, но почему-то никто этим не занимается, значит ни кому не нужно?

                                                Также, очевидно, что читать и ориентироваться в лаконичном коде общем проще, да и на экран его помещается больше.

                                                > Насчет лаконичности это сильно зависит от того что вы там писать будете.

                                                Не лукавьте, что ни пиши — все на Руби проще получается.

                                                Кстати, что касается Явы — она у меня почему-то ассоциируется с огромными полотнами кода, страшными (в плане дизайна) западными корпоративными сайтами, нечитаемыми XML-конфигами, и дурацкими УРЛ типа /UnReadableServiceName.jsp?someparameter=1&someotherparameter=2. Или может сейчас что-то поменялось, но раньше было так.
                                                • 0
                                                  Рекомендую вам посмотреть Spring :)
                                                  • 0
                                                    Поменялось. 90% конфигураций почти везде заменяются аннотациями, дизайн тоже исправляется (возьмите хотя бы сайт Yota), url — это уже лет 5 как не проблема.

                                                    Хотите совсем Java-вого Ruby — попробуйте Groovy, он практически так же лаконичен, как и subj.

                                                    Еще один вариант — Scala, но там другие правила, и риск заработать ФП головного мозга.
                                                    • +2
                                                      > Хотите совсем Java-вого Ruby — попробуйте Groovy, он практически так же лаконичен, как и subj

                                                      Да, посмотрю, хотя мне уже этап installation не нравится — как-то все заморочно, непортабельно, и криво:

                                                      > There is currently an issue where you cannot have spaces in the path where Groovy is installed under windows.

                                                      Позор. Не обрабатывать пробелы в именах файлов в 21 веке —это позор.

                                                      Есть еще какой-то Jruby, тоже гляну.

                                                    • –2
                                                      Если вы занимаетесь вебсайтами, то руби будет работать не медленнее чем РНР. А когда надо, то руби может быть гараздо быстрее (thin + capistrano или rails metal без БД держат несколько тысяч RPS).
                                                  • 0
                                                    Ну так мы договоримся до того, что Perl лучший язык.
                                                    Но если вы будете писать на нем слишком лаконично, то никто из вашей команды не поймет, а через полгода и сами забудете, что написали.

                                                    На мой взгляд золотая середина лаконичности — Python — такст очень короткий, но читается идеально.
                                                    • 0
                                                      > Но если вы будете писать на нем слишком лаконично, то никто из вашей команды не поймет, а через полгода и сами забудете, что написали.

                                                      Лаконичность — это когда массив создается таой строкой: array = []; (в ср-и с другими языками), это описано в правилах языка, так что не представляю как об этом можн забыть.
                                                      • –5
                                                        Чрезмерная лаконичность это вот такие програмки:

                                                        echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

                                                        Пока не выполнишь не поймешь, что это такое. Да уже поздно будет.
                                                        Это, конечно, гипербола. Но близкий к такому код в вашем проекте — это кошмар для команды, потому что при смене разработчика, новому придется долго вникать.
                                                        Вот за это я не люблю перл, что так каждый пишет как хочет, в итоге — горы нечитаемого и трудноподдерживаемого говна.
                                                        • 0
                                                          баян, и подписали бы что это rm -rf /. И невежливо постить без описания это дело.
                                                          • 0
                                                            Да, это очень старый известный баян. Поээтому не нуждается в подписи. Здесь он приведен как пример какое нечитаемое гавно может быть. Вот тут он детально разобран: ru.wikipedia.org/wiki/Perl
                                                          • 0
                                                            Я тоже не люблю Перл. Руби, поверьте, до такого не доходит, а массив и правда удобнее скобками писать, без ключевых слов (в яваскрипте к слову тоже так).
                                                            • 0
                                                              Я видел руби программы. Существенно лучше.
                                                              Но для себя идеалом считаю Питон — программа читается легко и просто прямо как тект на английском.
                                                              • 0
                                                                Да, очень похоже на английский текст.
                                                                if x is None:
                                                                    print "undefined"
                                                                

                                                                Особенно по сравнению с
                                                                say "undefined" unless defined $var;
                                                                
                                                                • 0
                                                                  Да, а чем проще и очевиднее синтаксис, тем меньше дурацких трудноуловимых ошибок и легче разбираться в чужом коде.
                                                    • 0
                                                      ну вот война религий началась…
                                                • –5
                                                  Имхо, сравнивать ту же Java и PHP — это как сравнивать иномарку и жигули. Не пытаюсь разводить холивар, но лично для меня в PHP такое большое кол-во минусов, что писать на нем желания не имею с тех про как начал писать на Java.

                                                  Хотя хороший Java программист, к коим я себя никак отнести не могу, может найти много минусов в этой технологии. Но как-то там все логичнее, стройнее и красивее. И меньше былокодеров из-за более высокого уровня вхождения.
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                    • 0
                                                      Когда я начал писать на Java, я постоянно видел насколько мне не хватает знаний языка и смежных технологий. Лезть в мануалы приходиться постоянно. Уже полгода пишу ней дома свой проект. До сих пор браузер с мануалами постоянно активизируется через alt+tab.

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

                                                      И проблема тут отнюдь не в том, что я вырос как разработчик.
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                          • +4
                                                            Я как работодатель страдаю от огромного кол-ва неадекватных пхпешников на рынке труда, которые не стоят и 10к рублей в месяц.

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

                                                            Понимаю, язык тут не причем. Но из-за легкости освоения, такие вот «кадры», уворовав в легкость разработки, оседают именно в нем.

                                                            Кстати, заметьте, проблему тупых разработчиков я обозначил только как одну из.
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              • 0
                                                                И не говорите, сам тут пытался народ набрать. Это кошмар какой-то. Повезло что заинтересовался человек, с солидным уже стажем и ему интересно было поучаствовать не столько за деньги, сколько за опыт и интересность проекта.
                                                                • +1
                                                                  Прав был Джоэл, говоря, что хороших программистов можно найти либо через личное знакомство, либо через отлов их еще на этапе обучения.
                                                                  • 0
                                                                    У вас в России с этим легче, уж поверьте. У нас тут вообще мрак — все сидят на аутсорсе и толковых больших проектов, требующих хороших знаний — единицы. В основном аутсорс это Java/C++. Мне повезло, по знакомству собственно и попал. И то знакомый мне 2-3 года в IRC'е помогал на #php канале с проблемами и глупыми вопросами, а сейчас свалил вообще в Испанию :)

                                                                    Хотя вру, работал пол года в конторе, которая занималась системами управления предприятиями на PHP. Я к сожалению ушел, т.к. к тому времени я совсем слез с PHP4 (они только новые системы делали на PHP5), да и ездить приходилось далеко. Но делали толково и очень серьёзно, некоторые Java/.NET девелоперы позавидовали бы тем системам, которые они создали. А их фреймворк хочется до сих пор повторить, да вот только сил не хватит :)
                                                            • +1
                                                              Ну знаете ли, я вот 4-й год на PHP работаю, и до сих пор лажу в мануал хотя бы раз в день, постоянно его переодически перечитываю мануалы, читаю Internals — и знаете, за те 4 года работы с разными людьми (в том числе и так называемыми «зубрами») не считаю, что я знаю PHP на отлично. Потому что мне ещё учится и учится правильному PHP. А вообще знания конкретного языка — это не показатель. Важен весь пласт технологий и вообще базовое IT образование. Программистов на PHP хорошо если 5-10% от общей массы. Я программистом для себя буду тогда, когда у меня опыта лет 10 будет и я закончу ВО и щедро приправлю его большим кол-вом дополнительных знаний, как теоретических, так и практических.

                                                              Вообще любой программист без ВО по компьютерным наукам в любой области — это кодер. У нас к примеру в стране официально по законам программистом является лицо имеющее ВО по компьютерным наукам или его получающее. Остальное кодеры — низкоквалифицированная профессия. И правильно, хотя конечно в реальности каждый второй лобзик себя считает программистом, а как начинаешь спрашивать базовые вещи — сдуваются, потому что дальше CMS'ок не лазили.
                                                              • +1
                                                                Мое мнение настолько противоположное буквально во всем, что возражать даже и пытаться не буду. Можно в личке обсудить.
                                                                • 0
                                                                  Вот лучше бы возразили, чем такое писать. Конструктивного и интересного обсуждения не получилось :(
                                                            • –2
                                                              У java выше порог вхождения, как результат быдлокодеров на ней меньше. Опять же в отличии от PHP java это не язык для веба. PHP больше именно для работы с веба, как только вылазим из этой песочницы все становится плохо.
                                                              • –1
                                                                Чем отличается язык для веба от языка не для веба? Мне вот кажется, что Java для веба даже больше подходит. Может, я просто вырос из сайтов аля «новости, фотогалерея, гостевая»?
                                                                • 0
                                                                  В первую очередь php создавался для создания динамических веб-страниц. Отдельный CLI там появился намноого поздже. И ПО на php которые не занимаются именно этим раз два и обчелся. На java к примеру таких систем существенно больше.
                                                                  • +4
                                                                    SVN тоже создавался под лозунгом «улучшим CVS», но, почему-то, сейчас становится модным GIT, у которого лозунг «ни в коем случае не так, как в CVS»

                                                                    Проблема в том, что неважно для чего создавался язык. Главное — что получилось. А в случае с PHP получился слабый язык с кривой и нелогичной стандартной библиотекой.

                                                                    Если уж на то пошло, изначально PHP — PersonalHomePage, но никак не язык для веба:)

                                                                    Я просто не понимаю как можно писать динамично развивающиеся веб приложения на языке, который:
                                                                    — Не умеет нормально работать с кодировками (и не надо мне рассказывать про iconv — уже намучился с разными нюансами)
                                                                    — Не имеет нормальных средств для мета программирования
                                                                    — < тут пошли мелочи, которые меня тоже достают >
                                                                    • –1
                                                                      но, почему-то, сейчас становится модным GIT, у которого лозунг «ни в коем случае не так, как в CVS»

                                                                      Кроме него становится модным mercurial и bazaar. Становятся модными распределенные системы ревизии кода. И они становятся модным именно из-за своей распределенности.

                                                                      Если уж на то пошло, изначально PHP — PersonalHomePage, но никак не язык для веба:)

                                                                      А вы что Personal Home Page смотрели чем-то отличным от браузера? :)

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

                                                                      Это все лечится костылями. Их там великое множество :)))
                                                                      • 0
                                                                        Про костыли… Расскажите мне как вы AOP на PHP будете делать.

                                                                        Ситуация с замыканиями тоже забавная. Они, конечно, в 5.3 появились, но до Javascript все равно не дотягивают.

                                                                        Пхпешники, которые ничего кроме него не знают, меня, конечно, будут минусовать, ну и пусть. Не я первый, не я последний:)
                                                                        • 0
                                                                          Я это делать не буду. AOP как бе я лучше буду в java юзать :)
                                                                          • 0
                                                                            Вот так:

                                                                            code.google.com/p/php-aop/

                                                                            www.phpclasses.org/browse/package/3215.html

                                                                            только сначала скажите, ЗАЧЕМ это в веб-приложениях?
                                                                            • 0
                                                                              Для AOP модифицировать исходники. Увольте. Риски слишком большие.

                                                                              Что значит зачем это в ВЕБ-приложениях? А зачем это не в веб приложениях? А зачем нужны события в программах?

                                                                              В конце-концов о том, что такое AOP, где может быть полезно и т.п. расскажет гугл. Есть куча хороший статей, авторы которых умеют излагать свои мысли куда лучше меня.
                                                                              • 0
                                                                                А зачем оно так нужно, кстати? Я в примерах видел только логгирование или авторизацию, что в веб-приложениях можно сделать и без аспектов.
                                                                                • 0
                                                                                  > Для AOP модифицировать исходники. Увольте. Риски слишком большие.

                                                                                  в каком месте Вы увидели модификацию исходников?

                                                                                  > В конце-концов о том, что такое AOP, где может быть полезно и т.п. расскажет гугл.

                                                                                  то есть с практической применимостью AOP лично Вы не знакомы. так и запишем: snob mode on ;-)
                                                                                  • 0
                                                                                    Мне было не лень открыть первую ссылку и потратить 10 минут на изучения кода. А вам?

                                                                                    AOP в PHP возможно тремя вариантами (скажу спасибо, если кто дополнит):
                                                                                    — Получать все экземпляры классов через специфическую фактори, либо сделать какой-нибудь IoC контейнер. Серьезные проблемы, которые можно решить только соглашениями о кодировании, все равно остаются
                                                                                    — Использовать расширения, позволяющие модифицировать классы/функции. Нестабильно, не поддерживается байт-код кешерами, не распространено на хостингах
                                                                                    — Модификация исходников, склад модифицированных файлов в отдельную директорию и их подключение когда надо. Каждый раз проверять по времени изменения файла не надо ли перестроить эти самые исходники.
                                                                                    В этом случае мы избегаем минусов двух первых способов, но приобретаем либо зависимость от расширения tokenizer (не на всех хостингах есть), либо от своего парсера, то не является надежным.
                                                                                    • 0
                                                                                      мне привиделось, что Вы говорите о модификации сырцов самого ZE/PHP. Пардон, не так понял. Тем не менее про AOP в PHP: кодогенерация на ум не приходит, не? ;-)
                                                                                      • 0
                                                                                        пост ниже — это и есть кодогенерация
                                                                                        • 0
                                                                                          Кодогенерацией все не на кодогенерируешь…
                                                                                          • 0
                                                                                            а все и не нужно
                                                                                            есть пределы разумного
                                                                                        • 0
                                                                                          где-то реализовали АОП путем явского предпроцессора
                                                                                          четвертый вариант

                                                                                    • 0
                                                                                      Эээ. Как зачем? Использовать. Просто у java слегка другая модель для веба. Она ближе к FastCGI т.е. сервлет запускается один раз и работает пока ему не пошлют сигнал об остановке.
                                                                                      • 0
                                                                                        Понимание «зачем» приходит, когда проект вырастает далеко за рамки простого «сайтика» и появляется необходимость думать о транзакциях или юнит-тестах.
                                                                                        • 0
                                                                                          А раньше она не появляется? Простые «сайтики» пускай будут бажные и без целостной БД?
                                                                                          • 0
                                                                                            В смысле? Вы меня спрашиваете, почему некоторые полагают, что для небольших сайтиков можно не заморачиваться целостностью БД (или копипастить по коду управление транзакциями и отказами)?
                                                                                            Полагаю, что так быстрее. ПРОФИТ!
                                                                                            • 0
                                                                                              Зачем копипастить? повторное использование кода не зря придумали
                                                                                              • +1
                                                                                                Как же вы организуете управление транзакциями (на различных уровнях приложения), без «размазывания» однотипного кода по всему приложения и без AOP?
                                                                                                • 0
                                                                                                  Зависит от задачи поставленной и перспектив развития системы. Простейший способ, даже без всякого ООП, который приходит в голову — вызывать запросы к БД с параметром TransactionMode, указывающим нужно ли начинать новую транзакцию перед запросом, коммитить её после или просто выполнить запрос (еснно при всех вариантах с генерацией исключения и откате при ошибке)
                                                                                                  • 0
                                                                                                    И вы находите такой подход уместным для действительно больших систем (обсуждение ведь с этого началось)?
                                                                                                    А можно посмотреть примеры живых проектов, которые построены по такому принципу? Сколько в них задействовано разработчиков и какое у вас соотношение расходуемого времени на багфикс/импрувы/рефакторинг?
                                                                                                    • 0
                                                                                                      Такой подход я нахожу (находил вернее будет сказано) уместным для систем уровня «новости, галерея, комменты» в процедурном стиле практически без перспектив развития. Уж лучше так, чем копипастить повторяющиeся try catch или вообще откатывать операции с БД «вручную».

                                                                                                      Мои живые проекты в интранете (информационная система для клиники, система бронирования для гостиницы), далеко не хайлоад, я единственный разработчик, но поверьте на слово, что там нет кучи повторяющегося кода или незавершенных транзакций с БД. Больше всего времени, пожалуй (точную статистику не веду), уходит на рефакторинг с целью избавления от повторяющегося кода, если под багфиксами понимать исправление явных ошибок, когда пользователи «генерируют» баг-репорты.

                                                                                                      Не хочу сказать, что я супер-пупер гуру в PHP и Ruby, но PHP мой основной язык разработки еще с тех времен, когда PHP4 на российских хостингах днем с огнем не найти было. С Ruby знаком недавно, меня он поразил своей элегантностью, красотой и т. п., но вот повода применить его на практике не встречал. Скорее всего, человек активно использующий руби много лет и сможет написать на нем что-то быстрее, чем я, но уж точно на PHP я напишу это что-то быстрее, чем если буду писать на Ruby и мне довольно сложно будет объяснить заказчику, почему сроки разработки выросли. Не говоря о том, что гуру Ruby назовут мой код говнокодом :) потому что мало знать собственно язык, нужно знать его библиотеки и фреймворки, особенности трансляторов и т. д., и т. п., а главное их активно использовать, а я, пытаясь сократить сроки, буду писать в PHP-стиле, так что мой Ruby код можно будет перевести в PHP чуть ли не через поиск и замену в редакторе.
                                                                                                      • 0
                                                                                                        Спасибо за развернутый ответ.

                                                                                                        Я пытался сказать о том, что использование AOP может позволить прозрачно разделить описание бизнес-объектов и таких общих вещей как управление транзакциями. Поверьте, в крупных долгосрочных проектах, где занято несколько разработчиков, а бизнес-объекты хочется переиспользовать между проектами, это очень упрощает жизнь.
                                                                                                        При этом, как правило, все настройки этого транзакционного управления собираются в одном файле. И не надо оглядываться на крики в духе «ааа, килобайты иксэмэля, мы все умрём», потому что современние IDE с подсказками и автокомплитом превращают его редактирование в простеишую задачу.
                                                                                                        • 0
                                                                                                          Пожалуйста :)

                                                                                                          XML меня как раз не пугает, сам активно исьзую для конфигов и метаданных (хотя в последнем проекте использую YAML, т. к. его использует выбранный фреймворк)
                                                                                                  • 0
                                                                                                    А чем ваше AOP поможет то? Оно только позволяет воткнуть что-то перед/после вызова функции и все.

                                                                                                    Правильное решение должно выглядеть как-то так, имхо:

                                                                                                    db.transaction { |db|
                                                                                                    db.query1();
                                                                                                    db.query2();

                                                                                                    }

                                                                                                    • 0
                                                                                                      AOP поможет тем, что, описывая поведение бизнес-объектов, я вообще не буду заморачиваться о транзакциях.
                                                                                    • –1
                                                                                      > — Не умеет нормально работать с кодировками (и не надо мне рассказывать про iconv — уже намучился с разными нюансами)

                                                                                      Неправда. PHP может работать как со строками *символов* в разных кодировках (функции mb_*()), так и со строками из байтов (без кодировки, функции типа str_*()). Использование вторых иногда может быть выгоднее с т.зр. производительноти.

                                                                                      Зачем вы использовали iconv() — искренне не понимаю. Вы строите сервис по перекодировке текста? Или вы этот кривой подход из Явы пытаетесь на PHP перенести?))

                                                                                      UTF-8 в PHP поддерживается замечательно.

                                                                                      > — Не имеет нормальных средств для мета программирования

                                                                                      Вам аннотаций не хватает что ли? А так ли они нужны?

                                                                                      > — < тут пошли мелочи, которые меня тоже достают >

                                                                                      Повторю свой предыдущий комментарий: по количеству лишних букв в коде: Ява многословней php, php многсловней Руби. Посмотрите на Руби — вообще расхочется другими языками пользоваться.

                                                                                      • 0
                                                                                        Расширение mbstring я имел ввиду когда писал про iconv. Неправильно выразился, признаю.

                                                                                        Вот есть у вас внутри программы строка. В какой она кодировке? В Java все строки будут в одной. А в PHP какой угодно. Отслеживать это — морока страшная.

                                                                                        Да и невозможность явно указать в какой кодировке происходит ввод информации — тоже минус.

                                                                                        Кстати, стандартные функции str_* заменяются на соответствующие из mbstring при нужных настройках PHP.

                                                                                        Про UTF-8. А символы порядка байтов тоже поддерживаются? А с регулярками как? Постоянно флаг указывать? :) Еще MySql до сравнительного недавнего времени с utf-8 толком работать не мог.

                                                                                        Да и не все функции из стандартной библиотеки заменяются на аналоги из расширения mbstring.

                                                                                        А я и нигде не писал про то, что Java — лаконичен. Это не так. Он логичнее, стройнее, хз как описать. Там нет приколов типа «0» == false.

                                                                                        Я, вполне возможно, поливал бы Java таким же кол-вом грязи, если бы знал Ruby. К сожалению, это не так.

                                                                                        В каждом инструменте я пытаюсь искать не только плюсы, но и минусы. В Java для меня такие уже есть. Но я слишком плохо ее знаю, чтобы их обсуждать. А вот PHP знаю хорошо. На тему его плюсов и минусов говорить готов.
                                                                                        • 0
                                                                                          Ваша информация устарела. Если у вас страницы в utf-8 и код всех файлов php в utf-8, то прийдет вам строка только в utf-8, и никак не иначе.

                                                                                          Тоже самое с регулярками. Вообще нигде не использую флаг /u

                                                                                          С mySQL и utf-8 тоже никаких проблем нет, причем давненько.

                                                                                          С 2005 года перешел на utf-8 в проектах и еще не видел особых проблем с кодировками в PHP. Проблемы возникают с кодировками только у нубов, как показывает моя практика.

                                                                                          • 0
                                                                                            А файлы вы как читаете? Можете указать кодировку файла один раз при создании потока чтения?

                                                                                            Про маркер порядка байтов в начале файла что же не возразили?

                                                                                            Проблемы у MySql с utf-8 были. Давно. Сейчас это выражается в том, что до сих пор используют win1251. Это, конечно, — не единственная причина, но свой небольшой вклад тоже внесла.

                                                                                            Я не говорю что все ужасно, просто не жить. Я говорю о том, что танцев с бубном не избежать. Со временем к ним привыкаешь, пишешь свои костыли и т.п., но это не значит, что теперь не надо трезво смотреть на вещи.
                                                                                            • +1
                                                                                              Да вы же сударь упоротый! Вы что, место на диске экономите, создавая файлы в разной кодировке?? Если серьезно — решение — простейший класс-обертка для чтения файлов в разных кодировках через iconv() — пишется за полчаса максимум со всеми подводными камнями (подводные камни будут, если читать файл не строками, а блоками фикс. размера — может ломаться utf-8).

                                                                                              > Я не говорю что все ужасно, просто не жить. Я говорю о том, что танцев с бубном не избежать.

                                                                                              Подозреваю, что вы просто не очень разбираетесь в кодировках, не?
                                                                                              • 0
                                                                                                Знаете, я сайты для людей создаю. А они могут захотеть слать файлы в любой кодировке с возможностью указать ее. Именно так думали создатели OpenOffice. А вот в MS Office файлы открываются только в кодировке винды.

                                                                                                Безусловно, можно сделать обертку. Можно даже сделать ее так, чтобы читать все это через потоки(под этим и подразумевались танцы с бубном). Но это разве отменяет то, что в языке не заложена работа с кодировками?

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

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

                                                                                                Про знания о кодировках и пытаться возражать ничего не буду.
                                                                                              • +1
                                                                                                Чем перешел вам дорогу BOM?

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

                                                                                                Кроме того, если вы используете шаблонизатор — вы можете сами написать префетчинг с удалением BOM при чтении PHP-файла.

                                                                                                Решений с данной проблемой — достаточно много, причем оно один раз делается и забывается. «Взула и забула»

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

                                                                                                Проблем у мускуля и пхп с utf-8 нет уже лет 5 как. Вы бы еще древнее проблему вспомнили. Например ту, что в пхп4 ООП каличное. Это будет аналогично.

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

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

                                                                                                А вот эти плюшки по типу BOM или проблемы с юникодом (которые ну совсем не проблемы при ближайшем рассмотрении) — это не то, о чем стоит рассказывать. Юникод уже в 6.0 будет полноценный, а вот с функциями так пока ничего и не решили, что очень жаль.
                                                                                                • 0
                                                                                                  1. BOM
                                                                                                  Сколько времени у вас уйдет на отладку бага с этим? Вы ведь, похоже, даже не знали о том, что это есть такое.

                                                                                                  У меня все IDE сохраняют файлы в UTF-8 без BOM. Но ведь коллективная разработка никуда не делась, верно?

                                                                                                  2. Старые версии
                                                                                                  Вы про эти проблемы расскажите создателям Битрикса, которые до сих пор php4 поддерживают. К счастью, в их число не вхожу (а то стыдно было бы)

                                                                                                  К тому же стереотипы исчезают только со временем. Опять же вспоминаем про коллективную разработку.

                                                                                                  3. Про кривую стандартную библиотеку было написано много комментариями выше

                                                                                                  4. Кстати, о мета программирование
                                                                                                  В той же Java оно отнюдь не ограничивается аннотациями. Чего только стоит модификация байт-кода в памяти.

                                                                                                  AOP в веб разработке может быть очень удобно. Но PHP не дает никаких средств для реализации аспектов. А расширения, которые позволяют это, несовместимы с кешерами байт-кода.

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

                                                                                                  — Проблемы важны не тогда, когда все нормально.

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

                                                                                                  Проблемы важны, когда у вас денег много на сайте завязано. Каждая маленькая проблема важна будет.

                                                                                                  Вот когда вы будете отлавливать в срочно порядке какую-нибудь неожиданность, тогда вспомните много раз создателей PHP. Мне хватило бреда, что «0» == false (строка с символом 0).
                                                                                                  • 0
                                                                                                    1. Я знаю про BOM и выше написал даже пути решения вопроса. Вы не внимательны. У меня нисколько не занимает времени вопрос BOM.

                                                                                                    На BOM попадаются только новички в PHP. И поделом, пусть учатся.

                                                                                                    2. Мне всеравно на недопроекты по типу Битрикса и еже с ними, которые поддерживают до сих пор 4, ущербную ветку PHP. Это их личные проблемы, а не разработчиков языка. Пусть поддерживают и выгребают новые и новые грабли.

                                                                                                    Вы еще попросите Microsoft поддерживать IE4.0, т.к. отделение в Зулуссии до сих пор сайты верстает с поддержкой IE4.0

                                                                                                    3. Согласен, но ведь это основная проблема, поэтому с нее и надо начинать, а не с бомов и кодировок.

                                                                                                    А то, что пхп — слаботипизированный язык — вас тоже не смущает?

                                                                                                    4. Думаю, что до тех пор, как АОР станет полезным и реально и реально удобным для применения на веб-проектах — создатели PHP что-то придумают. Пока в веб-разработке это не столь необходимо, чтобы мыслить аспектами.

                                                                                                    5. Я к тому, что пхп6 решит проблемы, для которых вы сейчас стесняетесь применять нормальные решения. И это далеко не костыли.

                                                                                                    Рисковать ставить или не ставить — дело каждого. Мне пока пхп6 не нужен, т.к. проблем с юникодом вообще не ощущаю, либо ощущаю мало и тут же решаю, т.к. чаще всего все решается через mb_* и прочие вещи.

                                                                                                    >Мне хватило бреда, что «0» == false (строка с символом 0).

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

                                                                                                    Видимо раздел про типы и их приведение в PHP — вы не осилили.

                                                                                                    Это не неожиданность, а нежелание читать документацию к языку.
                                                                                                    • –1
                                                                                                      1. Перепутал вас с другим юзером, прошу прощения.

                                                                                                      2. Придет заказчик и скажет: «плачу много бабла, чтобы вы поправили баги на моем сайте, написанном на php4». Вы ему откажите?

                                                                                                      3. Об этом я написал выше, но поскольку возразить мне было нечего, то ярые фанаты PHP стали просто ставить минусы:):)

                                                                                                       

                                                                                                      Я тоже не ощущая проблему с юникодом. Потому что на кривой PHP было написано расширение, немного его выпрямляющее — mbstring.

                                                                                                      Но проблемы ощущаются в мелочах. И на этих самых мелочах идут потери времени.

                                                                                                       

                                                                                                      Про «0» == false. Это такой же бред, как и разделение пространства имен через "\". Это банально непривычно.

                                                                                                      Почему в юзабилити есть понятие user experience, а в языках программирования нету? Я в кружок программирования пошел с 7 класса. Успел поразвлекаться с кучей языков. Зачем создателям PHP было городить такие нюансы?
                                                                                                      Почему обычно строку к логическому типу преобразовывают по длине (пустая строка — false и наоборот), а в PHP — по-другому?
                                                                                                      • +1
                                                                                                        1. Принято, бывает. Но вы так и не пояснили, что ж такого мерзкого в BOM и чем же это большая проблема. Либо я чего-то не понимаю, либо эта проблема не стоит выеденного яйца.

                                                                                                        2. Естественно откажу. Более того — я его отправлю к тому, кто писал ему этот проект. У меня хватает работы, чтобы еще копаться в гавнокоде заказчика, написанном непонятно кем и непонятно когда. Это его проблемы, а не мои. А деньги тут не главное. Главное получать удовольствие от своей работы, а не работать как раб только за деньги.

                                                                                                        3. Что тут можно сказать. Троллей тут хватает. Я люблю PHP, я знаю его недостатки и достоинства. Это не повод пинать инакомыслящих.

                                                                                                        Почему и зачем начали городить огороды — я не знаю, это вопрос не ко мне. PHP довольно старый язык, очень динамично развивавшийся. Язык, который был призван строить простые формы на сайте и из которого сделали ИНСТРУМЕНТ для создания веб-проектов и веб-приложений.

                                                                                                        История языка прямо говорит о том, что у разработчиков не было достаточно времени на проектирование, им нужен был рынок, т.к. он фактически был пуст, в вебе не было на тот момент кроме перла ничего для веб-разработки (си++/с не берем во внимание, как и SSI, т.к. это извращения под веб).

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

                                                                                                        Возможно авторам не хватало самим опыта. Причин может быть миллион.
                                                                                                        • 0
                                                                                                          С причинами полностью согласен.

                                                                                                          Но это все равно не отменяет того факта, что PHP — отнюдь не лучший в своей области. На данный момент — точно.

                                                                                                          Тем не менее, из-за его популярности, есть куча разработчиков, которая смогла осилить только PHP и считают что лучше ничего нет.

                                                                                                          ЗЫ: Ни в коем случае не буду отрицать, для каких-то задач PHP подходит хорошо. И с точки зрения маркетинга он хорош — огромная распространенность на хостингах.
                                                                                                          • 0
                                                                                                            > что ж такого мерзкого в BOM

                                                                                                            То, что он невидим и иногда вставляется редакторами по умолчанию. Сам помню, как в одном из php-файлов оказался BOM и из-за этого картинка, генерируемая в php, в одном браузере отображалась, а в другом — нет. Искать причину пришлось долго :)
                                                                                                • 0
                                                                                                  > Если у вас страницы в utf-8 и код всех файлов php в utf-8, то прийдет вам строка только в utf-8

                                                                                                  — Код файлов php как раз не обязательно должен быть в utf-8. Пример — вордпресс
                                                                                                • 0
                                                                                                  > Вот есть у вас внутри программы строка. В какой она кодировке?

                                                                                                  В utf-8 очевидно. Поскольку разрабатывемые мной сайты обычно поддерживают русский язык, использовать 8-битные кодировки не вижу смысла. А вообще, у меня есть параметр в конфиге charset (вдруг завтра война и срочно придется менять кодировку).

                                                                                                  > А в PHP какой угодно. Отслеживать это — морока страшная.

                                                                                                  Ну тут можно схитрить, сказав, наоброт, php дает разработчику свободу выбора, просто выбрать надо сразу и не пытаться писать часть исходников в cp1251, а другую — в CJK к примеру. Юзайте utf-8 и проблем не будет.

                                                                                                  > Кстати, стандартные функции str_* заменяются на соответствующие из mbstring при нужных настройках PHP.

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

                                                                                                  > Да и невозможность явно указать в какой кодировке происходит ввод информации — тоже минус.

                                                                                                  Мы говорим про веб-приложения? Так есть такой HTTP-заголовок Content-Type, в нем указывается кодировка страницы. Формы с такой страницы отправляются в той же кодировке вроде. Если вы используете utf-8 — перекодировки не нужны.

                                                                                                  В MySQL есть команда SET NAMES utf8; (именно так, utf-8 не прокатит).

                                                                                                  > А символы порядка байтов тоже поддерживаются?

                                                                                                  Не сталкивался (( Они просто передаются на вызод программы в неизменном виде, так что это зависит скорее от браузера.

                                                                                                  > А с регулярками как? Постоянно флаг указывать? :)

                                                                                                  Увы ((. Это все же влияет на производительность.

                                                                                                  > Я, вполне возможно, поливал бы Java таким же кол-вом грязи, если бы знал Ruby. К сожалению, это не так.

                                                                                                  Вот тут я написал с примерами, почему Руби удобнее в плане синтаксиса: habrahabr.ru/blogs/webdev/74589/?reply_to=2160114#comment_2159965, посмотрите пример с реализацией транзакций.

                                                                                                  • 0
                                                                                                    Про ввод информации ответил выше. Это может быть не только HTTP запрос, но и чтение файла, сокеты, shared memory и еще много всего.

                                                                                                    Про BOM (маркер порядка байтов) посмотрите дату этого бага: bugs.php.net/bug.php?id=22108

                                                                                                    Мне понравился ваш пример с Ruby. Сейчас я хочу изучить какой-нибудь функциональный язык. На данный момент — Lisp.
                                                                                                    • 0
                                                                                                      > Про BOM (маркер порядка байтов) посмотрите дату этого бага: bugs.php.net/bug.php?id=22108

                                                                                                      Сталкивался сам, поверьте, злило, но сторого говоря. в utf-8 BOM не нужен — он сделан для отличия Big Endian от Low Endian UTF-16 (спасибо идиотам, которые придумали несколько юникодов сразу). Отключите у себя в редакторе вставку BOM и забудьте об этой проблеме.

                                                                                                      > Про ввод информации ответил выше. Это может быть не только HTTP запрос, но и чтение файла, сокеты, shared memory и еще много всего.

                                                                                                      Если вы используете разные кодировки для разынх компонент приложения — проблемы вам гарантированы в любом языке, хотя бы потому, что наборы символов в разных кодировках разные и не всегда можно без потерь перевести из одной в другую. Бросайте эту дурь, или пишите обертки для перекодировки, если не можете.

                                                                                                      > Мне понравился ваш пример с Ruby. Сейчас я хочу изучить какой-нибудь функциональный язык. На данный момент — Lisp

                                                                                                      Мда… ну если хотите писать скобками — удачи. имхо практической пользы от лиспа ноль.
                                                                                                      • 0
                                                                                                        Внутри приложения, конечно, должна быть одна кодировка. Но что там придет из вне и в какой кодировке — вопрос.

                                                                                                        Lisp'ом заинтересовался после прочтения www.nestor.minsk.by/sr/2003/07/30710.html вполне возможно, что он меня тоже бесить будет:)
                                                                                                        • 0
                                                                                                          Я бы вам порекомендовал в качестве Lisp начать со Scheme, конкретно — DrScheme. Очень классная вещь.

                                                                                                          А если захотите потом писать на Лиспе под JVM, то к вашему распоряжению Clojure.
                                                                                                        • 0
                                                                                                          Ну почему же ноль? Программистам на лиспе платят довольно приличные деньги. Другое дело, что их трудно найти (хороших).

                                                                                                          У лиспа довольно хорошая область применения в области 3D разработок, он там очень силен. В частности куски кода, насколько я знаю, на лиспе есть в 3D Max и других средах.
                                                                                                          • 0
                                                                                                            Нихрена он там не силен. Причины, по которой Lisp используется в, например, Автокаде, просты
                                                                                                            — есть неплохие встраиваемые интерпретаторы;
                                                                                                            — присутствует сборка мусора;
                                                                                                            — простой синтаксис; пусть необычный, но с минимумом синтаксиса, поэтому учится влет.
                                                                                                  • 0
                                                                                                    меня именно в это в руби убивает, если в си я могу читать код и прерасно все понимать, он почти на анг языке там написан :)
                                                                                                    • 0
                                                                                                      тогда вам лучше в питон, близок по возможностям, но читаем
                                                                                                      • 0
                                                                                                        меня вообще ООП пугают :) но вроде ruby нормально пошел.
                                                                                              • +6
                                                                                                А можно я тоже отвечу?

                                                                                                Хз, из чего вы выросли, но язык для веба подразумевает вот что:
                                                                                                — краткое время жизни выполняющейся программы; эти уши тянутся еще из CGI, в модели «запустился-сделал-умер» (все, что вне, к php прикручено костылями) как следствие, в php не сильно заморачиваются на утечки памяти и прямоту архитектуры.
                                                                                                — небольшой размер самих программ (ибо нефиг шаблонизаторам страниц быть большими); как следствие, можно не сильно заботиться о мозге программера, который копает код — он не закипит.
                                                                                                — hot start: поправил, сохранил, вуаля. Все, что требует deployment'а, остается далеко позади, потому что стереотипичному php-style-программисту некогда разбираться, он пишет методом проб и ошибок.

                                                                                                Java для «большого» веба подходит больше исключительно благодаря стараниям Sun, JBoss и иже с ними, выпустившими нормальные контейнеры для web-приложений и прямыми руками собравшими человеческую архитектуру обработки web-запросов.
                                                                                                • –1
                                                                                                  > — небольшой размер самих программ

                                                                                                  А это плохо? По моему, так скорее хорошо.

                                                                                                  > — краткое время жизни выполняющейся программы; эти уши тянутся еще из CGI, в модели «запустился-сделал-умер» (все, что вне, к php прикручено костылями) как следствие, в php не сильно заморачиваются на утечки памяти и прямоту архитектуры.

                                                                                                  А вот некоторые Ява-приложения, я слышал, по минуте запускаются. Это по-вашему более прямая архитектура. И не плетите, что мол долго запрягать — быстро ехать, просто Ява-разработчики тоже не такие гуру, каких пытаются из себя строить.

                                                                                                  > — hot start: поправил, сохранил, вуаля

                                                                                                  Поверите ли, так удобнее. А как должно быть по-вашему?

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

                                                                                                  А еще у вас уродливый Xml, и плохо с шаблонизаторами, так ведь?))
                                                                                                  • 0
                                                                                                    >> А это плохо? По моему, так скорее хорошо.

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

                                                                                                    Плохо это или нет для пхп, я не знаю, я на пхп ни разу не писал :)

                                                                                                    >>А вот некоторые Ява-приложения, я слышал, по минуте запускаются. Это по-вашему более прямая архитектура.…

                                                                                                    Нет.
                                                                                                    По моему, прямая архитектура никак не связана с временем запуска программы. Я же в предыдущем комменте написал, почему так важен hot-start для php — потому что де-факто средний разработчик на пхп забивает и на дебаггер, и на логгирование, а дефекты ищет прямо на продакшене.

                                                                                                    >> просто Ява-разработчики тоже не такие гуру, каких пытаются из себя строить.

                                                                                                    Ну и наброс, я даже комментировать не стану :)

                                                                                                    >>в связи с кратким временем жизни, разработчикам php приходится изощряться, делать программу как можно оптимальнее

                                                                                                    Именно. В ущерб читаемости, поддерживаемости, расширяемости. Проблема в этом, а не в коротком времени жизни as is.

                                                                                                    >> А еще у вас уродливый Xml, и плохо с шаблонизаторами, так ведь?

                                                                                                    Если вы про «нас», т.е. про меня, то у нас в .NET все прекрасно с и с xml, и с шаблонизаторами :) Полно разных на любой вкус — хоть Spark, хоть Asp.Net MVC, хоть Monorail, хоть NVelocity.
                                                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                • 0
                                                                                                  Все это так когда у вас многомиллионный бизнес и вы готовы вкладывать любые средства в программистов. В Российских реалиях такое есть отнюдь не всегда.

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

                                                                                                  В будущем эти толковые программисты либо уйдут, либо войдут в долю в фирме.

                                                                                                  Как искать таких среди PHP'шников я не знаю. И это проблема.
                                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                • 0
                                                                                                  Java язык специально спроектированный для быдлокодеров. Там все сделано так чтобы даже мартышка не смогла отстрелить себя яйца. И это замечательно. В результате чтобы написать работающий проект нужно 10 специально обученных обезьянок и грамотный архитектор надсмотрщик. И это прекрасно, это требования промышленности.
                                                                                                  • 0
                                                                                                    Черт возьми а как я пишу на нем без 10 специальных мартышок и архитектора? :)
                                                                                                    • 0
                                                                                                      Ну наверно так же как и я, с удовольствием от добротного и грамотно спроектированного языка и использования готовой отлаженной инфраструктуры. С легким сожалением что не можешь вести этот проект на питоне или груви.
                                                                                              • 0
                                                                                                и опять — война религий…
                                                                                                если Ява так хороша, почему РНР ее вытеснил в WEB программировании?
                                                                                                • 0
                                                                                                  Подскажите где он его вытеснил а? :) Я вот не припомню ни одной системы на java которую бы сменили на php. Может примеры приведете?
                                                                                                  • 0
                                                                                                    ну думаю в области бложиков и мелких магазинчиков он вытеснил все что было до этого написано на яве
                                                                                                    • 0
                                                                                                      Там было много Java?
                                                                                                    • 0
                                                                                                      А если переформулировать — почему до сих пор не вытеснил PHP? Даже предложения хостеров проанализировать — много хостингов с Java?
                                                                                                      • 0
                                                                                                        По той же причине, что самосвалы не вытеснили малолитражки.
                                                                                                        • 0
                                                                                                          Не совсем удачное сравнение — никто в здравом уме не будет использовать малолитражки для промышленных перевозок грунта или песка, а если и попробует, то быстро разорится, даже если будут заказчики, которым главное, чтобы доставили за конкурентную сумму, а вот PHP используют вполне успешные компании.
                                                                                                          • 0
                                                                                                            Вполне удачное. Ни одна из крупных компаний не использует PHP в больших системах с сложной логикой. Используют или Java или C#.
                                                                                                            • 0
                                                                                                              Что есть сложная логика? И большой проект? Примеры всемирно известных (а занчит, по-моему, и высоконагруженных) сайтов на PHP я могу привести и даже статистику поискать, но вот оценить их размер и сложность — увы :(
                                                                                                              • 0
                                                                                                                К примеру биржевые системы.
                                                                                                              • 0
                                                                                                                Facebook, ICQ, vkontakte, ФСБ, несколько платежных систем и куча поисковиков вроде nigma. Кстати, MySQL тоже. Список можно продолжать до бесконечности. Достаточно крупные компании?
                                                                                                                • 0
                                                                                                                  А где хоть одна биржевая система или крупная корпорация типа IBM и Sun?
                                                                                                                  • 0
                                                                                                                    вообще-то крупные корпорации имеют тенденцию к использованию пачки самых разношерстных технологий.

                                                                                                                    В качестве примера могу привести концерн DaimlerChrysler — они юзают и PHP в том числе. Достаточно крупная корпорация? :)
                                                                                                                    • 0
                                                                                                                      А для чего? :) Я вот тоже использую php для генерации простых отчетов, но как-то более серьезные задачи на нем не пишутся.
                                                                                                    • 0
                                                                                                      так к слову, мне нравится С++, он быстрый и лаконичный,

                                                                                                      но есть задачи, где лучше и менее трудозатратней все-же далать на РНР

                                                                                                      и вообще Программисту с большой буквы, выбор языка не должен быть камнем преткновения. Он должен одинаково хорошо знать и Яву и Си и разбираться в РНР. Может быть в чём-то лучше или в чём-то хуже… Я вот РНР программист, но вынужден патчить сишные модули и запускать явские классы.
                                                                                                  • –1
                                                                                                    Например, тем что без виртуализации нельзя нормально разграничить ресурсы между сервисами.
                                                                                                    • 0
                                                                                                      Вообще текущий шудлер linux много что позволяет. В том чмсле и разграничивать ресурсы между сервисами.