Может ли PHP и C ++ передавать данные между собой?

У меня много математических вычислений в моем PHP-скрипте, который может быть довольно медленным. Мне интересно, можно ли передавать данные с PHP на C ++, выполнять вычисления на C ++, а затем передавать результаты на PHP?

PS Я не очень хорошо разбираюсь в C ++.

Solutions Collecting From Web of "Может ли PHP и C ++ передавать данные между собой?"

Вы можете написать PHP-модуль , который представляет собой фрагмент кода C, который предоставляет новую встроенную функцию интерпретатору PHP. Это будет намного быстрее, чем разворачивание второго процесса через exec() .

Однако такие модули трудно писать, инструменты сборки неуклюжи, а передача параметров назад и вперед между PHP и C требует большой осторожности при распределении памяти и подсчете ссылок. Кроме того, C не является C ++, поэтому для экспорта функций на PHP вам понадобится внешний слой extern C вокруг вашего кода на C ++. (Или напишите расширение в C вместо C ++.)

Поэтому, если ваше требование скорости не является действительно серьезным, будет проще использовать exec или proc_open и передавать данные вперед и назад с помощью указателей файлов. Это будет подобно написанию программы на C ++, которая читает со стандартного ввода и испускает стандартный вывод.

Если вы будете выполнять вычисления не так часто, как я бы сказал, как говорит Олекси; Используйте команду exec () PHP для запуска внешнего приложения на C ++, которое будет выполнять эту работу.

Но, если вы выполняете вычисления интенсивно , как несколько раз в секунду , то время первоначального выполнения приложения C ++ может повлечь за собой штрафные санкции;
Затем вы можете посмотреть, есть ли C ++-сервис / приложение, которое прослушивает сокет или файловый канал, с / на который вы передаете данные между PHP и C ++. Это сохранит время запуска EXE.

Вы всегда можете скомпилировать свой код с помощью Facebooks HipHop.

Он преобразует ваш php в C ++ и затем скомпилирует его для машинного кода с помощью g ++.

https://github.com/facebook/hiphop-php/wiki/

https://github.com/facebook/hiphop-php/wiki/Running-HipHop

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

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

Что касается передачи данных, у вас есть несколько вариантов. Если у вас много данных, вы можете поместить их в файл с помощью PHP и получить доступ к этому файлу с C ++. Если это меньше данных, вы можете просто передать аргументы командной строки при запуске программы на C ++.

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

Gearman позаботится о том, чтобы поговорить с C ++, и вы можете одновременно запускать несколько вычислений. Сам Gearman – это просто компонент, который позволяет вам разговаривать с ним как сервером задач, и вы пишете работников, которые подключаются к нему для выполнения фактической работы. Это также позволяет увеличить масштаб, скажем, у вас есть что-то большое для расчета, вы можете запустить 20 экземпляров AWS EC2 и запустить там рабочих для тяжелой работы, а затем закрыть их после того, как это будет сделано.

Для лучшей производительности, если это прямолинейно, а параллельное выполнение не требуется, я бы использовал подход Crashworks на 100%, или вы могли бы смешивать два.

Да, это может быть сделано:

PHP может запускать команды на сервере.

Этот процесс отличается для систем WINDOWS и LINUX

Для окон проверьте эти ссылки

Функция exec

ссылка для фоновых процессов в окнах

Для Linux:

системная функция

Выполнение процесса в фоновом режиме

Ну, я попытался использовать этот процесс и немного преуспел.

И еще одно, что вы тоже можете получить

Создайте исполняемый файл на C ++. Используйте proc_code для передачи данных в / из этого исполняемого файла и вы получите этот исполняемый файл для выполнения вычислений.

php function system () выполнит эту работу. Просто передайте скомпилированный файл c ++ в систему () и получите возвращаемый результат.

Для * ux-систем вы можете запустить приложение C ++ в качестве скрипта CGI в apache, например.

Apache: скрипт C / C ++ (может быть доступен и в окнах, как я вижу в этой ссылке).

В этом случае вы просто устанавливаете форму HMTL для публикации (например) в сценарии CGI.

Я тестировал в Linux и Apache 2, это очень простая координация по HTTP.

Если вы хотите обрабатывать эти асинхронно, вы можете взглянуть на Beanstalkd , который действует как очередь заданий, сохраняя куски данных, которые будут отобраны другим процессом для обработки. Таким образом, вы можете написать процесс C ++, который сидит там, ожидая чего-то, и забирает работу от Beanstalkd. Beanstalkd не только быстро, но и может быть распределен.

Есть несколько клиентских библиотек C (++) для beanstalkd, доступных https://github.com/kr/beanstalkd/wiki/client-libraries.

Из того, что я знаю, лучшим решением будет писать PHP-расширение на C ++.

Это дает вам возможность создать собственную «собственную» функцию PHP, которую вы назовете my_func (). И он выполнит все вычисления, необходимые вам со скоростью приложения C ++, и вернет результат в качестве вывода из my_func ().

Вы можете посмотреть на этот вопрос: как начать писать расширение PHP5 в C ++