Связь между PHP и Python


Я пытаюсь построить веб-интерфейс для некоторых скриптов python. Дело в том, что я должен использовать PHP (а не CGI), и некоторые скрипты, которые я выполняю, занимают довольно много времени: 5-10 минут. Возможно ли для PHP взаимодействовать со скриптами и отображать какой-то статус прогресса? Это должно позволить пользователю использовать веб-страницу во время выполнения задачи и отображать некоторое состояние в то же время или просто сообщение, когда это сделано.

В данный момент использую exec() и по завершении обрабатываю выход. Сервер работает на компьютере под управлением Windows, поэтому pcntl_fork работать не будет.

ПОЗЖЕ РЕДАКТИРОВАТЬ : Использование другого php-скрипта для подачи информации на главную страницу с помощью ajax, похоже, не работает, потому что сервер убивает его (он достигает максимального времени выполнения, и я действительно не хочу увеличивать его без необходимости)

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

Спасибо

4 9

4 ответа:

Вы хотите межпроцессную коммуникацию. Сокеты-это первое, что приходит на ум; вам нужно настроить сокет на прослушивание для соединения (на той же машине) в PHP и настроить сокет на подключение к прослушивающему сокету в Python и отправить его статус.

Посмотрите на этот обзор программирования сокетов из документации Python и документации модуля Python socket (особенно примеры на конец) . Я уверен, что PHP имеет аналогичные ресурсы.

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

Я думаю, что вам придется использовать мета-обновление и, возможно, python запишет статус в файл, а затем прочтет php из него.

Вы также можете использовать AJAX, чтобы сделать его более динамичным.

Также, вероятно, не следует использовать exec ()...это открывает целый мир уязвимостей.

К сожалению, мой друг, я считаю, что вам нужно будет использовать сокеты, как вы просили. : (У меня мало опыта работы с ними, но Этот учебник Python по сокетам/сетевому программированию может помочь вам получить необходимое взаимодействие с сокетами Python. (Связи бо Мартинеса тоже кажутся многообещающими.)

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

Продолжая об этом, я думаю, что ваш скрипт Python, вероятно, будем бегать по кругу. Следовательно, я бы поместил проверку "Проверка запроса состояния" в начало части этого цикла. Он отвечал бы на один статус, в то время как более поздний цикл внутри этого сценария отвечал бы с увеличенным статусом.. и т.д.

Удачи!

Edit: я думаю, что рекомендация по написанию файлов от Томаса Шульца, вероятно, самая простая в реализации. Единственным недостатком является ожидание открытия файла - вам нужно будет убедиться, что ваши скрипты PHP и Python не вешайте и не возвращайте неудачу без повторной попытки.

Вы можете использовать службу очередей, такую как Gearman, с клиентом на PHP и работником на Python или наоборот.

Кто-то создал здесь пример настройки.

Https://github.com/dbaltas/gearman-python-worker