Связывание PHP с локальной программой C ++ - PullRequest
5 голосов
/ 27 декабря 2011

Я изучал это несколько часов, но все, на что я смотрел, выглядит довольно устрашающе. До сих пор я использовал PHP для всех простых вещей на моем сайте. Я выполняю большую статистическую работу, и мне бы хотелось, чтобы c ++ был доступен для более интенсивных вычислений.

C ++ будет работать локально на той же Unix-машине, что и PHP.

Что-то вроде следующего - вот что я затрудняюсь сделать:

<?php 
//c++ program has a counter initialized to 0
//PHP tells c++ to add 5 to the counter.  $incremented is 5
$incremented = increment_in_cpp_and_return(5);
//$incremented_again will be 7
$incremented_again = increment_in_cpp_and_return(2);
?>

Конечно, я выполняю некоторые симуляции Монте-Карло и пересекаю действительно большие деревья вместо увеличения чисел, но это не то, что сдерживает меня.

C ++ просто нужно прослушать число и вернуть другое число (может быть, некоторые вещи в JSON самое большее). Для c ++ важно отслеживать свои переменные между вызовами.

Я много читал о TCP, программировании сокетов и т. Д., И я немного сомневаюсь, что это так сложно, как показывают примеры. Много вещей указало мне на это https://beej.us/guide/bgnet/html/multi/clientserver.html#simpleserver

Если это действительно более 100 строк c ++, есть ли какие-нибудь популярные библиотеки или простая реализация на другом языке?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 27 декабря 2011

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

С ним связано довольно много стандартного кода, но большая его часть генерируется для вас скриптом ext_skel (входит в состав источника PHP).

Большая часть информации в Интернете о написании расширений PHPотносится к использованию C, см. Расширение PHP с помощью C ++? для пары ошибок, связанных с использованием C ++ для этого.

3 голосов
/ 27 декабря 2011

Если ваш C ++ исполняемый, вы можете открыть его как программу, передать ему данные через STDIN и вернуть возвращаемое значение в PHP через STDOUT. См. proc_open и документы .

Ваша стандартная библиотека C ++ должна предлагать доступ к STDIN и STDOUT, поэтому у вас уже есть то, что вам нужно.

Я немного озадачен тем, как c ++ поддерживает свое состояние между вызовами. Можно ли использовать proc_open для передачи через STDIN в программу c ++, которая постоянно работает? Я беспокоюсь, что он запускает новый экземпляр C ++

Возможно, вы ищете Именованный канал & Wikipedia , форму межпроцессного взаимодействия (см. Также: Что такое именованные каналы? ), что поддерживается большинством операционных систем. Это простой ввод / вывод (FIFO) и аналогичные по сравнению с STDIN и STDOUT. Вы можете хранить свой исполняемый файл в памяти, в то время как другие процессы могут отправлять на него данные.

Другой простой способ - использовать сокеты, которые также поддерживаются PHP и должны быть в вашем C / C ++. Сокеты будут работать на разных машинах, поэтому вы можете запустить собственный исполняемый файл (интенсивно использующий память / ЦП?) На выделенном сервере, который, например, выполняет только вычисления. Просто выглядит то, что подходит лучше в вашем случае, из комментария, который я прочитал, вы ищете межпроцессное взаимодействие .

(это всего лишь некоторые ресурсы, вы, конечно, можете найти больше с помощью небольшого исследования, я думаю, что как для именованных каналов, так и для сокетов вы сможете найти примеры исходного кода для вашего случая)

2 голосов
/ 27 декабря 2011

Вы можете попробовать: exec ()

Вы отправляете данные из PHP в качестве аргументов для написанной программы на C ++, которая будет выполнена, и программа вернет вывод, чтобы вы могли использоватьэто в PHP после выполнения программы на C ++.

1 голос
/ 27 декабря 2011

Я использовал gSOAP для удаленных вызовов процедур между C ++ и PHP, и если вы используете PHP5, взаимодействие становится очень простым; см http://www.php.net/manual/en/class.soapclient.php

...