Foros del Web » Programando para Internet » PHP »

php -> C++ -> php

Estas en el tema de php -> C++ -> php en el foro de PHP en Foros del Web. Hola amigos, Estoy haciendo una aplicación en php que me esta causando problemas con el rendimiento, ya que la funcion principal se me va a ...
  #1 (permalink)  
Antiguo 27/04/2011, 10:43
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
php -> C++ -> php

Hola amigos,

Estoy haciendo una aplicación en php que me esta causando problemas con el rendimiento, ya que la funcion principal se me va a más de 30 segundos de ejecución y encima muchas veces sobrepasa la memoria; ya la he optimizado todo lo posible y lo imposible.

Tengo entendido que puedo combinar php con C++ y llamar a esa función concreta como si se tratase de un ejecutable, reescribir la funcion en C++ no sería mayor problema pero no se como hacer el resto.
La función en concreto debe ser llamada desde un php, esta recibe varios arrays por referencia y debe devolver otro array al mismo php.

Me he recorrido varios foros, mensajes y blogs, pero no encuentro nada que explique detalladamente y "para torpes" como hacerlo; el servidor es de alojamiento compartido en linux y tengo cpanel; os agradecería cualquier tipo de ayuda.

Un saludo!
  #2 (permalink)  
Antiguo 27/04/2011, 12:14
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 6 meses
Puntos: 1517
Respuesta: php -> C++ -> php

Antes que todo debe pensar mejorar el código. No necesariamente combinar un lenguaje con otro es lo adecuado o te ayudará a mejorar el rendimiento. ¿Podrías postear alguna función de lo que hayas hecho, que tome más tiempo de lo que esperas que haga?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 27/04/2011, 12:22
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 11 años, 7 meses
Puntos: 528
Respuesta: php -> C++ -> php

Sería conveniente que aclararas qué es lo que estás desarrollando y lo que llevas, quizá si haya forma de optimizar el proceso. Ten en cuenta que si tu procedimiento no es el óptimo, C no lo hará mucho más rápido que php.
  #4 (permalink)  
Antiguo 27/04/2011, 12:44
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

ufff, son mas de 1.000 lineas de código entre switch, if y else....

Basicamente son varios arrays multidimensionales que interactuan entre ellos de forma aleatoria con foreach; cuando estos tienen (relativamente) pocas variables va perfecto, el problema es cuando el numero de variables de cada array aumenta por encima de 100.000

Tengo algo similar hecho en C++ y apenas tarda 0.1s en ejecutarse, por eso queria implementarlo de ese modo para evitar la sobrecarga.
  #5 (permalink)  
Antiguo 27/04/2011, 15:40
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 6 meses
Puntos: 1517
Respuesta: php -> C++ -> php

Mira este ejemplo para que veas que iterar mas de 100000 valores en el array no lo hace tan lento
Código PHP:
Ver original
  1. <?php
  2. // % borrar esta línea, es solo para evitar un error con el highlight
  3. $array = array();
  4. for($i=0; $i<1000000; $i++){
  5.     $array[] = $i;
  6. }
  7. foreach($array as $a){
  8.     foo($a);
  9. }
  10.  
  11. function foo($a){
  12.     if(($a % 1000) === 0){
  13.         echo $a . '<br />';
  14.     }
  15. }
  16.  
  17. echo 'Terminó todos los bucles';
Esto crea un millon de valores y luego los recorre y te muestra cada 1000 valores en menos de 2 segundos (claro está dependiendo de tu computadora que uses como servidor). Una de las posibles razones porque un código es lento es porque lo estás tratando de imprimir en pantalla y eso sí pone lento no el codigo sino el navegador en mostrar la información.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 27/04/2011, 16:09
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

Cierto abimaelrc, el codigo que has puesto apenas cuesta nada ejecutarlo, pero no es tan sencillo; en el caso que hablamos, los arrays son multidimensionales y dependiendo de unos u otros valores se realizan distintas operaciones. No hay salida en pantalla, son operaciones internas que introducen el resultado en una base de datos.

He puesto la cifra de 100.000 por poner un ejemplo, pero necesito que sea ejecutable incluso iterando con varios millones de valores, y eso en php lo veo casi imposible; por eso la unica alternativa que veo es hacerlo en c++

Gracias de todos modos abimaelrc, puedes estar seguro de que lo he optimizado y reoptimizado una docena de veces, pero en php no hay forma :(
  #7 (permalink)  
Antiguo 27/04/2011, 16:22
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 11 años, 7 meses
Puntos: 528
Respuesta: php -> C++ -> php

Otra cosa: siempre puedes aumentar el tiempo de proceso de php, para que no expire antes, con set_time_limit.

Por cierto, una de mis aplicaciones más fuertes es capaz de manejar una matriz multidimensional a partir de cientos de miles de registros de una BD, aplicar cálculos y formateo de datos y las consultas más complejas las realiza en 3-5 minutos (la mayor parte se la lleva en la consulta mysql), claro el cliente entiende que si va a pedir un reporte detallado en extremo es normal que tarde.
  #8 (permalink)  
Antiguo 27/04/2011, 16:29
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

Ya lo he probado ocp001a, el problema por ahí viene que al ser un hosting compartido me "penalizan" por procesos lentos o mucho uso de procesador, y cambiar a un dedicado por este tema lo dejo como último recurso.

Gracias de todos modos por el aporte.
  #9 (permalink)  
Antiguo 27/04/2011, 16:54
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 6 meses
Puntos: 1517
Respuesta: php -> C++ -> php

También sería bueno que mostraras alguna consulta que hagas. Tal vez se pueda hacer algo en la parte de la base de datos y no te haz fijado.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 28/04/2011, 01:09
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

Hay tres consultas antes del script y una al final que inserta los resultados en la BD, pero dentro de la funcion en si no hay ninguna, por ahi tampoco se puede arañar nada :(

Basicamente es algo así:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $array1 = array(
  4.     0 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3' ),
  5.     1 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3' ),
  6.     // mas elementos
  7.     1000000 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3'),
  8.     );
  9. $array2 = array(
  10.     0 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3' ),
  11.     1 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3' ),
  12.     // mas elementos
  13.     1000000 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3'),
  14.     );
  15. $array3 = array(
  16.     0 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3' ),
  17.     1 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3' ),
  18.     // mas elementos
  19.     1000000 => array( 0 => 'foo', 1 => 'foo2', 2 => 'foo3'),
  20.     );
  21.  
  22. //Esto se repite 10 veces
  23. for ($i = 0; $i < 10; $i++) {
  24.     foreach ($array1 as $data) {
  25.           $rand = mt_rand(0, count($array2);
  26.           $array2[$rand][3] = $array2[$rand][0] * $data[0];
  27.           $array2[$rand][4] = $array2[$rand][1] * $data[0];
  28.           $array2[$rand][5] = $array2[$rand][2] * $data[0];
  29.     }
  30.  
  31.     foreach ($array2 as $data) {
  32.           $rand = mt_rand(0, count($array3);
  33.           $array3[$rand][3] = $array3[$rand][0] * $data[0];
  34.           $array3[$rand][4] = $array3[$rand][1] * $data[0];
  35.           $array3[$rand][5] = $array3[$rand][2] * $data[0];
  36.     }
  37.  
  38.     foreach ($array3 as $data) {
  39.           $rand = mt_rand(0, count($array1);
  40.           $array1[$rand][3] = $array1[$rand][0] * $data[0];
  41.           $array1[$rand][4] = $array1[$rand][1] * $data[0];
  42.           $array1[$rand][5] = $array1[$rand][2] * $data[0];
  43.     }
  44. }
  45.  
  46. ?>

Es algo genérico, pero la estructura vendría a ser parecida; después se realiza una reducción de los arrays y con otro script se evaluan los resultados que se insertan en modo texto (no mas de 1000 caracteres) en la BD con una sola consulta.

Última edición por chemuki_; 28/04/2011 a las 01:41
  #11 (permalink)  
Antiguo 28/04/2011, 04:20
(Desactivado)
 
Fecha de Ingreso: enero-2011
Mensajes: 293
Antigüedad: 8 años, 10 meses
Puntos: 4
Respuesta: php -> C++ -> php

Yo lo veo pero no se que cojones estas asiendo con ese codigo. que barbaridad la idea de abilamerc te sirve hombre, improvisa un poco.
  #12 (permalink)  
Antiguo 28/04/2011, 04:53
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 11 años, 11 meses
Puntos: 39
Respuesta: php -> C++ -> php

Hasta donde yo se en un alojamiento compartido no puedes ejecutar programas C++ desde PHP. Si quieres usar esa solución creo que tienes que buscar un alojamiento dedicado o quizás un VPS te sirva.
  #13 (permalink)  
Antiguo 28/04/2011, 06:31
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 6 meses
Puntos: 1517
Respuesta: php -> C++ -> php

"Por lo general", cuando en un código lo formas para luego eliminar de él, quiere decir que no estás optimizando la parte que te ingresa la información. Repito eso es "por lo general". ¿De donde recibes los datos para luego almacenarlos?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #14 (permalink)  
Antiguo 28/04/2011, 06:56
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

Cita:
Iniciado por yooom Ver Mensaje
Yo lo veo pero no se que cojones estas asiendo con ese codigo. que barbaridad la idea de abilamerc te sirve hombre, improvisa un poco.
Lo que haga o deje de hacer el código creo que no es relevante en absoluto; el tema es conseguir que ese código sea ejecutado y que el proceso no supere 1s.
La idea de abilamerc sirve relativamente, no es válida cuando se convierte en algo mucho mas complejo, que es mi caso.


Gracias _Ruben_, si es cierto lo que dices me temo que no me quedará otra opción :(


abilamerc, los datos los recibo en parte de otras tablas de la misma base de datos y en parte calculados en base a lo anterior; no es algo que se pueda hacer directamente en mysql si es por donde ibas.
  #15 (permalink)  
Antiguo 28/04/2011, 07:02
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 6 meses
Puntos: 1517
Respuesta: php -> C++ -> php

Ufff, pues ya me estoy riendiendo

Bueno en ese caso, no te queda otra que aumentar los recursos. Claro está, siempre va a haber algo que puedas hacer para mejorar lo que hayas hecho, por falta de conocimientos (como a cada rato me pasa en este foro y veo una forma de lograrlo más rápido).

Si buscas los juegos que hemos tenido de PHP, hay unos ejemplos que tratan de optimizar la forma como trabajar con el juego. Unos usando static para datos que no se van a alterar para que sea más rápido. Busca en el foro por juego en PHP y verás varios.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #16 (permalink)  
Antiguo 28/04/2011, 08:17
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

También hice eso, todos los datos que no se van a ver alterados en el proceso los paso a variables al inicio y no forman parte de los arrays.

Buscaré lo que me dices a ver si veo algo de luz, gracias.
  #17 (permalink)  
Antiguo 28/04/2011, 08:25
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 6 meses
Puntos: 1517
Respuesta: php -> C++ -> php

Si pero, ¿declaraste las variables como static, aquellas que vayas a iterar y que sus datos no son modificables?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #18 (permalink)  
Antiguo 28/04/2011, 09:10
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

No exactamente.
Me referia a que antes de iterar "limpio" los arrays quitando todo lo innecesario para el proceso, y si algún dato va a ser usado pero sin modificarse, lo declaro en una variable para quitarlo tambien del array y acceder a el por la variable.

Tengo también datos que son comunes a los que aplico lo mismo y de ese modo los arrays quedan reducidos todo lo posible.
  #19 (permalink)  
Antiguo 28/04/2011, 14:17
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 16 años
Puntos: 17
Respuesta: php -> C++ -> php

Pienso igual que muchos, que es posible optimizar el código, de todas formas, si realmente quiere escribir tus funciones y operaciones en C++, si es posible, yo veo dos alternativa, tal vez hay más.


1.- Escribir tus funciones y operacione como una extensión en C para PHP
La idea es escribir tus funciones en C, compilar tu módulo y pedir a tu hosting si pueden habilitar el módulo para ti (un poco dificil), creo que esta guia te puede ayudar Extension Writing Part I: Introduction to PHP and Zend)

2.-) Escribir tus funciones y operaciones como un programa en C o C++, que utilice sockets de escucha.

Debes crear una aplicación en C o C++, que levante un socket de escucha, y a través de el lea datos de entrada, opere con ellos y finalmente devuelve la salida.

Compilas la app estáticamente sobre una arquitectura similar al servidor, subes el app a tu servidor, le das permisos de ejecución y luego corres tu app en background desde tu script php ( ex: system("/home/deerme/bin/myapp &") ), ahora myapp corre en background, por lo tanto continua la ejecución de tu script php, ahora te puedes conectar vía socket al socket que de escucha de myapp y "traspasar los datos", finalmente lee la salida de myapp.

Eso si, requiere tiempo de implementación :P

Saludos
  #20 (permalink)  
Antiguo 28/04/2011, 15:46
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

Gracias DeeR por el aporte, aunque lo veo muy chungo :(

La opcion 1 practicamente descartada por lo que comentas del hosting y la 2... ando mas que justito en C / C++ así que lo veo tambien muy dificil >.<
  #21 (permalink)  
Antiguo 28/04/2011, 16:07
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 16 años, 6 meses
Puntos: 60
Respuesta: php -> C++ -> php

Si son valores que extraes de la DB y luego los regresas posiblemente la opción mas viable es usar procedimientos almacenados y cargar estos cálculos a la DB
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #22 (permalink)  
Antiguo 28/04/2011, 16:29
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 8 años, 10 meses
Puntos: 155
Respuesta: php -> C++ -> php

se me ocurren igual algunas ideas
una, un server con hiphup, basicamente haria lo que tu quieres hacer pero directamente en php y hiphup lo traduciria a c++ por ti
https://github.com/facebook/hiphop-php/wiki/

ostra, mira en esta funcion me late que con

http://mx2.php.net/manual/es/function.passthru.php ella algo puedes hacer checa el codigo de esta parte

Código PHP:
# ...
# (function stuff)
ob_start();
passthru("php myscript.php, $result");
$content_grabbed=ob_get_contents();
ob_end_clean();

if(
$result=0){
 echo 
'<div>',$content_grabbed,'</div>';
}
_
# (more function stuff)
# ... 

lo que me suena raro ahi es el if pero es cosa de calarlo


ostra idea me late que python podria hacerlo de otra forma ,por que maneja hilos , asi que un host con python tambien podria ser opcion , o usar un standalone en python , de verdad es muy rapido
__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #23 (permalink)  
Antiguo 28/04/2011, 18:52
 
Fecha de Ingreso: abril-2011
Mensajes: 20
Antigüedad: 8 años, 7 meses
Puntos: 2
Respuesta: php -> C++ -> php

Tras mirar varios artículos sobre el tema, he descartado el uso de procedimientos almacenados principalmente porque no se recomienda para el proceso que necesito, gracias por el aporte _ssx.

Sobre HipHop... lo veo bastante complicado y no hay mucha informacion sobre como instalarlo y configurarlo, aparte de que es casi como matar moscas a cañonazos; posiblemente pueda lograr lo mismo con passthru().

Python descartado, no lo tengo disponible en el host :(

passthru() .... he encontrado un par de articulos sobre el tema que tengo que mirarme a fondo y hacer algunas pruebas a ver si lo puedo conseguir, gracias mogurbon.

Por si os interesa a alguno pongo los enlaces

Executing A C++ Application Over The Internet With PHP -> http://www.devarticles.com/c/a/Apache/Executing-A-C-plus-Application-Over-The-Internet-With-PHP/
Optimizar PHP con C y C++ -> http://www.programadorphp.org/blog/optimizar-php-con-c-y-cpp/

(La segunda esta caida, hay una "copia" en Taringa -> http://www.taringa.net/posts/info/6576284/Optimizar-PHP-con-C-y-C_.html )

Edit: No se porque leches no muestra correctamente las urls, imagino que algun sistema anti-spam del foro, así que van a pelo :(

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:25.