2011-12-26 4 views
5

Я занимаюсь этим несколько часов, но все, на что я смотрел, кажется довольно сложным. Я использовал PHP для всех простых вещей на моем сайте. Я делаю много статистической работы, и я хотел бы иметь C++ для более интенсивных вычислений.Ссылка на PHP с локальной программой на 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, программированию сокетов и т. Д., И я немного сомневаюсь, что это так сложно, как это делают примеры. Многие вещи указали мне на это http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver

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

Спасибо!

+0

@therefromhere: Done: http://stackoverflow.com/a/8639563/367456 – hakre

+0

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

+0

См. Мой ответ и комментарий ниже ... – Paul

ответ

2

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

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

+0

«Для C++ важно следить за своими переменными между вызовами». - так что exec не режет. –

+0

Хммм, он мог бы использовать базу данных или файл для постоянного хранения данных! – Paul

5

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

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

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

3

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

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

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

Вы могли бы искать для Named pipe­Wikipedia, форма связи между процессами (см, а также: What are named pipes?), который поддерживается большинством операционных систем. Это простой ввод-вывод (FIFO) и аналогичный по сравнению с STDIN и STDOUT. Вы можете сохранить исполняемый файл в памяти, в то время как другие процессы могут отправлять ему данные.

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

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

+0

@ dcc310 Если вы сделаете это, вы можете вызвать 'proc_open' только один раз из вашей PHP-программы (и использовать массив трубок для остальной части этого прогона), так что вы можете иметь один экземпляр программы на C++ для запуска программы PHP , Это то, что вам нужно? –

+0

Мне было непонятно, что вы хотите иметь исполняемый файл C++, чтобы оставаться в памяти. Я продлил ответ о двух способах межпроцессного взаимодействия: * названные каналы * и * сокеты *. – hakre

+0

Извините, мне потребовалось некоторое время, чтобы попробовать. Я искал больше «сервера» на C++, чтобы сохранить один экземпляр C++ в нескольких сценариях PHP. Именованное решение для труб будет прекрасно работать для меня :) Для тех, кто еще пытается это сделать, я нашел эти ссылки несколько полезными: http://my.opera.com/zomg/blog/2007/08/29/php-and-named -pipes и http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-3-accepting-input-from-named-pipes/ и http://squirrelshaterobots.com/ программирование/PHP/здание-а-очередь-сервер-в-PHP-часть-3-прием-вход-из названных труб / – dcc310