У меня много математических вычислений в моем PHP-скрипте, который может быть довольно медленным. Мне интересно, можно ли передавать данные с PHP на C ++, выполнять вычисления на C ++, а затем передавать результаты на PHP?
PS Я не очень хорошо разбираюсь в 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 ++