2012-03-30 13 views
14

Tengo una gran cantidad de cálculos matemáticos en mi script PHP, que a veces puede ser bastante lento. Me pregunto si es posible pasar datos de PHP a C++, hacer los cálculos en C++, y luego pasar los resultados a PHP?¿Pueden pasar datos PHP y C++ entre ellos?

P.S. No soy muy bueno en C++.

+2

La forma más fácil sería simplemente compilar un C++ ejecutable e invocarlo desde PHP. –

+0

¿Qué función usaría? Además, ¿cómo pasa PHP los datos a C++? –

+0

Llámalo con argumentos. No estoy seguro de si hay algo que te diga el valor de retorno de main(). editar: parece que 'exec' tiene esa capacidad. – chris

Respuesta

19

You can write a PHP module, que es a piece of C code that exposes a new built-in función para el intérprete de PHP. Esto será mucho más rápido que girar un segundo proceso a través del exec().

Sin embargo, estos módulos son difíciles de escribir, las herramientas de compilación son torpes y el paso de parámetros entre PHP y C requiere un gran cuidado en la asignación de memoria y el recuento de referencias. Además, C no es C++, por lo que necesitará una capa extern C alrededor de su código C++ para exportar funciones a PHP. (O bien, escriba su extensión en C en lugar de C++)

Por lo tanto, a menos que su requisito de velocidad sea realmente severo, será más fácil usar exec o proc_open y pasar datos hacia adelante y hacia atrás a través de punteros de archivo. Esto sería como escribir un programa en C++ que lea desde una entrada estándar y emita una salida estándar.

3

Puede hacerlo, y esta es una solución común para mejorar el rendimiento del código de rendimiento crítico. Puede crear una aplicación de línea de comandos en C++ y ejecutarla usando el comando exec de PHP (o algo similar).

En cuanto a pasar datos, tiene algunas opciones. Si se trata de una gran cantidad de datos, puede ponerlos en un archivo usando PHP y acceder a ese archivo desde C++. Si se trata de menos datos, simplemente puede pasar los argumentos de la línea de comando cuando ejecuta el programa C++.

0

Crea un ejecutable en C++. Use proc_code para pasar datos a/desde ese ejecutable y obtenga ese ejecutable para hacer los cálculos.

7

Si realiza los cálculos no tan a menudo que iría como dice Oleksi; Use el comando exec() de PHP para ejecutar la aplicación externa de C++ que hará el trabajo.

Pero, si ejecutar los cálculos intensamente, como un par de veces por segundo, entonces el tiempo de ejecución inicial del C++ aplicación podría incurrir en sanciones;
Luego podría considerar tener un servicio/aplicación C++ que escuche en un socket o un file-pipe, desde/hacia el cual pasa datos entre PHP y C++. Esto ahorrará el tiempo de inicio del EXE.

3

Para dar otra alternativa, una que en realidad podría incluso ayudarlo mucho si tiene que hacer varios cálculos a la vez que podrían ejecutarse en paralelo, es usar Gearman.

Gearman se encargará de hablar con C++ y podrá ejecutar múltiples cálculos al mismo tiempo. Gearman en sí mismo es simplemente un componente que le permite hablar con él como un servidor de tareas y usted escribe a los trabajadores que se conectan a él para ejecutar el trabajo real. Esto también le permite ampliar, decir que tiene algo grande que calcular, puede iniciar 20 instancias de AWS EC2 y ejecutar a los trabajadores allí para el levantamiento pesado, luego apáguelos después de que haya terminado.

Para un mejor rendimiento, si es sencillo y no se necesita una ejecución en paralelo, usaría el enfoque de Crashworks al 100%, o podría mezclar los dos.

0

php function system() haría el trabajo. Simplemente pase el archivo compilado de C++ al sistema() y obtenga el resultado devuelto.

0

Para sistemas * ux puede iniciar su aplicación C++ como script CGI en apache, por ejemplo.

Apache: C/C++ script (podría estar disponible en Windows también, como veo en esta referencia).

En este caso, simplemente configura el formulario HMTL para publicar (por ejemplo) en el script CGI.

He probado en Linux y Apache 2, es extremadamente fácil la coordinación por HTTP.

0

Si desea manejar estos de forma asíncrona, que podría echar un vistazo a Beanstalkd, que actúa como una cola de trabajos, almacenar cantidades de datos a ser recogidos por otro proceso para el procesamiento. Entonces podrías escribir un proceso en C++ que esté ahí esperando que se haga algo, y retoma el trabajo de Beanstalkd. Beanstalkd no solo es rápido, sino que también se puede distribuir.

Hay un par de bibliotecas de cliente C (++) disponibles para beanstalkd https://github.com/kr/beanstalkd/wiki/client-libraries.

0

Por lo que sé, la mejor solución sería escribir la extensión de PHP en C++.

Esto le da la posibilidad de crear su propia función PHP 'nativa' a la que llamará my_func(). Y hará todos los cálculos que necesite con la velocidad de la aplicación C++ y devolverá el resultado como resultado de my_func().

Es posible que desee mirar a esta pregunta: How to start writing a PHP5 extension in C++

Cuestiones relacionadas