Может ли PHP и С++ передавать данные между собой?
У меня много математических вычислений в моем PHP script, что может быть довольно медленным время от времени. Мне интересно, можно ли передавать данные с PHP на С++, выполнять вычисления на С++, а затем передавать результаты на PHP?
P.S. Я не очень хорошо разбираюсь в С++.
Ответы
Ответ 1
Вы можете написать PHP-модуль, который фрагмент кода C, который предоставляет новый встроенный для интерпретатора PHP. Это будет намного быстрее, чем разворачивание второго процесса через exec()
.
Однако такие модули трудно писать, инструменты сборки неуклюжи, а передача параметров назад и вперед между PHP и C требует большой осторожности при распределении памяти и подсчете ссылок. Кроме того, C не является С++, поэтому вам потребуется слой extern C
вокруг вашего кода на С++ для экспорта функций на PHP. (Или запишите свое расширение в C вместо С++.)
Таким образом, если ваше требование скорости не является действительно серьезным, будет проще использовать exec
или proc_open
и передавать данные вперед и назад с помощью указателей файлов. Это будет похоже на запись программы на С++, которая читает со стандартного ввода и испускает стандартный вывод.
Ответ 2
Если вы выполняете вычисления не так часто, как я бы сказал, как говорит Олекси; Используйте команду PHP exec() для запуска внешнего приложения на С++, которое будет выполнять эту работу.
Но если вы интенсивно выполняете вычисления, например несколько раз в секунду, то время выполнения приложения С++ может привести к штрафам;
Затем вы можете посмотреть, есть ли С++-сервис/приложение, которое прослушивает сокет или файловый канал, с/на который вы передаете данные между PHP и С++. Это сохранит время запуска EXE.
Ответ 3
Вы всегда можете скомпилировать свой код с помощью Facebooks HipHop.
Он преобразует ваш php в С++ и затем скомпилирует его для машинного кода с помощью g++.
https://github.com/facebook/hiphop-php/wiki/
https://github.com/facebook/hiphop-php/wiki/Running-HipHop
Я никогда не использовал его в реальном проекте, но я слышал отличные вещи.
Ответ 4
Вы можете сделать это, и это общее решение для повышения производительности критически важного кода. Вы можете создать приложение командной строки на С++ и выполнить его с помощью команды PHP exec
(или что-то подобное).
Что касается передачи данных, у вас есть несколько вариантов. Если у вас много данных, вы можете поместить их в файл с помощью PHP и получить доступ к этому файлу с С++. Если это меньше данных, вы можете просто передать аргументы командной строки при запуске программы на С++.
Ответ 5
Чтобы дать еще одну альтернативу, которая действительно может вам даже помочь, если вам нужно выполнить сразу несколько вычислений, которые могли бы работать параллельно, это использовать Gearman.
Gearman позаботится о том, чтобы разговаривать с С++, и вы могли одновременно выполнять несколько вычислений. Сам Gearman - это просто компонент, который позволяет вам разговаривать с ним как сервером задач, и вы пишете работников, которые подключаются к нему для выполнения фактической работы. Это также позволяет увеличить масштаб, скажем, у вас есть что-то большое для расчета, вы можете запустить 20 экземпляров AWS EC2 и запустить там рабочих для тяжелого подъема, а затем отключить их после этого.
Для лучшей производительности, если прямое и параллельное выполнение не требуется, я бы использовал подход Crashworks на 100%, или вы могли бы смешивать два.
Ответ 6
Да, это можно сделать:
PHP может запускать команды на сервере.
Процесс отличается для систем WINDOWS и LINUX.
Для окон проверьте эти ссылки
exec Функция
ссылка для фоновых процессов в окнах
Для Linux:
системная функция
Выполнение процесса в фоновом режиме
Ну, я попытался использовать этот процесс и немного преуспеть.
И еще одно, что вы тоже можете получить результаты
Ответ 7
Создайте исполняемый файл на С++. Используйте proc_code, чтобы передавать данные в/из этого исполняемого файла и вызывать этот исполняемый файл для выполнения вычислений.
Ответ 8
php function system() выполнит эту работу. Просто передайте скомпилированный файл С++ в систему() и получите возвращаемый результат.
Ответ 9
Для * ux-систем вы можете запустить приложение С++ как CGI script в apache, например.
Apache: C/С++ script (может быть доступен и в окнах, как я вижу в этой ссылке).
В этом случае вы просто устанавливаете форму HMTL для публикации (например) в CGI script.
Я тестировал в Linux и Apache 2, это очень простая координация по HTTP.
Ответ 10
Если вы хотите обрабатывать эти асинхронно, вы можете взглянуть на Beanstalkd, который действует как очередь заданий, сохраняя куски данные, которые будут получены другим процессом для обработки. Таким образом, вы можете написать процесс С++, который сидит там, ожидая чего-то, и забирает работу от Beanstalkd. Beanstalkd не только быстро, но также может быть распределен.
Есть несколько клиентских библиотек C (++) для beanstalkd, доступных https://github.com/kr/beanstalkd/wiki/client-libraries.
Ответ 11
Из того, что я знаю, лучшим решением будет писать PHP-расширение в С++.
Это дает вам возможность создать собственную "собственную" функцию PHP, которую вы назовете my_func(). И он выполнит все вычисления, необходимые вам со скоростью приложения С++, и вернет результат в качестве вывода из my_func().
Вы можете посмотреть на этот вопрос: Как начать писать расширение PHP5 на С++