Олег Марков
Интеграция PHP и Python
Введение
Иногда веб-разработка требует объединения возможностей нескольких языков. PHP остаётся популярным для веб-приложений, Python — для анализа данных и машинного обучения. Интеграция этих технологий позволяет использовать преимущества каждого языка в одном проекте.
В этой статье мы рассмотрим основные подходы к интеграции PHP и Python, обмен данными и примеры использования.
Если вы хотите детальнее погрузиться в Python и освоить практическую работу с проектами, приходите на курс Основы Python. На курсе 209 уроков и 34 упражнения, AI-тренажёры для практики с кодом, решение задач с ревью наставника и еженедельные встречи с менторами.
Вариант 1: Вызов Python из PHP через CLI
PHP может запускать скрипты Python через командную строку:
<?php
$output = shell_exec("python3 script.py arg1 arg2");
echo $output;
?>script.pyможет принимать аргументы черезsys.argv.- Результат возвращается в PHP через стандартный вывод.
Такой подход удобен для разовых вызовов скриптов, но требует управления правами и обработкой ошибок.
Вариант 2: Взаимодействие через REST API
Создаём микросервис на Python с использованием Flask:
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route("/process", methods=["POST"])
def process_data():
data = request.json
result = data["value"] * 2
return jsonify({"result": result})
if __name__ == "__main__":
app.run(port=5000)PHP отправляет данные через HTTP-запрос:
<?php
$data = json_encode(["value" => 10]);
$ch = curl_init("http://localhost:5000/process");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
echo $result["result"];
?>Этот метод удобен для постоянного взаимодействия между сервисами.
Вариант 3: Работа через очереди сообщений
Для асинхронной обработки данных используют RabbitMQ или Redis:
- PHP помещает задачу в очередь.
- Python-скрипт подписан на очередь и обрабатывает данные.
- Результат может возвращаться через другую очередь или сохраняться в базе данных.
Это повышает надёжность и масштабируемость интеграции.
Вариант 4: Использование библиотек
Существуют специализированные библиотеки, например python-bridge или PeachPie:
- python-bridge позволяет вызывать Python из PHP через интерфейс.
- PeachPie — компилятор PHP для .NET, может работать совместно с Python через .NET-интерфейсы.
Подходы требуют настройки окружения, но упрощают взаимодействие внутри одного приложения.
Практические советы
- Обязательно обрабатывайте ошибки и исключения при вызове скриптов.
- Для микросервисов используйте REST или очередь сообщений.
- Не храните чувствительные данные в стандартном выводе, используйте шифрование или безопасное API.
Заключение
Интеграция PHP и Python позволяет сочетать возможности веб-разработки и анализа данных в одном проекте. Важно выбрать подходящий способ взаимодействия: командная строка, REST API, очередь сообщений или специализированные библиотеки.
Для комплексного изучения Python и практики с реальными задачами рекомендуем курс Основы Python. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в Python прямо сегодня.
Частые ошибки
- Попытка синхронного вызова тяжёлых скриптов через CLI.
- Игнорирование обработки ошибок API или очередей сообщений.
- Несоответствие версий Python на сервере и локально.
Часто задаваемые вопросы
Можно ли вызывать Python скрипты без прав на сервер? Нет, необходимо, чтобы пользователь PHP имел доступ к Python.
REST API лучше CLI для больших проектов? Да, API обеспечивает масштабируемость и управляемость.
Можно ли использовать Python-библиотеки напрямую в PHP? Только через мосты или компиляторы, например
python-bridgeилиPeachPie.
Постройте личный план изучения Python до уровня Middle — бесплатно!
Python — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Python
Лучшие курсы по теме

Основы Python
Антон Ларичев
Nest.js с нуля
Антон Ларичев