Как настроить связь между PHP и С++?

У меня есть вопрос относительно названного вопроса. Итак, я пытаюсь создать программу, которая передает данные/запросы для данных между программой на С++ и сайтом PHP, запущенным на веб-сервере Apache.

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

В идеале я бы предпочел не использовать какие-либо библиотеки, чтобы помочь мне в этом. Я знаю, что этот вопрос задавали много раз раньше, но я все равно никуда не уходил.

Может ли кто-нибудь объяснить вам, как это работает, или ссылки на вопрос здесь или где-нибудь еще, что может помочь? Или, если есть лучший способ сделать это, чем использовать сокеты? Они будут говорить друг с другом много, и скорость может быть проблемой.

Изменить, дальнейшее объяснение:

Веб-сервер: я запускаю веб-сервер Apache. PHP script расположен на этом сервере.

С++ Location: при тестировании мое приложение С++ хранится на той же малиновой Pi, что и веб-сервер. В реальном приложении мое приложение на С++ все равно будет храниться на том же устройстве (но это не будет основанный на малине Pi - все еще Linux).

Коммуникация: PHP script нужно будет запускать, чтобы делать что-то с помощью С++ script и наоборот. Им потребуется как для передачи данных (общие структуры данных, но они могут быть достаточно большими) в каждом направлении (так что оба должны иметь возможность отправлять и получать данные).

Ответ 1

Я думаю, что самый простой способ:

1) PHP → С++: tcp

2) С++ → PHP: http

Попробуем объяснить.

1) Чтобы взять что-то из приложения С++, PHP подключается к этому приложению, используя stream_socket_client. Приложение С++ прослушивает хост и порт с помощью функций socket, bind и listen. Как только соединение прибывает на С++ app accept, а затем в отдельный std::thread обслуживает его (recv, чтобы получить запрос, send для отправки ответа). Как сокет.

2) Поскольку PHP работает под Apache Web Server, я думаю, что самый простой способ - использовать библиотеку libcurl, чтобы сделать запрос HTTP из приложения С++. Как скручивать.

Ответ 2

Другим подходом могут быть веб-службы SOAP или REST. С обеих сторон вы можете предоставить веб-службу SOAP для обмена данными или для вызова удаленных функций. На стороне С++ вы можете использовать Apache Axis для предоставления SOAP-сервера. На стороне PHP вы можете использовать встроенный класс SOAPServer (http://php.net/manual/de/class.soapserver.php).

С помощью SOAP вы просто обмениваетесь сообщениями на основе XML между обоими приложениями через HTTP/HTTPS. С этим соглашением оба приложения могут инициировать друг друга и обмениваться данными.

Ответ 3

Добавляя к ответу Бена Шнарра, я думаю, что наиболее элегантным и простым решением было бы сделать программу на С++ клиентом для веб-сервисов, реализованных в PHP-коде. Использование сокетов напрямую заставит вас иметь дополнительный протокол над ним для представления передаваемых данных (если только данные не являются тривиально простыми, как поток текста ASCII), что было бы немного похоже на повторное использование колеса.

Я частично отношусь к REST + JSON, потому что они просты в использовании и использовании и очень мощные. Напротив, SOAP довольно сложный, тяжелый в ресурсах и хрупкий, особенно если вы используете его с С++. Одна популярная реализация, которую я уже использовал, например, заставит вас перекомпилировать ваш код каждый раз, когда вы измените макет любого из сообщений, даже если сервер добавляет поле, которое клиент не будет использовать.

На стороне PHP это довольно просто - у нее уже есть вся необходимая инфраструктура. В программе на С++ минимальный размер, который вам понадобится, - это клиентская библиотека HTTP и кодек JSON. Я использую libcurl для первого (безусловно, самого популярного) и jsoncpp для последнего, но есть и другие варианты для обоих. Совсем недавно некоторые библиотеки появились со всем пакетом, но у меня еще не было возможности использовать их. Некоторые примеры:

restclient

REST SDK

Restbed

Ответ 4

Если вам нужно руководствоваться тем, что рассказывали вам, тогда я предлагаю вам посмотреть

http://us2.php.net/manual-lookup.php?pattern=fsock&src= {referrer: source?} http://us2.php.net/manual-lookup.php?pattern=socket&src= {referrer: source?}

В С++ вы хотите создать прослушиватель TCP, который принимает команды (очевидно, вы захотите вставить некоторый метод проверки) затем используйте PHP, чтобы открыть соединение (используйте fsock или сокет на ваш выбор - fsock проще) и напишите данные вашему слушателю на С++. Это ezpz

//обновление с помощью некоторого примера кода

// protocol://ip, port, $errno, $errstr, $timeout
$fp = fsockopen("tcp://ip", 1337, $errno, $errstr, 30);
if(!$fp) die('failed connection or something');

//write something

fwrite($fp, "stuffs to write");

// get a reply?

while (!feof($fp)) {
    echo fgets($fp, 128); // where 128 is size
}

Ответ 5

Я рекомендую вам использовать Unix Sockets Для С++ проверьте это: http://www.linuxhowtos.org/C_C++/socket.htm

Для php проверьте это: stream_socket_client

Вы можете передавать информацию внутренне из обоих процессов.

Надеюсь, вы сможете это решить, не сдавайтесь.

Ответ 6

Решение SOAP может быть чем-то, что решает проблему, но, на мой взгляд, это усложняет развертывание приложения.

Вы можете перейти на несколько уровней и напрямую работать с XML-RPC.

Здесь у вас есть две интересные ссылки, в которых показано, как реализовать клиент и сервер на обоих языках.

XML-RPC для С++

XML-RPC для PHP

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