2011-12-26 11 views
5

He estado investigando esto durante varias horas, pero todo lo que he visto me parece bastante desalentador. He estado usando PHP para todas las cosas simples en mi sitio web hasta ahora. Estoy haciendo un montón de trabajo estadístico, y me gustaría tener C++ disponible para los cálculos más intensos.Vinculación de PHP con el programa local C++

El C++ se ejecutará localmente en la misma máquina Unix que PHP.

algo como lo siguiente es lo que yo estoy en una pérdida para saber cómo hacerlo:

<?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); 
?> 

Por supuesto, estoy corriendo algunas simulaciones de Monte-Carlo y atravesando realmente grandes árboles en lugar de números de incremento, pero eso no es lo que me está frenando.

C++ solo necesita escuchar un número y devolver otro número (tal vez algunas cosas en JSON como máximo). Es importante que C++ realice un seguimiento de sus variables entre llamadas.

He leído mucho sobre TCP, programación de socket, etc. y estoy un poco dudoso de que sea tan complicado como lo demuestran los ejemplos. Un montón de cosas me han señalado a esto http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver

Si realmente es más de 100 líneas de C++, ¿hay algunas bibliotecas populares, o hay una implementación simple en otro idioma?

Gracias!

+0

@dherefromhere: Listo: http://stackoverflow.com/a/8639563/367456 – hakre

+0

Estoy un poco confundido acerca de cómo el C++ mantiene su estado entre llamadas. ¿Se puede usar proc_open para pasar a través de STDIN a un programa C++ que se ejecuta continuamente? Me preocupa que comience una nueva instancia de C++ ... – dcc310

+0

Ver mi respuesta y comentario a continuación ... – Paul

Respuesta

2

Usted podría intentar: exec()

Usted envía los datos de PHP como argumentos para el programa C++ escrito que será ejecutado y el programa volverá la salida para que pueda utilizarlo en PHP después de la ejecución del ++ del programa de C .

+0

"Es importante para el C++ hacer un seguimiento de sus variables entre llamadas." - Entonces el ejecutivo no lo cortará. –

+0

¡Hmmm, podría usar una base de datos o un archivo, para el almacenamiento persistente de datos! – Paul

5

Si solo desea acceder a su programa C++ desde PHP (o usar PHP como interfaz web para su código C++), una alternativa para comunicarse a través de un socket sería insertar el código C++ en PHP como una extensión .

Hay una buena cantidad de código repetitivo asociado, pero la mayor parte se genera para usted con el script ext_skel (incluido en la fuente PHP).

La mayoría de la información en línea sobre la escritura de extensiones de PHP se refiere al uso de C, ver Extending PHP with C++? para un par de errores relacionados con el uso de C++ para esto.

3

Si su C++ es ejecutable, puede abrirlo como un programa, pasar datos a través de STDIN y pasar el valor de retorno a PHP a través de STDOUT. Ver proc_open­Docs.

Su biblioteca C++ estándar debe ofrecer acceso a STDIN y STDOUT, por lo que ya tiene lo que necesita.

Estoy un poco confundido acerca de cómo el C++ mantiene su estado entre llamadas. ¿Se puede usar proc_open para pasar a través de STDIN a un programa C++ que se ejecuta continuamente?Me preocupa que se inicia una nueva instancia de la C++

Usted podría estar buscando una Named pipe­Wikipedia, una forma de comunicación entre procesos (ver así: What are named pipes?), que es apoyada por la mayoría de los sistemas operativos. Es simple E/S (FIFO) y similar en comparación con STDIN y STDOUT. Puede mantener su ejecutable en la memoria mientras que los otros procesos pueden enviarle datos.

Otra forma simple es usar sockets, aquellos también son compatibles con PHP y deberían ser con su C/C++. Los sockets funcionarán en diferentes máquinas, por lo que puede ejecutar su propio ejecutable (de memoria/CPU?) En un servidor dedicado que solo hace el cálculo, por ejemplo. Solo busca lo que se adapte mejor en su caso, del comentario que leí está buscando comunicación entre procesos.

(estos son sólo algunos de los recursos, que, naturalmente, puede encontrar más con un poco de investigación, creo que para ambas tuberías y tomas nombradas debería poder encontrar ejemplos de código fuente para su caso)

+0

@ dcc310 Si hace esto, puede llamar 'proc_open' solo una vez desde su programa PHP (y usar la matriz de pipes para el resto de esa ejecución), para que pueda tener una instancia del programa C++ por ejecución del programa PHP . Es eso lo que necesita? –

+0

No estaba claro para mí que deseaba tener ejecutable en C++ para permanecer en la memoria. Extendí la respuesta sobre dos formas de comunicación entre procesos: * pipes nombrados * y * Sockets *. – hakre

+0

Lo siento, me tomó un tiempo probar cosas. Estaba buscando más de un "servidor" en C++, a fin de mantener una instancia de C++ en múltiples scripts de PHP. La solución de canalización nombrada funcionará bien para mí :) Para cualquier otra persona que intente esto, encontré estos enlaces de alguna manera útiles: http://my.opera.com/zomg/blog/2007/08/29/php-and-named -pipes y http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-3-accepting-input-from-named-pipes/ y http://squirrelshaterobots.com/ programación/php/building-a-queue-server-in-php-part-3-accepting-input-from-named-pipes / – dcc310

Cuestiones relacionadas