Связь php и python
Если вы решили перейти с PHP на Python, то к чему следует подготовиться
Думали ли вы когда-нибудь о том, что однажды слишком быстро втянулись в веб-программирование на PHP? И вот уже прошло много лет, у вас хороший опыт, и вы не думаете ни о каких других способах „делать“ веб, кроме как на PHP. Может быть, у вас возникают сомнения в правильности выбора, однако непонятно, как найти способ быстро его проверить. А хочется примеров, хочется знать, как изменятся конкретные аспекты деятельности.
Сегодня я попробую ответить на вопрос: «А что если вместо PHP писать на Python?».
Сам я долгое время задавался этим вопросом. Я писал на PHP 11 лет и даже являюсь сертифицированным специалистом. Я научился его «готовить» так, чтобы он работал в точности, как мне надо. И когда я в очередной раз читал на Хабре перевод статьи о том, как всё в PHP плохо, я просто недоумевал. Однако подвернулся случай пересесть на Ruby, а потом и на Python. На последнем я и остановился, и теперь попробую рассказать вам PHP-шникам, как нам питонистам живётся.
Формат статьи
Наилучший способ познавать новый язык — сравнение с регулярно-используемым, если новый язык не принципиально отличается от текущего. Неплохая попытка сделана на сайте Ruby, но, к сожалению, там мало примеров.
Также я должен отметить, что я сравню не все аспекты деятельности, а только те, которые будут бросаться в глаза в первые недели работы с новым языком.
Подготовка консолей
Я попытался сделать эту статью интерактивной. Поэтому при прочтении настоятельно рекомендую набирать примеры из неё в консолях. Вам понадобится консоль PHP, а лучше сразу psysh:
И консоль Python. Лучше поставить более удобные варианты bpython или ipython, чем встроенная в язык по умолчанию, так как в них уже есть автодополнение. Но можно и так:
И, чтобы применить изменение прямо сейчас без перезапуска консоли, выполнить:
Сам язык
Основные особенности
Правда, обычно у вас в коде типы перемешиваться не будут и данный эффект не будет мозолить вам глаза. В принципе, когда я писал на PHP, ситуаций когда нестрогая типизация реально помогала, было 1-2 на проект, а так обычно взаимодействовали переменные одного типа.
Философия строгой типизации накладывает свой отпечаток и на обработку ошибок. Например, если функция int должна возвращать целый тип, то она не может вернуть None на строку, из которой нельзя однозначно извлечь этот тип. Поэтому генерируется исключение. Это грозит тем, что всё, что прислал пользователь, надо преобразовывать в нужный тип, иначе вы рано или поздно схватите эксепшн на проде.
Это касается не только стандартных функций, но и некоторых методов для списков, строк, части функций во вспомогательных библиотеках. Обычно питон-разработчик примерно на память помнит, где какое исключение может упасть, и учитывает это. Если не помнит, иногда лазит в код библиотеки, чтобы подсмотреть. Но конечно же иногда бывает, что не все варианты учитываются, и порой пользователи ловят эксепшены на проде. Но поскольку это нечастое явление, и обычно веб-фреймворк присылает их админу на почту автоматически, всё довольно быстро чинится.
Чтобы использовать значения разных типов в одном выражении, вам нужно их преобразовать, для этого есть функции: str, int, bool, long. Ну а для форматирования есть более элегантные конструкции.
Строки
Форматирование
Теперь вам нужно просто переучиться:
Вариантов вроде больше и есть хороший вариант для локализаторов.
Методы строки
Самое главное, что есть в Python и чего не хватает в PHP, — это встроенные методы. Давайте сравним:
А как часто вы делали что-то типа такого?
Поддержка юникода
Ну и наконец юникод. В Python 2 все строки по умолчанию не юникод (В Python 3 — по умолчанию юникод). Но стоит вам подставить магическую букву u вначале строки, как она автоматически становится юникодной. И далее все встроенные (и не встроенные) строковые методы Python будут работать хорошо.
![]()
Подобную нативную поддержку юникода хотели завести в PHP 6, но не осилили.
В PHP, кстати, вы можете воспользоваться MBString function overloading и получить аналогичный эффект, но он отмечен, как устаревший. И вы лишаетесь работы с помощью перегруженных функций с бинарными строками, но вы по прежнему можете работать со строкой как с массивом.
«Сырые» строки
Многие из вас знают чем одиночные кавычки отличаются от двойных:
Что-то подобное есть и в Python. Если подставлять перед строкой литерал r, то это поведение почти аналогично одиночным кавычкам в PHP.
Массивы
Теперь разберёмся с массивом. В PHP вы могли запихнуть в качестве ключей целые числа или строки:
![]()
Несмотря на то что array переводится как массив, в PHP array не обычный массив (то есть список), а ассоциативный (то есть, словарь). Обычный массив в PHP тоже есть, это SPLFixedArray. Он ест меньше памяти, потенциально быстрее, но ввиду сложности объявления и сложности расширения практически не используется.
В Python для массива мы используем 3-4 типа данных:
Импорты
Ещё одна интересная вещь — импорты. Своеобразный альтернативный взгляд на неймспейсы с обязательным использованием.
В PHP ты написал require_once и дальше тебе это доступно, пока жива PHP-шная сессия выполнения. Обычно при использовании CMS люди запихивают всё в классы, а классы располагают в специальных местах, и пишут свою маленькую функцию, которая знает эти места и регистрируют её через spl_autoload_register в самом начале файла.
В питоне каждый файл — своя область видимости. И в нём будет доступно только то, что вы в него подгрузите. По умолчанию доступна только стандартная библиотека питона (около 80 функций). Но давайте лучше на примере:
Допустим, вы сделали файл tools/logic.py
И теперь хотите его использовать в файле main.py. В этой ситуации вам необходимо импортировать или весь файл или нужные вам части в файл, где вы работаете.
И так абсолютно везде. Почти все файлы на питоне начинаются с импортов в текущий файл вспомогательных питонячих объектов: ваших и встроенных библиотек. Это всё равно как если бы функции в PHP вида mysqli_*, pdo_*, memcached_*, а также весь ваш код находились только в неймспейсах, и вам приходилось бы каждый раз их импортировать в каждом файле. Какие преимущества у такого подхода?
Удобно ли каждый раз прописывать импорты? Это зависит от вашего склада ума. Если вам нравится больший контроль над кодом, то вы предпочтёте прописывание импортов, чем их отсутствие. В некоторых командах существует даже своя система правил, описывающих в каком порядке можно подключать внешний код для минимизации циклических импортов до минимума. Если в вашей команде нет таких правил и вы не хотите особо заморачиваться, то можно просто положиться на IDE, которая автоматически проставит импорты для всего, что вы используете. Ну и в довесок: импорты не уникальная особенность питона, в Java и C# тоже есть импорты, вроде никто не жаловался.
Параметры в функции *args, **kwargs
Синтаксис с параметрами по умолчанию в целом похож:
Но порой вам нужна функция под неизвестное количество аргументов. Это может быть: проксирующая функция, логирующая функция или функция для получения сигналов. В PHP, начиная с 5.6, вам доступен следующий синтаксис:
В Python аналогично можно ловить в массив неименнованные и в словарь именованные аргументы:
Соответственно *args — list неименованных аргументов, **kwargs — dict именованных аргументов.
Классы
Давайте посмотрим на следующий код:
Какие основные отличия от PHP мы можем выделить:
Стиль кодирования
Не знаю как у вас, а я писал на несколько долгоиграющих проектов и всегда отмечал, что стиль кодирования у разных членов команды разный. Нередко по коду можно понять, кто это писал. И всегда хотелось, чтобы был какой-то стандарт оформления кода для единообразия. И всегда были большие споры при согласовании этого документа внутри команды. Для питона это тоже справедливо, но в меньшей степени, ибо есть рекомендации от людей, в квалификации которых мало кто может сомневаться и советов от которых на первое время хватит:
Версии питона
В PHP новые версии всегда обратно совместимы со старыми, хотя иногда требуется доработка напильником. В питоне есть Python 2 и Python 3. Они не совместимы в лоб, хотя в последнее время разработчики питона дело упростили сильно. Можно сразу писать под две версии, но если используются новые фишки Python 3 типа: встроенной асинхронной поддержки или особенностей нового юникода, то скорее всего ничего не получится. По этой причине вся «тяжёлая промышленность», которая имеет кодовую базу в несколько лет, до сих пор сидит на Python 2.
Разумных причин начинать новый проект на Python 2 на момент 2019 года нет.
Что на что меняется
Вместо выводов
Как понять надо ли оно вам?
Мой способ освоить Python
Если вы разработчик с опытом, то на всё не сильно напрягаясь уйдёт максимум две-три недели.
Обновлено: Мелкие исправления и улучшения (благодаря: dginz, defuz, dsx, Stepanow, Studebecker, svartalf).
Обновлено: Нашлись абстрактные классы (благодаря: yktoo). Так же со временем вам придётся познакомиться с удивительным миром декораторов.
Обновлено в 2018: Особенности распространенности Python 2 и 3.
Обновлено в 2019: Особенности Python 3.8 и англоязычный перевод.
Web-разработка на Python глазами PHP-программиста
Введение
В статье хотелось бы поднять вопросы отличия использования Python для web-разработки по сравнению с оной на PHP. Надеюсь, статья не приведет к холиварам, так как она вовсе не о том, какой язык лучше или хуже, а исключительно о технических особенностях Python.
Немного о самих языках
PHP — веб-ориентированный язык, создан, чтобы умирать (в хорошем смысле слова). С низкоуровневой точки зрения приложение на PHP представляет собой скорее набор отдельных скриптов возможно с единой семантической точкой входа.
Python — универсальный язык программирования, применимый в том числе и в вебе. С технической точки зрения web-приложение на Python — полноценное приложение, загруженное в память, обладающее своим внутренним состоянием, сохраняемым от запроса к запросу.
Исходя из вышеописанных особенностей вытекают и различия в обработке ошибок в web-приложениях. В PHP существует целый зоопарк типов ошибок (errors, exceptions), далеко не каждую из которых можно перехватить, хотя это (невозможность перехвата) и не имеет большого значения, так как приложение живет ровно столько, сколько обрабатывается один запрос. Неперехваченная ошибка просто приводит к досрочному выходу из обработчика, и удалению приложения из памяти. Новый запрос будет обрабатываться новым «чистым» приложением. В Python же приложение постоянно находится в памяти, обрабатывая множество запросов без «перезагрузки». Таким образом поддерживать правильное предсказуемое состояние приложения крайне важно. Все ошибки используют стандартный механизм исключений и могут быть перехвачены (разве что за исключением SyntaxError). Неперехваченная ошибка приведет к завершению приложения, которое понадобится перезапускать извне.
Существует множество способов «приготовить» PHP и Python для веба. Далее я остановлюсь на двух наиболее мне знакомых (и кажется наиболее популярных) — PHP + FastCGI (php-fpm) и Python + WSGI (uWSGI). Конечно же, перед обоими этими связками предполагается наличие фронтенд-сервера (например, Nginx).
Поддержка многопоточности Python
Запуск сервера приложений (например, uWSGI) приводит к загрузке интерпретатора Python в память, а затем загрузке самого web-приложения. Обычно bootstrap-модуль приложения импортирует необходимые ему модули, производит вызовы инициализации и в итоге экспортирует подготовленный callable объект, соответствующий спецификации WSGI. Как известно, при первом импорте Python-модулей, код внутри них исполняется, в том числе создаются и инициализируются значениями переменные. Между двумя последовательными HTTP-запросами состояние интерпретатора не сбрасывается, следовательно сохраняются значения всех переменных уровня модуля.
Напишем простейшее WSGI-приложение, которое наглядно продемонстрирует вышеописанное на примере:
Здесь n является переменной модуля и она будет создана со значением 0 при загрузке приложения в память следующей командой:
Само приложение просто выводит на страницу значение переменной n. Для заядлых PHP программистов оно выглядит бессмысленным, так как «должно» каждый раз выводить на страницу строку «000001».
В результате мы получим строку «000501», что подтверждает наше утверждение, о том, что приложение находится загруженным в память uwsgi и сохраняет свое состояние между запросами.
Если запустить uWSGI с параметром —processes 2 и провести тот же тест, то несколько последовательных вызовов curl покажут, что мы имеем уже 2 различные возрастающие последовательности. Так как ab посылает 500 запросов, примерно половина из них приходится на один процесс uWSGI, а остальные — на второй. Ожидаемые значения, возращаемые curl будут примерно «000220» и «000280». Интерпретатор Python, судя по всему, один на процесс, и мы имеем 2 независимых окружения и реальную параллельную обработку запросов (в случае многоядерного процессора).
Python поддерживает потоки, как часть языка. Классическая реализация (CPython) использует нативные потоки OS, но есть GIL — в один момент времени выполняется только один поток. При этом все равно возможны проблемы race condition, так как даже n += 1 не является атомарной операцией.
«Дизассемблируем» наше WSGI-приложение:
Видно, что инкремент в нашей программе занимает 4 операции. Прерывание GIL может наступить на любой из них.
Увеличение количества потоков при отсуствии ожидания IO в коде обработчиков HTTP-запросов не приводит к ускорению обработки (а скорее даже ее замедляет, так как потоки могут «толкаться», переключая контексты). Реальной параллельности потоки в следствие ограничеия GIL не создают, хоть и являются не green thread’ами, а настоящими потоками OS.
Проведем еще один тест. Запустим uwsgi с 1 процессом, но 10 потоками-обработчиками в нем:
и выполним с помощью ab 5000 запросов к приложению.
Последующие запросы curl 127.0.0.1:8080 покажут, что мы имеем только одну возрастающую последовательность, значение которой
Что выбрать: PHP или Python?
Было бы некорректно выбирать из двух языков лучший: слишком много параметров для сравнения. Поэтому мы разобрались, под какие задачи и кому больше подходит PHP и Python, какие платформы они поддерживают,какими преимуществами и недостатками обладают и с чего лучше начинать свой путь в IT.
Что такое PHP?
PHP — от английского Hypertext Preprocessor — «препроцессор гипертекста». Это скриптовый язык, на нем создают сайты и веб-приложения. Язык интегрируется с большинством веб-серверов и работает со всеми распространенными операционными системами. У PHP понятный синтаксис и низкий порог входа для изучения.
Плюсы
Минусы
Ваш рывок в сферу программирования. Обучение с нуля и помощь в трудоустройстве.
Дополнительная скидка 5% по коду BLOG.
Что такое Python?
Python — это объектно-ориентированный язык общего назначения, его применяют в разных областях. Например, на нем пишут приложения, программируют системы машинного обучения, анализируют данные. Разработчикам он нравится за встроенные структуры данных, удобные функции кодинга и динамические ссылки. Это помогает писать код на Python быстро и снижает вероятность ошибок.
Плюсы
Минусы
Fullstack-разработчик на Python
Станьте востребованным специалистом: научитесь программировать на Python и начните карьеру сразу после обучения.
Дополнительная скидка 5% по коду BLOG.
Как выбрать язык?
Выбирая язык, отталкивайтесь от своей цели. Изучая PHP, вы научитесь создавать веб-приложения.
С помощью PHP можно:
Заказчикам нужно разрабатывать сайты с нуля и поддерживать готовые сложные веб-приложения, поэтому такие разработчики будут востребованы в компаниях разного уровня. Если освоить еще и Javascript, то можно стать fullstack веб-разработчиком, который может самостоятельно реализовать проект: спроектировать архитектуру, разработать frontend- (то, как сайт видят пользователи) и backend-части (все, что помогает сайту работать), привязать проект к базе данных, обновлять его и заниматься системным администрированием. Подробно о профессии fullstack-разработчика мы рассказывали в нашем гиде.
Python — по-настоящему универсальный язык, его применяют для самых разных задач:
Если вы хотите стать универсальным специалистом, выбирайте Python. На его базе вы сможете перейти в другую область и заниматься, например, искусственным интеллектом или Data Science. Подробной разбор кому и для чего нужен Python, читайте здесь. А тут вы найдете обзор самых популярных языков программирования.
Python против PHP: кто победит в окончательной битве?
Благодаря большому выбору библиотек Python можно использовать для разработки научных приложений и приложений AI / ML. PHP с открытым исходным кодом, предлагает исключительно простой и чувствительный к регистру язык программирования. За это PHP стал любимым языком программирования среди веб-разработчиков.
Эта статья посвящена противостоянию Python с PHP. Оба языка сильно отличаются друг от друга с точки зрения синтаксиса, читаемости кода, скорости, производительности, надежности и многого другого.
Python появился на рынке намного раньше, чем PHP. Тем не менее, PHP стал более популярным языком по сравнению с Python.
Между программистами Python и PHP началась полномасштабная холодная война, и в ближайшее время война будет продолжаться. Будет интересно посмотреть, кто выиграет финальную гонку между Python и PHP.
1. Синтаксис/Читаемость кода
Основное различие между PHP и Python заключается в структурировании их синтаксиса. Синтаксис PHP очень похож на C. При написании на PHP, программисты должны обеспечить правильное использование фигурных скобок, дополнительных символов и операторов.
Одним из больших преимуществ работы PHP является то, что вы можете пренебрегать пробелами во время компиляции, что повышает удобство использования и помогает структурировать код в логические компоненты.
Синтаксис PHP
Синтаксис Python
Синтаксис в Python основан на разделении кодов пробелами и табуляцией, что значительно ускоряет процесс кодирования. Python известен своей простотой команд и, следовательно, язык легче изучать.
Из приведенных выше примеров кода я можно делать вывод, что код Python намного более читабелен и проще по сравнению с PHP.
2. Логика разработка
Если вы решите работать с Python, тогда ваш разработчик Python создаст отдельный функциональный модуль и затем зарегистрирует соединения между ними на основе «if-else». В результате получается алгоритм, который выполняет тот или иной программный блок на основе действий пользователя.
Из приведенных выше указателей вы, безусловно, можете использовать Python для разработки программного обеспечения и услуг. Наймите разработчиков Python в соответствии с целями вашего проекта. Это важно, потому что различные ситуации требуют экспертизы, тестирования и помощи в достижении конечной цели.
3. Отладка
В Python есть доступный и эффективный инструмент отладки, который делает поиск ошибок намного проще и быстрее, а значит, экономит много времени как для разработчиков, так и для организации. Отладчик на Python (PDB) хорошо документирован и прост в использовании.
PHP предлагает пакет отладчика под названием XDebug, который является отличным инструментом для отладки. Python выигрывает битву отладки, поскольку требует меньше инструментов отладки, чем PHP.
4. Популярность рынке
Популярность рынка была одним из самых сильных сигналов в оценке компетентности языка программирования.
Ниже приведен график в соответствии с опросом, проведенным w3techs.com 29 мая 2019 года, на основе трафика и популярности, который ясно показывает, кто победит в гонке популярности между Python и Java.
На этом рисунке вы можете легко сделать вывод, что PHP стал более популярным, если учесть популярность, основанную на веб-разработке. Количество веб-сайтов, разработанных на PHP и Python, значительно возросло.
5. Поддержка сообщества
Python и PHP пользуются отличной поддержкой сообщества. PHP уже там по сей день, но Python не отстает от популярных приложений, таких как Youtube, Reddit и т.д., которые сейчас разрабатываются на Python.
PHP был синонимом популярности с крупнейшим в мире веб-сайтом социальных сетей Facebook, который уже давно работает на PHP.
6. Скорость
Скорость была наиболее важным фактором в приложениях, критичных к производительности. Версия PHP 5.x была медленной, занимая чертовски много времени. Версия PHP 7.x чрезвычайно быстрая, почти в 3 раза быстрее, чем обычная программа на Python. Скорость программы будет варьироваться от приложений к приложениям.
Например: если есть банковское приложение, которое обслуживает 3 миллиона пользователей в день. Таким образом, скорость приложения является важным фактором.
С другой стороны, для более простых приложений отставание в 10-30 миллисекунд не так критично, как для банковских приложений.
Следовательно, в плане скорости побеждает PHP.
7. Ценообразование
Многие инструменты и веб-фреймворки не бесплатны. Это существенно влияет на выбор организации с низким бюджетом. Компании предпочитают использовать бесплатные инструменты и ресурсы вместо платных версий. Тем не менее, сегмент финтеха предпочитает использовать платную версию, поскольку они имеют дело с наиболее важной информацией о клиентах.
Если мы говорим о PHP и Python, то оба обладают бесплатной версией инструментов и ресурсов, которые могут быть использованы организацией без какой-либо оплаты.
8. Универсальность
В настоящее время веб-приложения не ограничиваются простыми веб-порталами или веб-сайтами, так-как ИИ и машинное обучение также становятся частью веб-сайтов, предоставляющих расширенные услуги клиентам.
Такие алгоритмы не только помогут вам более точно идентифицировать клиентов, но и помогут проанализировать, в какую конкретную область бизнеса вы должны направить свои инвестиции.
Python имеет больше библиотек по сравнению с PHP. Популярные и мощные библиотеки используются в таких областях, как НЛП, обработка изображений и т.д.
9. Продуманный дизайн
Заключение
С Python и PHP были определенные плюсы и минусы, связанные с языком. Тем не менее, можно четко отметить, что Python выигрывает PHP во многих аспектах, будь то отладка, документирование или простота использования.
Мы надеемся, что этот пост поможет вам в базовом понимании различия между Python и PHP.