Pull to refresh

Comments 228

С интересом наблюдаю, как 20 лет хоронят PHP. Ну да ничего. Ruby пережили, дай бог, и очередной golang переживём.

И пионеров, путающих асинхронность с поддержкой потоков на уровне языка — тем более переживём. Не первый раз.

Здоровья вам и долгих лет!

P.S. А самого Стогова слабо на подкаст позвать? И в глаза ему сказать, что он фигню делает?
Ну вам же сказали про самую нужную фитчу, которую PHP дать не может — поддержание постоянного соединения с вебсокетом, с браузером юзера.
Вот пример использования вебсокета на чистом пхп.
phppot.com/php/simple-php-chat-using-websocket

Первая ссылка в гугле — но вообще их тысячи.
Сам лично запускал вебчат на вебсокетах и чистом пхп лет 8 назад — работает до сих пор.
Ну и писал игру на вебсокетах и тп — всё работало. Проблем с вебсокетами небыло.
И это всё ещё на пхп 5.2.
Сейчас ещё проще стало.

Только фишка в том что вебсокет далеко не всегда нужен.

По сути — это вручную сделанный ивент луп. Тут есть ряд проблем. Представьте, что иногда у вас проскакивают долгие запросы в базу. В этот момент система не будет ничего принимать и отправлять, будет ждать ответа. PDO не умееет неблокирующие вызовы. Даже если извернуться и как-то сделать (вроде бы для amphp сделали вручную клиент для mysql), это все выглядит как нагромождение костылей, а не first class citizen

Если честно, то нагромождением костылей выглядят как раз нативные модули вроде того же mysqli.

Согласшусь. К сожалению, ассинхронность в php ещё сырая, могу судить по опыту использования amphp в продакшене, и будет требовать неоправданно больших усилий в поддержке, так как текущие библиотеки страдают нестабильностью (amphp/mysql, amphp/artax) и постоянно находятся какие-то ошибки, которых в нативных решениях будет сильно меньше.
Не то чтобы что-то реализовать нельзя на php, вопрос, что ряд задач сильно дешевле сделать другим способом.

mysqli умеет асинхрооную работу с бд
Не знаю как с другими СУБД, а с MySQL и PG можно работать в неблокирующем режиме.
Прошу проверить вашу гипотезу в моем чате, правда нужно авторизоваться с оплатой в 1 бакс :), а потом можете делать выводы о невозможности PHP поддерживать сокеты.
Голосование на хабре нужно изменить, если кто то голосует против, то должен оставить пояснение, а так это — устранение неподходящих.

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

Я дал ответ про web-sockets, и что может ли PHP держать нагрузку, как я могу еще доказать то что написал в комментарии, не дав линк на работающий проект? А то что кто то видит только спам — не значит что я сказал что то не то и голосование идет за ответ, а не люблю или не люблю(нравиться или не нравиться).
как я могу еще доказать то что написал в комментарии, не дав линк на работающий проект?

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


А то что кто то видит только спам — не значит что я сказал что то не то и голосование идет за ответ, а не люблю или не люблю(нравиться или не нравиться).

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


То есть что получается. Вы сказали, что кто-то должен заплатить вам деньги, хотя это вы хотите что-то доказать; кто-то должен сделать какие-то действия, которые ничего не докажут; прорекламировали свой платный проект, хотя согласие на получение рекламы здесь вам никто не давал; и без обоснований обвинили широкий круг людей в низких моральных качествах. Далее вы задали вопрос "что не так", а когда получили честный ответ, что это из-за рекламы и некорректной логики, продолжаете говорить "нет, это неправда, вы всё врете".

Вы ничего не сделали что бы опровергнуть или доказать что я "обманщик", но уже сильно уверенно утверждаете и за всех посетителей отвечаете. А также зачем мне портить свою репутацию обманывая молодых людей?
Во-вторых я не обязан вам предоставлять исходный код. Я хочу что бы молодые ребята не велись на всякие манипуляции в комментариях о PHP и не проверив самостоятельно или посмотрев на проект(мой или чужой) сделали выводы, а также получали опыт.
Каждый сам решает платить или нет, почему вас это волнует. Может кто то посчитает что оплатив вход в проект он сам посмотрит как он работает, проверит работу чата и т.д. И я указал что вход платный потому что бы предупредить и не тратить время на регистрацию если она не пустит в проект без оплаты.
Вы ничего не сделали что бы опровергнуть или доказать что я "обманщик"

Где именно я сказал, что вы обманщик?


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

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


не проверив самостоятельно или посмотрев на проект(мой или чужой)

"Посмотреть на проект" означает "посмотреть на исходники". Чьи-то слова "да там точно одно соединение, правда-правда" ничего не доказывают. Может вы просто думаете, что там одно соединение, а работает оно совсем по-другому.


Каждый сам решает платить или нет, почему вас это волнует.

Меня это не волнует. Вы спросили "почему минусы", я дал вам ответ. При этом сам я минус не ставил.


Может кто то посчитает что оплатив вход в проект он сам посмотрит как он работает, проверит работу чата и т.д.

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


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


и за всех посетителей отвечаете

А как вы представляете ответ на вопрос "за что минусы" на сайте, где у каждого пользователя свой аккаунт? Ну можете считать, что у меня написано не "Люди поставили минус за то-то", а "Я бы поставил минус за то-то". Принципиально это ничего не меняет. Просто я вам объяснил, а остальные не хотят. Потому что никто не обязан вам что-то объяснять. Какие выводы сделать из этой информации, решайте сами.

Ок, я уже не обманщик, значит правду говорю что: "PHP" —
ничего не
может все, и одни только лузеры его используют :) Все по своему правы, но учтете — всегда проверяйте любые факты сами, тогда Ваши шансы обойти мышеловку стороной увеличатся, а и опыта станет побольше.
Еще в «ушедшем далеко вебе» были убийцы Flash и Silverlight. Хоронителям пора задуматься над тем, что из себя представляет веб на самом деле.
UFO just landed and posted this here
Надеюсь, что нет. Просто их в своё время тоже называли убийцами хтмл. Говорили, что хтмл не тянет растущих потребностей пользователей, ну и всё такое прочее.
Хороший комментарий на мой взгляд, добавлю немного своего:

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

Вторая проблема PHP — люди не хотят глубоко вникать в него, например недавно столкнулся с человеком который считает что yild есть в phyton и нет в php. А вы знаете, что генераторы появились еще в PHP5.5? Вот статья интересная — nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
UFO just landed and posted this here
Но он не позволяет одной переменной стать сначало строкой, а потом массивом.
С этим ошибок в тех ЯП, где такое возможно, у меня не было связано. Не то, чтобы это было хорошая фича, но вреда по факту тоже не несёт (если не писать божественные функции).
Он не позволяет ошибок проектирования.
Забавно регулярно оду типизации Go читать. Видимо, всё от разработчиков, всю жизнь писавших на динамических ЯП. Попробуйте Rust. Или хотя бы Typescript. Go слишком примитивен для каких-то там гарантий компиляции. И он нарочно примитивен.
Можете даже попробовать PHP + Psalm со всеми ошибками.
UFO just landed and posted this here
А мне не очень хочется заниматься выделением/освобождением памяти
Да, это убийство производительности в С, но в Rust это происходит полуавтоматически, и за соблюдением правил владения в коде следит анализатор компилятора. Условно говоря, вы можете использовать только умные ссылки и только правильно. Церемоний немного больше и обучения правилам намного больше, чем в Go.
В принципе да, немало низкого уровня у этого улучшенного С, в отличие от Haskell. Там вообще думаешь только о задаче, но в менее привычных условиях.
Поясните подробней?
В Go ведь очень распространено приведение типов из-за невыразительности системы типов, она же там почти как в Pascal. По сути всё есть явно и однозначно типизированные переменные и структуры. И под капотом больше, чем даёт синтакис.
В Rust есть например параметризация типов, тип-сумма, перечисления, абстрактные типы.
Ну так для справки — по статистике из SO среди профессиональных разработчиков по сравнению с 2019 годом PHP, Ruby, Scala упали а Go, Kotlin, C# выросли. Просто цифры. insights.stackoverflow.com/survey/2020

« Профессиональные разработчики» здесь — это на 95% люди, которые спрашивают, как развернуть связный список. Да и массовость и качество — очень слабо пересекающиеся характеристики.

То что нет дженериков — просто печаль и беда.

Про ноду не соглашусь, вот она уж точно в мир иной направляется, с каждым годом встречаю ее все меньше и меньше.

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

Яву вот я люблю хоть давненько и не писал на ней. Как раз после явы испытваю страшную боль, что нельзя просто взять соединение из пула и кинуть туда данные, но последнее время боль стала нестерпимой. При этом спринг — хорошая конечно штука, но во первых дикий оверхед, во вторых магия аннотация меня лично просто убивает. JSP чтоль помучать)

Зы а мне нравится роутинг на файлах) я уже разок имел опыт разыскивания аннотаций везде и всюду, а уж какой кайф если кто перепишет поведение аннотации.
… во вторых магия аннотация меня лично просто убивает.

На самом деле, даже для не особо подготовленных спецов по java, это давно уже не магия. Очень много докладов и материалов на эту тематику (например Евгения Борисова, есть стрим где он, в формате лайфкодинга, создавал спринг «на коленке»), которые вдоль и поперек говорят об этой «магии». Было бы желание разобраться.
Спасибо, доклад гляну, но по многим причинам я люблю прозрачный и очевидный код. Аннотации явы это очень мощный инструмент, но он делает код гораздо менее очевидным.
Ну справедливости ради, ещё бы дать определение что такое «прозрачный и очевидный код». Здесь скорее зависит от программиста, совокупность его профессиональных навыков и опыта, исходя из этого, любой код становится очевиднее или нет. В любом случае вы можете и не использовать аннотации. Станет ли тогда код более читаемым? Не уверен.
в чем вы видите оверхед явы? если вас смущает потребление памяти контейнерами, сейчас можно собрать стенделоун на quarkus в бинарник мегебайт 20и для рест-сервиса или 50-100 для рест сервиса с субд. И для разработчика это будет выглядеть почти так же чистенько и безлисапедно как спринг бут.
а причем тут ява? оверхед у спринга, там один только hubernate даст 200% оверхеда.
Сильно согласимся с тем, что php переусложнили. Не то что бы мы расстраивались из-за этого прогресса, но смысл в том, что его применение сейчас это не то что привлекало простотой когда он начинался. С другой стороны чего мы хотели — не один десяток лет прошел.

А вот хоронить php из-за «один процесс на один вызов», пожалуй, всё же не стоит. Демоны на php работают месяцами, если писать их грамотно и не аттачить кучу либ у которых память течет, в чем блин проблема?.. Сокет к демону прикрутить? Да хоть свой колхоз набросать не так уж сложно- нас в свое время эта habr.com/en/post/331462 статья на это сподвигла (спасибо morozovsk кстати ), хоть сторонние инструменты использоват — основной код-то всё равно останется тем же.
Да, go/nodejs более нативны в этом смысле, но у них свои нюансы есть.

Я благодарен php за быстрый вход в тему в 2003 году. Профессионалом на нем не стал — ушел в другие языки. Но того опыта хватило, чтобы сделать свою страницу. Если бы мне тогда попалась java, то я бы стороной обошел web-разработку.
Сейчас я понимаю, что php — отличный язык, который помогает кормить не одну семью. Долгих лет жизни. И, кстати, fb и vk были написаны изначально на php, насколько я помню)

UFO just landed and posted this here

Специально покопался чуть-чуть. Судя по всему, фб и вк сделали траслятор php-> cpp. Язык остался, а среда выполнения — уже иная.

Не совсем. В 2010 году они действительно сделали компилятор HPHPc, но он им в итоге не зашел и через год они решили просто запилить собственный интерпретатор HHVM с JIT. Сам интерпретатор получился годным, а вот с JIT возникли проблемы, и еще через пару лет попыток подружить JIT и PHP они плюнули и создали свой диалект языка под названием Hack, с которым JIT работал лучше. Какое-то время они поддерживали обратную совместимость HHVM с PHP, но после выхода php7 интерес сообщества к HHVM пропал и они забили. Теперь у них свой самобытный язык и исполняющая среда, которые за рамками самого фейсбука никто не использует.

Интересно, рассматривают ли они возможность перехода на PHP8

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

Хорошие менеджеры обычно умеют вовремя фиксировать убытки и закрывать тупиковые проекты.

На данном этапе тупиковость проекта не очевидно. Они сделали JIT на 10 лет раньше команды PHP и все это время развивали его, а так же 5 лет выстраивали инфраструктуру вокруг своего языка Hack, к которому они привыкли и для которого у них есть все необходимое. В этой ситуации плюсы возврата на PHP весьма сомнительны.
Странно другое, почему они свой Hack не пропагандируют активно? Ведь им выгодно, чтобы в мире больше хак-истов.
Потому что как отдельный самостоятельный язык программирования он не нужен, а как php на батарейках потерял актуальность с выходом php7.
Есть, конечно, ReactPHP, Swoole, Amphp, но это по сути костыли, с помощью которых можно попытаться обойти ограничения PHP. Однако это не сам язык, а именно костыли.
А что голая нода и го дают работать с вебсокетами из коробки, никаких сторонних пакетов для этого не надо?
UFO just landed and posted this here
UFO just landed and posted this here

Не надо путать реализацию вебсокетов с принципиальной поддержкой персистентных соединений и асинхронности.

или же вообще выбросить php полностью и написать ВЕСЬ проект на конкурирующей технологии

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

1) Единственная причина почему пхп развивается так, а не иначе — это желание бизнеса, который начинался в гараже и смог выжить — с минимальными усилиями поддерживать свою кодовую базу. Ибо гораздо проще переписать старый проект на php, на Symfony с новой версией php, чем полностью менять стек.

Поэтому, ребята из Symfony и Doctrine просто копируют основную функциональность Spring + Hibernate. Ибо бизнесу на php нужно то же самое, что бизнесу на Java, но на php. Откройте спонсоров Symfony и все станет понятно.

2) Если автор ничего в жизни на php не писал кроме адинок, то значит он херовый кодерок. Открываешь по Москве вакансии на php с ценником 140к и выше, везде хайлоад проекты на php. Естественно, там пайплайны выносят на go, очереди на реббите или кафте, кеши и мапы на редисе, логи на эластике и прочее. Но основная кодовая база на php. И знаешь, как-то работает все и приносит деньги. И даже новые разработчики приходят и продолжают развивать проект без боли.

3) Восьмерка php с её jit — это еще один шаг к тому, чтобы сделать из php java. Почему это хотят сделать? Читаем пункт номер 1.
Я как раз-таки писал на php разное, в том числе и микросервисы. И что-то вроде прокси делал однажды. И хайлоад-проект развивал.
И пришел к осознанному выводу, что php плох в этом. Гораздо проще заюзать другие технологии.

А вот там, где есть сложная однопоточная бизнес-логика без особой нагрузки — php рулит.
«Гораздо проще заюзать другие технологии» — кому проще? Какому-то криворукому программисту, что не умеет готовить ПХП — возможно. Но не бизнесу, у которого попросят бюджет на рефакторинг. И не тех-диру, которому придется уволить всех разработчиков и нанять ребят с другим стеком и опытом, либо ждать пока существующие пересядут на другой стек.

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

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


Программисты с мозгами легко осваивают новые языки, тем более такие простые как go. Более того, каждый второй php-шник уже попробовал сделать helloworld на Go (сужу по своей команде и по опыту проведения собеседований)


Про nodejs я вообще молчу — js в каком-то виде знают все, примеров по вебсокетам в инете полно.


Ждать ничего не надо, попробуйте, это совсем просто.


Про криворукость, хлебушек и прочие неадекватные оскорбления — проигнорирую.


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

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

centrifugo
Если вы про centrifugo от ребят из Авито (Ну как Авито, от Саши =)), то там Golang под капотом
Да. Я его тут привел затем, что для приложения на PHP Centrifugo будет как внешний сервис, доступный через HTTP API. Погружение в go будет совершенно ненужно для решения поставленной задачи (создания чатика). Достаточно умения развернуть Centrifugo и сделать к нему запросы. Centrifugo поможет с удержанием постоянных соединений до клиента.
Дайка подумаю, как же я сделаю чат службы поддержки на PHP. Ну наверное также, как и ребята из Avito/LiveTex/LivePerson/Zopim/JivoSite/Shopify и прочих.

Сделаю бизнес-логику и API на PHP, сделаю чат-сервер демон на node.js/go/java, который при старте загрузит информацию через API (написанное на php) в контекст и будет гонять все через веб-сокеты, а по окончанию чата сбросит все в базу опять же через апи написанное на PHP.

___

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

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

Просто задам один вопрос: если надо будет делать чат службы поддержки на PHP, как вы будете это делать?
Ratchet может быть?
Расскажу свой случай. У нас была задача такая: от пользователя сообщения должны были приходить через некую прослойку, которая в итоге посылала сообщения через NATS в наше приложение. При этом наше приложение должно было держать вебсокет до админки системы (чат службы поддержки)

Т.е. по сути php должен был слушать сразу два места: NATS и Websocket и реагировать на них. Все что пришло через вебсокеты, отправлять в NATS, всё что пришло из NATS отпроавлять в вебсокеты. Попутно сохраняя в базе.

Мы нашли библиотеку для NATS, но она делала что-то вроде `$client->wait(1);` типа жди сообщений. Но как при этом еще и сообщения вебсокетов ждать — это вопрос.

Мы конечно придумали адову схему с очередями и кучей демонов. Но потом поняли, что на go это делается элементарно. И поддержка вебсокетов/nats там лучше. И контейнер с гошным демоном весит очень мало (только сам бинарь по сути). Одни плюсы для таких задач.

С тех пор наша команда стала PHP/GO

Даже в примере PHP NATS — есть пример как слушать без того чтобы зависать на этой строке.

github.com/repejota/phpnats

$client->subscribe(
    'sayhello',
    function ($message) {
        $message->reply('Reply: Hello, '.$message->getBody().' !!!');
    }
);


Так что может быть проблема в том что в вашей библиотеке не было нужного функционала или же вы его не нашли?

Но в любом случае, вы выбрали конкретный нишевый пример который у вас, в вашем проекте был. 99% программистов даже не слышали про NATS и он им не нужен

Э-э-э, нет, это так не работает. Даже я со своим нулевым опытом в PHP вижу, что без вызова wait никакой subscribe работать не будет.


Во-первых, общие соображения: кто-то все равно должен "крутить" цикл чтения, и если он внутри библиотеки — то он и окажется "точкой зависания".


Во-вторых, быстрый поиск по репозиторию показывает, что чтение сообщений из сокета в библиотеке именно в этом методе wait и находится.

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

Но даже если бы блокировал — это проблема ПХП или же проблема библиотеки?

Да нет, всё равно будет блокировать. Представьте, что из сокета пришло "MSG" и всё — тогда wait начнёт читать пришедшее сообщение и будет ждать пока придёт основная часть.


Плюс любая запись в сокет блокирующая.


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


Кстати, там на самом деле надо не wait(0) писать, а wait(-1), потому что 0 означает "читать до закрытия сокета". Да и wait(-1) тоже не так как хотелось бы работает...


Но да, это всего лишь одна неудачная библиотека.

Там есть функция:
\Nats\Connection::setStreamTimeout которая позволяет ставить таймаут на сокет, т.е. получается что receive вылетит по таймауту в этом случае.

Но задача-то заключается в реагировании на сообщения из веб-сокета сразу же, а не между тайм-аутами Nats

А можно узнать, зачем в одной точке слушать два источника сразу?

Потому что это не точка, а канал между двумя точками.

CQRS не, не работает?

Почему надо страдать и делать двунаправленный канал. Когда можно поднять два однонаправленных канала?
Какие у нас ограничения на это?

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


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

Не-не. Речь выше шла о том что мы должны слушать 2 разных канала в одной точке.
nats + websocket

И вот я пытаюсь понять — зачем люди пытаются страдать?

Неблокирующему IO в PHP уже лет 20 минимум. Да, это всего лишь биндинг к select и ко. Можно биндинги к libevent прикрутить. В общем в таких постановках задачи на PHP решаются. Другое дело, что очень многие PHP-разработчики, без навыков, скажем так, разработки на C, за разумное время с приемлемым качеством не смогут разработать что-то вроде шлюза между, например, веб-сокетами, раббитом и попутным хождением в веб-сервис.

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


Эта операция может быть внутри прикладной библиотеки или снаружи. Если она внутри — то код будет на этом вызове зависать независимо от типа используемых сокетов. А если она снаружи — то API библиотеки неизбежно будет выглядеть сложнее чем у PHP NATS (ну или у библиотеки будет зависимость от какого-нибудь ReactPHP, что также не наблюдается).

Единственная причина почему пхп развивается так, а не иначе — это желание бизнеса

Дико плюсую: недавно был отличный доклад на эту тему на онлайн-митапе.
Восьмерка php с её jit — это еще один шаг к тому, чтобы сделать из php java. Почему это хотят сделать? Читаем пункт номер 1.


Сделать из PHP Java, только хуже. Java в свою очередь сейчас «собирается» из Scala и Kotlin (если смотреть JVM-мирок), только хуже, чем они.

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


И всего вышесказанного выходит, что PHP — лучший выбор для legacy проекта, который по «причинам бизнеса» не вариант рефакторить на что-то адекватное.

везде хайлоад проекты на php


Совсем очевидно, что новый проект с уклоном в хайлоад никто в здравом уме не будет делать на PHP. И не потому что язык плохой — а потому что конкурентный асинхронный код всегда будет эффективнее. Нормальная система типов всегда будет давать больше качественных абстракций и (что самое главное) гарантий работоспособности кода.
А на чём бы вы начали писать новый проект для веба? Всё-таки на старте обычно непонятно будет хайлоад или нет. А PHP — это не только язык, но и куча готовых решений для веба, Symfony/Laravel/Yii, куча библиотек в composer и т.д.

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


Я бы начал на Go. Многие пробуют Elixir или даже раст, но порог входа выше при неочевидных плюсах...


Дополнительный плюс статической типизации — сложнее накосячить и проще рефакторить.

Я бы начал на Go. Многие пробуют Elixir или даже раст, но порог входа выше при неочевидных плюсах...

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


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

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


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

Конечно, никто не дает вам 100% гарантий. Это реальный мир — тут всегда есть погрешности и трейдоффы. Но просто сравните строго типизированный язык с динамически типизированным — и там и там есть типы, просто во втором случае они в голове у автора кода… т.е. грубо говоря — эти знания разработчик не коммитит в проект, а уносит с собой по окончании рабочего дня. Не трудно догадаться, что с точки зрения работодателя это такая себе ситуация и ему хотелось бы, чтобы все знания оставались в проекте.

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


Строгая статическая типизация — это и есть доказательство работоспособности.

Да-да. 2.0 * π * R как формула для вычисления площади круга сразу же будет завернута компилятором, как только вы укажете, что входной параметр — float.


во втором случае они в голове у автора кода

Да-да. Про типы все слышали, про документацию пока не все.


с точки зрения работодателя это такая себе ситуация

Мне не надо догадываться, я принимаю непосредственное участие в выборе стека.

Про типы все слышали, про документацию пока не все.


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

как формула для вычисления площади круга сразу же будет завернута компилятором


Не уверен, что понял вас.

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


:)
Каким большинством? Имеется какая-то статистика? Как минимум не очевидно, что большинство (разработчиков я так понимаю?) пишет на статически типизированных языках. А про тезисы «да-да» лучше умолчать.
Пишем типы в комментах?

Нет.


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

В код докера загляните. Да просто в любую библиотеку чуть сложнее лефтпада.

Возможно вы не успели заметить — я дописал одно предложение к моему комменту:

Я не имею ввиду какую-нибудь опенсорс библиотеку. Я про внутренний проект и документация\типизацию именно внутреннего проекта.


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

Я не пропущу код без внятной документации интерфейса на код ревью.


чем больше знаний закоммичено непосредственно в проект — тем лучше, и не важно что это: типы, доки

Ну а так-то да, с этим никто и не спорит. Просто это совсем не то же самое, с чем вы в эту ветку пришли.

Ну а так-то да, с этим никто и не спорит. Просто это совсем не то же самое, с чем вы в эту ветку пришли.


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

Я не пропущу код без внятной документации интерфейса на код ревью.


Ну, окей. Но это ваш личный опыт, применительно к проектам, в которых вы проводите код ревью.

А вот компилятор не пропустит в продакшен код с тайп-еррорами любого проекта, который его использует. И количество таких проектов, скажем так, значительно больше, чем то, что может проревьювить 1 человек.
UFO just landed and posted this here
что вы имеете в виду

Я, как всегда, имею в виду сарказм.


Чтобы компилятор его правильно завернул, нужны типы «длина» и «площадь», и правильное определение функции area (а не выведенный тип, который окажется для такой формулы длиной, и это можно и не заметить и пропустить, в принципе).


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

Так а кто мешает ввести пользовательские типы? Смысл наличия типов ведь в том, что компилятор может проверить их, а не в том, что в каком-то условном ЯП перечислены все возможные их варианты.
А ваш пример — это ошибка в правильном указании типов. Да, от таких ошибок статические ЯП не защищают…
Мне кажется, автор комментария выше говорил про то, что если вы запишете в коде неправильную логику (формулу), то компилятор не проверит её по Вселенской Базе Данных и не упадёт при несовпадении с наблюдаемой реальностью, а примет как факт. В принципе, логично, как и то, что компилятор не сможет проверить, что заказчик просил у вас платежный шлюз, а вы написали таймер для йоги.

Наверно это может проверить только вероятностная логика какой-нибудь нейронки: «что-то это не выглядит как платёжные шлюзы, с которыми у меня был опыт». Можно использовать бионейронки и называть это QA.

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

причем даже в очень хамских статьях


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

Плюсы статической типизации переоценены


Поделитесь ссылкой если у вас получится объективное сравнение, мне будет очень интересно почитать, особенно с точки зрения сложных (больших) проектов с длительным жизненным циклом (регулярные релизы\рефакторы) или проектов из области критических бизнес-процессов (важно чтобы работало корректно)
UFO just landed and posted this here
swoole. посмотрите фреймворк hyperf, поддерживает psr. Coroutine на swolle даже быстрее чем на golang.
Я не пытаюсь сказать, что PHP какой-то уж совсем медленный. Беглое гугление говорит, что swoole — довольно интересный инструмент, но так или иначе — нужно разбираться в том, как работают все эти инструменты, чтобы эффективно использовать их в проде. Кажется, что swoole не переварит блокирующие операции (хотя может я и не прав).

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

быстрее чем на golang

Ничего не могу комментировать про go, к сожалению.
Вам реально нужна производительность

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

Производительность бывает разная.

Да, согласен. Думаю, что я сужу с уклоном в свою область разработки.

где многопоточность её наоборот просадит

В целом — да, потому что не всегда многопоточку можно сделать красиво и правильно.
В целом — да, потому что не всегда многопоточку можно сделать красиво и правильно.

Я скорее про те случаи, когда оверхед на работу с потоками будет больше, чем обсчитать всё линейно в текущем. Как многопоточность не готовь, она не будет бесплатной.

Как это не переварит блокирующие операции. Я же говорю, корутины. В этом из и суть. Свул уже поддерживает корутины для mysql, Redis, http,…

Интересно наблюдать как из года в год всё хоронят PHP. А всё потому что нет его понимания.
Это кстати частая проблема "тим-лидов" приходящих из других ЯП: ожидание, что выработанная картина мира подойдёт везде..


PHP — это не про чаты или real time с gRPC. PHP про бизнес логику. На текущем уровне развития языка, real time лучше оставить для рассчитанных на это ЯП.


Также стоит упомянуть, что на обычном кейсе с множеством запросов в БД — PHP неплохо тягается с упомянутыми автором Go, Java и C#.
Например, по ссылке ниже, можно заметить, что Go идёт только за PHP.
https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=query&l=zijn99-1r
Исходники и описание окружения в описании.

Я вот только не пойму, почему на более чистом и простом (в смысле синтаксиса) Python эта бизнес логика будет хуже? Или ее будет сложнее написать? При том что в Python async/await отлично работают.


Например, по ссылке ниже, можно заметить, что Go идёт только за PHP.

Тут надо понимать что какой ценой был получен этот результат. И если говорить про БД то с PHP приходится использовать сторонние пулеры для Postgres.

Сложнее. Или в Python сделали приватные и защищенные методы? Да и с ORM не всё хорошо было, насколько помню — ничего похожего на Doctrine.

Давно витала такая мысль. С каждым php дайджестом замечаю, что в 8 версию добавляется только сахар, который можно реализовать существующими средствами. Все эти фичи только усложняют язык, который по мне уже достаточно хорошо в 7 версии.
UFO just landed and posted this here
Сахар повышает порог входа в язык, пусть и не значительно. Ну и с сахаром важно аккуратно обращаться — нет нужды объяснять, что насыпав в чашку сахар до половины — чай получится не самый лучший.

На текущий момент в PHP с сахаром кажется всё хорошо. Но важно не перейти эту тонкую грань, когда сахара слишком много. По моим ощущениям — PHP как раз ходит на этой грани.
и это говорит тим лид? тим лид забыл что инструмент выбирается под задачу? не хватает возможностей PHP100500? возьми Golang,nodejs для поддержки вебсокетов. Это будет тупой сервис который через какой-то прокси(база, редис, кафка, что угодно еще) прокидывать нужные данные в основную кодовую базу.

Нужна скорость, реальная скорость для обработки, ну скажем картинок, Rust или С в помощь, но при этом кодовая база остается на PHP.

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

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

Да так и делаю часто, смесь технологий. О чем и написал в статье.

Но было бы круче, чтобы php сам умел решать типичные веб-задачи, сам умел общаться с вебсокетами и кафкой одновременно, причем из коробки.
так… умеет… почему нет. делаете демона, плодите чайлдов, которые в свою очередь общаются со всеми и вся, общаетесь с кем хотите.

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

Если на других языках это делать удобнее, то зачем это делать на том, на котором неудобно? Вы мазохист?

Делать на них может и удобнее, но это надо:


  • выбрать что-то конкретное: Node.js (с TypeScript или без?), Java, Kotlin, C#, Go, Python, Ruby, C, C++ — вот какой из них подходит лучше всех для таких задач я не знаю. Как выбрать?
  • изучить самому, обучить минимум двух человек в команде и не факт, что они прямо рады будут, что не услышишь "я на PHP пришёл программировать!" или "тогда снимай с меня задачи остальные на месяц — я курсы будут проходить в рабочее время", а в дальнейшем при ротации или росте учитывать это в требованиях.
  • время от времени переключаться между синтаксисами и семантиками, что может приводить к идиотским по меркам языка ошибкам. Вот в PHP пустой массив приводится к false, а в JS/TS к true. И у любого JSника возникнет, как минимум, недоумение при виде условия if (items) {},
Увы и ах, как ни ускоряй PHP, но под каждый HTTP-запрос выделяется отдельный процесс — это поведение прибито гвоздями


Это ложь. Удалите пожалуйста свою статью. Вы вводите в заблуждение молодые не окрепшие умы и их детскую психику.
Т.е. вы хотите сказать, что один php-fpm worker может обрабатывать сразу несколько http-запросов?
php-fpm это fastcgi — он не обрабатывает http запросы. HTTP запросы обрабатывает веб сервер.
Ok. Веб-запросы обрабатывает nginx, nginx делает запросы к phpfpm. Phpfpm обрабатывает каждый запрос отдельным процессом.
Phpfpm обрабатывает каждый запрос отдельным процессом.

Попробуйте запустите php-fpm с pm.static где будет 1 дочерний процесс. И выполните 2-4 HTTP запроса одновременно. И вы увидите что всё ок и ваше утверждение ложь.

А еще вы можете написать свой веб-сервер на php который будет обрабатывать одновременно >= 2 rps. Можно сделать его на чистом exec и pipeах. И всё это будет работать одновременно. Если нужно покрасивей и побольше контроля, можно взять pcntl. Но если вам нужно шарить данные между http запросами, вы можете использовать pthreads.

Делаем вывод что ничего в php гвоздями не прибито. Кроме того вы можете написать extension как на PHP, так и на C. И это будет очень быстрое решение.
Пожалуйста удалите статью или исправьте недочеты.
Не вводите людей в заблуждение.
Вы сами то попробуйте. Ваши запросы, хоть и выполнятся в конце концов, но будут делать это по очереди.

Возьмите скрипт, который делает sleep 5 сек, а потом записывает в лог время
Непонятно про что именно Вы (в комменте на который Вы отвечали несколько вариантов), но если Вы про pcntl, то все вполне выполняется одновременно…
$ mkdir tmp && cd tmp
$ echo "<?php exec('php '. __DIR__ . '/worker.php'.' > /dev/null 2>/dev/null &');" > ./server.php
$ echo '<?php sleep(5); file_put_contents(__DIR__."/test.log", date("H:i:s")." -> worker_id =".uniqid()."\n", FILE_APPEND);' > ./worker.php
$ php server.php


Через 5 секунд появится файлик test.log.
Можете запустить из >= 2 терминалов и увидите
$ cat test.log 
15:41:27 -> worker_id =5ed648f71c829
15:41:27 -> worker_id =5ed648f71d05e


Код веб сервера будет чуть посложней, но смысл тот же.
UPD: можно использовать встроенный в php web сервер для демонстрации
$ php -S localhost:3111 server.php

И обратитесь одновременно через curl -v localhost:3111
Также увидите что worker_id будет разный.
Для большей очевидности «асинхронности» можно добавить в server.php ответ
$ echo "<?php exec('php '. __DIR__ . '/worker.php'.' > /dev/null 2>/dev/null &'); die('test\n');" > ./server.php

Но ведь ваш server.php создаёт по процессу на каждый запрос!

Я отвечал на вопрос о одновременности, а не о количестве запросов на процесс.
вот скрипт код который обрабатывает много запросов одновременно не «порождая других процессов»
<?php

$socket = stream_socket_server("tcp://127.0.0.1:3111", $errno, $errstr);

if (!$socket) {
    die("$errstr ($errno)\n");
}
$log = __DIR__ . '/test.log';
while ($connect = stream_socket_accept($socket, -1)) {
    file_put_contents($log, date('d.m.Y H:i:s').' -> request_id = '.uniqid()."\n", FILE_APPEND);
    fwrite($connect, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\nHELLO");
    fclose($connect);
}

fclose($socket);

Я еще раз повторюсь — этот код публикую для ответа на некорректную инфомрацию в статье о том что HTTP запросы можно обрабатывать 1 процессом. Некорректно сравнивать кол-во запросов на процесс, с кол-вом долгих процессов и асинхронностью в php.
Но он это сделает не одновременно. Сначала выполнится один, потом второй.
Он их выполнит последовательно. Воркеры не умираю после выполнения запроса (но фпм может убить воркер после того, как он обработает N запросов, это как настроишь).
Кстати, Сергей Жук на каком-то выступлении прямо сказал, что для таких целей зачастую лучше использовать другие языки
Сергей Жук на каком-то выступлении прямо сказал, что для таких целей зачастую лучше использовать другие языки

Если вы о докладе на митапе ростовского PHP-сообщества, то речь шла о выборе для новых проектов. Вот этот кусок выступления — youtu.be/2TBrGX1-mJY?t=12195

«Если говорить про выбор технологии, то… если у вас новый проект, и стоит вопрос, что выбрать, конечно, не ReactPHP, потому что это сбоку сделано. И даже, наверное, не ноду»

Ниша по сути — это админки со сложной бизнес-логикой (т.е. на Golang такое писать нецелесообразно) и не особо нагруженные сайты. Здесь PHP — лидер.

… и это 90% современного веба
99% веба это интерфейс доступа к базе данных в том или ином виде

Даже гугл — это просто база данных, из которой мы ищем то что нам нужно.

Так все программирование по сути — чтение/обработка/запись данных в том или ином виде.

Я согласен с автором только в одном — то что ПХП не совсем подходит для асинхронных задач, где нужно await/async и тп. Но моё мнение — это даже хорошо.

Основная фишка ПХП — это всё же то что на нём достаточно просто программировать и достаточно легко его использовать для решения бизнеса. (мы же помним, что программист должен решать задачи бизнеса, а не программировать на работе ради развлечения? )

Давайте немного отойдем от синтаксиса языка и подумаем про экосистемы.

В данный момент (по моему мнению!), основные крупные экосистемы в ВЕБЕ это: PHP, Python, NodeJs, GO?, Java, .NET, Ruby.

.NET — он напрямую связан с виндовсом и сопутствующими проблемами и плюсами. Фактически полностью отдельный стек, который надо изучать отдельно. Из минусов — не на любой хостинг поставишь. Т.е. требует отдельных серверов. Насколько я знаю — в основном используется в крупных фирмах и корпорациях.

Java — корпорации только, писать с нуля небольшой проект на нём — надо быть очень фанатом.

Ruby — вроде бы его популярность идёт вниз последнее время, но, насколько я знаю, он никогда небыл сильно популярен, могу ошибатся.

GO — вроде бы хайп начинается на его тему, но даже на этом фоне, он нишевый язык, для определённых задач. На нём писать обычные сайты, а не микросервисы — насколько это легко вообще? Есть ли темплейты для хтмла, ORM, и тп из коробки (в любом крупном фреймворке). Язык создан в 2007 году, но за 13 лет он не набрал большого хайпа и я бы не заметил огромной экосистемы для него, в которой можно найти библиотеки для подключения ко всему чему угодно. Писать НЕ хайлоад на GO — насколько удобно?

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

NodeJs — по своему язык хорош: Быстрый, есть многие вещи из коробки, много библиотек. Из минусов — слишком молодой, местами достаточно нестабилен, node_modules-hell (слишком много зависимостей), очень много разных библиотек сомнительного качества. Нет строгой типизации и соответствющие проблемы с этим. Промисы добавляют тоже достаточно много проблем — читать бактрейсы выполнение их — то ещё удовольствие.
Огромный плюс — интеграция с react & angular, в частности server side rendering.

Typescript — решает проблему строгой типизации nodejs, но добавляет кучу других проблем. В частности то что часть библиотек используют её, а часть нет. Очень много вариантов синтаксиса, в частности, при изменении конфига — возможно придётся менять все импорты. Вхождение в язык далеко не простое.

PHP — тут я предвзят конечно же .
Из плюсов — стабильность, много библиотек, много серьёзных фреймворков в которых все есть из коробки (Laravel, Yii, Symphony, десятки менее известных), много информации, производительность адекватная для больишнства случаев, относительно легко начинать и найти дешёвых разработчиков. Из минусов — нет промисов, асинхронности, невозможно использовать в других сферах.

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

.NET Core уже отвязан от Windows и неплохо так дружит с контейнерами.

Насколько удобно разрабатывать под .NET чисто под маком и под линуксом? :)
И насколько это идеологически правильно?

Я не про запускать на сервере, а именно разрабатывать. Есть ли нативные средства разработки?

не пробовал, но предположу, что с использованием JetBrains Rider проблем быть не должно.

Насколько удобно разрабатывать под .NET чисто под маком и под линуксом?

Есть ли нативные средства разработки?

JetBrains Rider — вполне зрелая кроссплатформенная IDE для разработки под .NET.

Я не фанат C# но писал для него под маком в Visual Studio Code и тулзами от net core очень уверено и удобно. Т.е. к тулзам и окружению не было никаких претензий.

Что-то про .NET вы написали очень устаревшую информацию. У .NET Core уже третья версия вышла, и скоро выйдет пятая...


Ладно первую версию .NET Core можно было нестабильной считать, но сейчас-то...

я нигде не писал что .NET нестабилен.

Но вы писали что для .NET нужны серверы на винде.

тоже это не писал.
Я писал про то что .NET связан с Микрософтом и сопутствующей экосистемой.
Насколько в нём легко делать вещи linux way? Разрабатывать под маком и линуксом, использовать не виндовс мир решения и тп?
Т.е. можете ли вы работать под .NET вообще никогда нигде не используя виндовс, его компоненты и тп?
Насколько это будет удобно?

Ну нет, вы написали вот так:


Из минусов — не на любой хостинг поставишь. Т.е. требует отдельных серверов.

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

Ну так-то да — не на любой. Зато PHP вообще везде есть, даже, не к ночи будь помянут, на nic.ru

мы же про web-разработку? где в ней место windows, ее компонентам и т.п.? если подразумевался IIS, то .NET Core приложения прекрасно работают без него. соответственно, никаких выделенных серверов под них не требуется. про дружбу с контейнерами я уже писал выше.

Насколько в нём легко делать вещи linux way?

Что под этим подразумевается здесь?
Есть у меня пара знакомых, которые под .NET работают. Практически все про линукс только слышали, но в живую никогда не видели, не то что запускать на нем что-то или тем более разрабатывать. С одним плотно работали вместе, он параллельно на php писал, много с mysql и постгрес работал. Потом уволился и ушел на чистый .NET. Через несколько месяцев я ему статью с хабра по настройке разработки.НЕТ под линукс кидал, он покрутил пальцем у виска и сказал — никто в здравом уме такое в прод не потянет, людям работать надо, а не в игрушки играть…

Тут он, конечно, погорячился — но причина такого ответа вполне понятна. Если у него уже есть винда и настроенная среда разработки — ради чего вообще играться со сменой ОС и всех инструментов?


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

А у меня перед глазами несколько команд, которые пишут микросервисы на .NET Core и деплоят их в линуксовых контейнерах в прод. Это они в игрушки играют?
ps: или речь именно про настройку рабочего окружения для разработки? если да, то что мешает для разработки использовать windows? разработчики на PHP же не ставят себе тот линукс, что будет на хостинге.

Либо разговор был давно, либо ваш знакомый несколько отстал от жизни: крупный бизнес и правительство сейчас режут затраты и наоборот требуют поддержку Linux и PostgreSql и перед разработчиками на .Net встает выбор или доучиваться до .net core или переучиваться на другой язык. Так что это Linux для серьезного .Net разработчика сейчас это не «игрушки играть», а must have.
А у меня есть примеры, что разработчики разрабатывают на .NET/.NET Core на Windows, а деплоят это и на Linux, и на Windows. Т.е. используется мультитаргет, а запускается где удобнее. И волосы густые и шелковистые.
UFO just landed and posted this here
Если язык позволяет выполнить
def sign(x): return (x > 0) - (x < 0)
или
not []
, то о какой строгой типизации может идти речь?

Да, в Python меньше, чем в PHP, автоматических преобразований типов, но они есть. В остальном же контроль типов в Python отсутствует полностью: тип переданного в подпрограмму параметра можно проконтролировать только вручную; уровень даже не PHP, а JavaScript.
UFO just landed and posted this here
Если вы не поняли первый пример, то там происходит арифметическое вычитание логических значений — при котором False неявно преобразуется в 0, а True — в 1. И это демонстрирует типичную слабую типизацию.

Что касается not, то в семантику языка изначально зашита автоматическая трактовка значений большинства (как минимум) типов как boolean. И такая семантика логических операций — не перегрузка, а ещё один пример типичной слабой типизации а-ля JavaScript (и дополнительный источник ошибок в коде).

Что интересно, и то, и другое присутствует и широко используется в C++. Теперь у C++ слабая типизация?


Показателем силы типизации можно считать как часто строки неявно приводятся к числам или наоборот. Так вот, в Python этого, кажется, вообще не происходит. В отличии от Javascript и PHP.

Да, в C++ слабая типизация — доставшаяся в наследство от C.
Слабость типизации определяется не числами и строками, а:

  1. наличием в языке механизмов автоматического неявного преобразования типов
  2. отсутствием контроля типов параметров

Так что Python немного выигрывает у PHP в первом пункте и безнадёжно проигрывает во втором.

P.S. Языком с действительно сильной типизацией является Go.

Ну и откуда взялся второй критерий?

Например, отсюда: Liskov, B; Zilles, S (1974). «Programming with abstract data types». ACM SIGPLAN Notices. 9 (4): 50–59.

При желании легко найти множество источников.

Ну, видимо, в 1974м году терминология ещё не устоялась.

Только вот этот тезис никто так и опроверг. Так что он актуален и в 2020-м году.

В Си и плюсах можно легко прибавить int8 к int16 и получить невесть что в итоге. От этого столько багов бывает что ужас.


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

UFO just landed and posted this here
UFO just landed and posted this here
Это и есть «слабая типизация» в чистом виде.
UFO just landed and posted this here
строгость типизации — это про то, как легко вам как программисту гарантировать, что программа делает то, что надо, и не делает того, что не надо

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

UFO just landed and posted this here

Я в курсе, что в академически-чистых примерах это возможно. Экстраполяция на все случаи жизни портит все впечатление.

UFO just landed and posted this here

Я-то и не воспринимаю. Восторженные неофиты воспринимают.


Я вчера как раз встрял в длинную дискуссию, не пойми зачем, про рекурсию (сейчас поясню, при чем тут это). Ну вот люди смотрят в JS, а потом сразу в хаскель. И пишут фибоначчи на условном эликсире без TCO. Ты им говоришь: чувак, у тебя тут все взорвется на сравнительно больших числах. А они в ответ: нет, вот смотри: [ссылка на то, что TCO не делает код быстрее] и [ссылка на то, что в хаскеле TCO чаще вредит].


Ты сначала офигеваешь, а потом мямлишь невпопад: так хаскель ленив, там в 99% случаев правильный выбор — guarded recursion, а в JS как ни выделывайся — все взорвется, но даже в хаскеле TCO нужен если вычисления жадные, и вот foldl, в отличие от guarded foldr… И тут внезапно выясняется, что твой оппонент даже не понимает, что такое стек и почему оно взрывается.


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


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


Так и тут: мне не нужен помощник, чтобы не передать кортеж туда, где ждут список. Да, после плюсов — это все выглядит волшебной магией. Но не более. Нельзя сказать, что «легко вам как программисту гарантировать, что программа делает то, что надо, и не делает того, что не надо». Увеличивает этот показатель на проценты, пусть десятки процентов у вовсем новичка — да. Но «гарантировать» — это мимо. См. пример про TCO.

мне не нужен помощник, чтобы не передать кортеж туда, где ждут список.

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

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


Мой преемник прочитает документацию, а не станет наобум слать абы что, и смотреть на ошибки компилятора.

В качестве гарантированно актуальной и понятной IDE документации в том числе. Не основная, но важная фича.


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

понятной IDE документации

Ясно, свидетели секты IDE. IDE нужен только тем, кто не умеет писать код, простите уж, ничего личного, просто опыт.


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

Да-да. Я ровно так код и проектирую. Зато типы сразу превратят мою лапшу — в понятные хорошо изолированные три метода с одним параметром.


Ясно.

NodeJS часто видел как Middleware. Условно, у вас есть много микросервисов, но на фронте, нужно собрать определенную логику, и на NodeJS крафтиться middleware api.
Те кто раньше писали на RoR, кажется что начинают переходить на Phoenix/Elixir.
Java — для маленьких проектов не плох. Сейчас все равно почти все упаковывается в контейнеры. А у Java в этом плане все отлично. Тотже проект Quarkus. Тулинг просто отличный. IDE поддержка радует. Материалов к изучению много. Много книг и best practices. Да и сама Java пошла семи мильными шагами.
Опять же, мы тут всё обсуждаем с точки зрения насколько хорош язык с точки зрения синтаксиса.

А если обсудить насколько хорош язык с точки зрения бизнеса?

из плюсов:
  • бесплатный, не требует лицензий
  • не требует дорогих серверов — можно поставить на любой хостинг или виртуалку за 5 долларов в месяц.
  • легко найти программистов любого уровня — от начинающих (для простого сайта), до серьёзных которые напишут что угодно.
  • а можно вообще не искать программистов, попросить эникейщика поднять вордпресс и на нём сделать сайт. вордпресс поставить на любой хостинг за 20 долларов в год.
  • Если брать бизнес покрупнее, то всё равно язык позволяет выполнять 99% задач бизнеса без особых проблем. Есть крупные, стабильные фреймворки на которые можно легко найти разработчиков.
  • Обновление языка — достаточно легко, почти нет крупных несовместимых изменений (обновление пхп 5.х до 7.3 проходит почти без проблем)
  • язык стабилен, нет страха что через 5 лет потребуется всё переписывать с нуля, так как язык больше не поддерживается.
  • язык стабилен, нет страха что через 5 лет придётся искать новых программистов, или что зарплаты на программистов этого языка резко вырастут.


Что ещё бизнесу нужно?
Напомню что бизнес выбирает инструмент который решает его проблему наиболее выгодным для него путём. Сейчас в Европе и США тренд в том, чтобы не иметь свой сервер вообще, а использовать готовые решения с помесячной оплатой. Тот же wordpress.com — берёшь и используешь, даже не надо ставить на свой сервер. И таких сервисов всё больше и больше. И бизнесу уже не важно на чём там написано, главное чтобы сайт работал :)
обновление пхп 5.х до 7.3 проходит почти без проблем

О, это отдельная тема.
Знаю, кто до сих пор продакшн на 4ке держит, а 5.5-5.6 — пруд пруди.

PHP 4.0 EOL уже был в 2008 году, как бы уже пора… 12 лет почти прошло
а php 5.5+ легко мигрируется, так что больше вопрос что нужен взять и сделать.

Увы, решают когда пора не программисты, а бизнес.


А про миграцию — это у вас розовые очки.
Чего стоит одна только 5.5->5.6 миграция.

Мигрировал 5.4 -> 7.1, переписать пришлось реально очень мало.
UFO just landed and posted this here

Основная проблема 5.5 на 5.6 — это не добавить автозаменой букву i к функциям БД, а default_charset, который поменял буквально всё для неанглоязычных проектов.


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

сам код мигрировать 5.5 -> 5.6 или даже -> 7.3 не такая большая проблема, мигрировал не один проект уже.

Больше проблем было с миграции на с 5.0 (когда куски были написаны ещё на 4.х даже местами) на 5.3 и выше, из за того что изменились конструкторы (конструктор должен быть всегда вида __construct ) и тп.

Возможно проблемы с миграцией не своего кода, а зависимостей, вот там да, больше проблем может быть.
В частности раньше если не использовался composer, psr и тп и надо обновить не только пхп, но и фактически все зависимости, которые перешли с до namespace версии на использование namespace-ов

Программирую на Go и PHP и настолько не согласен с автором, что даже выбрал PHP в качестве целевого языка для нового REST API фреймворка :)

habr.com/ru/post/501722

PHP где-то на равных, а где-то обгоняет Go в тестах Techempower.

Ждем PHP8 с JIT чтобы увеличить отрыв :)
Только еще одного REST API фреймворка нам не хватало…
Да из коробки нет веб сокетов, но это не проблема — просто используем github.com/centrifugal/centrifugo (и для приватных чатов в том числе), как микросервис доставки сообщений на клиент.

PHP из коробки подходит для serverless стеков.

Асинхронность не так сильно развита в языке видимо потому что нет в ней прямой необходимости, все решается за счет асинхронных очередей rabbitmq/amqp/beanstalkd — к тому же это дает из коробки легкий способ добавлять сервера с воркерами. Большинство очередей, поддерживает ретраи из коробки (на go или nodejs, там где треды/корутины встроены в среду, вам придется это ручками писать) + персистентные очереди, если инстанс nodejs/go упадет, вся очередь что была внутри процесса — тоже испарится, а вдруг там была важная логика? Да на nodejs/go можно использовать очереди асинхронные, но тогда в чем отличие?

В последнее время все чаще начал слышать в круге PHP разработчиков о Event sourcing и CQRS (душа радуется), все это позволяет масштабироваться горизонтально, практически не испытывая проблем.

Утечек памяти тоже практически нет, для суппер производительных задач — теперь есть FFI, если что можно производительный код на C/C++/Rust подключить.

Из минусов PHP — он не компилируемый, был опыт написания на ocaml — там была сказка (в этом плане), если код скомпилировался, то ошибка только в логике, никаких опечаток 98% нет, в PHP для этого приходится обкладываться type hint'ами, но это не дает 100% надежности всеравно может прилететь…
UFO just landed and posted this here
UFO just landed and posted this here
Утечек памяти тоже практически нет, для суппер производительных задач — теперь есть FFI, если что можно производительный код на C/C++/Rust подключить.

Всегда несколько смешил подобный аргумент. Если этот подход даёт выигрыш в производительности, перекрывающий оверхед от FFI, то зачем, собственно, писать бизнес-логику на не нативном языке? Это я не только про PHP, но и про Python, и про Ruby, и про JS.

Потому что скорость разработки у отдельно взятой команды быстрее на последних ЯП. И объем оптимизируемой работы намного меньше 1%.
PHP как ни крути довольно хорош (есть спрос, есть предложения, есть комьюнити, есть развитие)
Когда в PHP появятся дженерики, PHP станет полноценной Java, ещё бы от $ избавиться.

Но вот если взглянуть на PHP с точки зрения простого потребителя, то все немного плохо.
У меня дома компьютер на windows и решил я как-то свой пет-проект начать и решил на знакомом мне стеке, на котором я работаю уже несколько лет. Думаю рассказывать про то что найти установочник php под win, то еще приключение, не стоит. К сожалению это не тривиальная задача, но это пол беды.
После установки привычно набираю composer init и composer мне радостно рассказывает про отсутствие ssh сертификатов. Серьезно? Отреагировал на это я довольно сдержанно переходом по ссылке nodejs.org, где есть надпись большими буквами «Download for Windows (x64)», где есть всего две больших зеленых кнопки, причем можно жать любую точно не прогадаешь, инсталятор сделает все сам, и директорию укажет и в PATH пропишется, жми только «Далее» и ставь галки. Да и ssh они как-то смогли решить вопрос. Вот и получается что мои домашние пет-проекты идут на ноде, потому что у PHP все не очень хорошо с инфраструктурой.

Повторюсь мне нужен был только PHP без всяких там (WAMP, MAMP, XAMP и т.д.) и эту проверку PHP не прошел.

После установки привычно набираю composer init и composer мне радостно рассказывает про отсутствие ssh сертификатов.

ssh сертификатов? Это не опечатка? Кажется, кому-то лень кнопку "y" в консоли нажать, а виноват почему-то PHP...

Думаю рассказывать про то что найти установочник php под win, то еще приключение, не стоит. К сожалению это не тривиальная задача

Расскажите. В чем там проблема?

Проблема видимо в том, что человеку лень PATH и сертификат в ручную прописать.
Увы и ах, как ни ускоряй PHP, но под каждый HTTP-запрос выделяется отдельный процесс — это поведение прибито гвоздями.

Если используется подготовленный пул процессов, да еще и с предзагруженными библиотеками, то гвозди превращаются в хорошую архитектуру. В AWS Lambda так и сделано, к примеру. Firebase Functions тоже про «родился-умер». Один процесс, который отвечает за несвязанные друг с другом запросы — вот это прибито гвоздями к недостаткам старых технологий, а сейчас же успешно решается и контейнерами, которые разделяют общее пространство и в целмо микросервисами, когда общий environment лежит рядом, доступный по сокетам, сети или диску. По той же причине и вебсокеты мир не захватили, stateless рулит и REST API, многие раньше даже по вебсокету эмулировали HTTP-протокол ради этого. А теперь, с пришествием HTTP2 это и вовсе не нужно.

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


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

Чаты, уведомления и прочее, что делают на вебсокетах — это часто Pub/Sub и последующий обмен сообщениями. Там не всегда нужен демон на NodeJS/Swoole/Ratchet/ReactPHP и самописный код с использованием всего этого, достаточно поставить MQTT брокер, например EMQX, у которого из коробки идет масштабирование, админка, интерфейс к MySQL/Postgresql/Redis и еще куче всего для аутентификации и управления доступом каждого пользователя, в т.ч. отключаемый анонимный доступ. Достаточно однажды вписать из PHP в базу креденшлы для пользователя, откуда их возьмет брокер и отдать их в JS при инициализации страницы в его браузере. Отправка данных по инициативе сервера — из PHP в EMQX напрямую, отправка данных по инициативе браузера в PHP — как обычно через HTTP методы. Такое решение еще удобно тем, что при необходимости под MQTT over websockets можно использовать специальные ноды популярных облачных провайдеров без каких-либо переделок в архитектуре.

Спасибо! Мне как начинающему веб- разработчику очень интересно!

красавец, с языка снял
думаю я еще седым дедом буду смеяться над теми кто его еще и тогда будет хоронить)))

Я уже поседел за время карантина :(

«Symfony®. Пожалуй, лучший фреймворк для админок.»

На мой взгляд, няшные phpdoc-аннотации лучше «бездушных уголков», т. к. заметнее на общем фоне кода. Хотя, IDE подсветит всё что угодно…
UFO just landed and posted this here
Ну как-бы смотреть надо, что удаляешь.

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

Вообще удаление комментария — это вырожденный кейс, обычно комментарии добавляют.

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

Ну и вот сейчас на новом проекте пачками удаляю обычные phpdoc комментарии, когда они дублируют информацию, выраженную языковыми средствами, тайпхинтами в сигнатурах функций, прежде всего.

Когда-то начинал с сабжа. Слава богу через год работы подвернулась вакансия с питоном. Вроде ровесники, но питон настолько продуманнее и логичнее, что можно только удивляться. Сейчас правда на скалу и раст перешел, но все равно рекомендую с питона начинать разработку. А вот сабж как раз для легаси и остался, полностью поддерживаю автора
Все говорят что бизнес решает какой язык ему нужен.
А вот вам пример о том как бизнес решает какой язык ему нужен.
Был однажды проект, полностью написанный на язык X и нормально поддерживался, но пришел новый проект менеджен и убеждает директора, что нужно переписать проект с «X» на PHP, аргументировав это тем, что в РФ вышел закон о запрете использования иностранных технологий.
Проект переписали на PHP.
В данной ситуации не известны все факты. То что менеджер привёл глупый аргумент — вовсе не означает, что решение было принято только из-за этого аргумента. Ровно как глупый аргумент не означает, что не было других причин для смены языка — возможно менеджер счёл это лучшим способом убедить директора, а решалась вовсе другая задача. И самое главное — неизвестно как данный переход сказался на компании, переписывание софта время от времени может позволять закрывать какие-то насущные вопросы.
В том случае, причиной был именно этот глупый аргумент, были даже споры. Причем огранизация была ИП'шная.
А, закон, я так понимаю, касается больше гос.учреждений.

То есть этот менеджер не хотел переходить, но какое-то "слышал звон, да не знаю где он" его зставило не просто перейти, но и своё начальство убедить одобрить переход?

Если собрались в очередной раз хоронить PHP, то делайте это не искажая факты.


Кто поручится, что проект Swoole проживет еще лет 5?

Я бы на это поставил. На нём половина Китая работает. Одни Tencent и Alibaba чего стоят.


Разработчик под nodejs точно знает, что такое async/await и Promise. В деталях.

Ох, если бы...


Короче, писать микросервисы на PHP невыгодно.

Смотря как считать выгоду и какой микро-сервис. Если в микросервисе есть бизнес-логика, то писать её приятней на PHP, чем, например, на golang. Если один разработчик того же уровня на golang обходится вам как три на PHP, то тоже сомнительная выгода. Если у вас остальной код на PHP, тоже может быть не очень. Это не означает, конечно, что тот же golang плох для молотилок данных. Очень и очень хорош.


Ниша по сути — это админки со сложной бизнес-логикой (т.е. на Golang такое писать нецелесообразно) и не особо нагруженные сайты.

Да, такие не особо нагруженные как, например, Авито или Badoo.

Да, такие не особо нагруженные как, например, Авито или Badoo.

А ещё Facebook и VK, которые, правда, не дождались пхп 7 и написали свои велосипеды.

Как минимум с HHVM семёрка при этом по скорости сравнялась...

Sign up to leave a comment.

Articles

Change theme settings