Foros del Web » Programando para Internet » PHP »

Sirve en el servidor local pero no en el del hosting.

Estas en el tema de Sirve en el servidor local pero no en el del hosting. en el foro de PHP en Foros del Web. Sin mucho preámbulo Código PHP: <?php function  ticket ( $pin ){          $pin = strtoupper ( $pin );          $pin = str_split ( $pin ); ...
  #1 (permalink)  
Antiguo 15/01/2011, 14:57
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Exclamación Sirve en el servidor local pero no en el del hosting.

Sin mucho preámbulo

Código PHP:
<?php
function ticket($pin){
        
$pin=strtoupper($pin);
        
$pin=str_split($pin);
    
$istore2 0;
    
$istore3 1313;
    for (
$w 0$w count($pin); $w++){
        
$istore5 = (int) ord($pin[$w]);
        
$istore2 = ((int)$istore2 * (int)$istore3);
        
$istore21= (((((int)$istore5 * (int)$istore5) * (int)$istore5) * 667)* (int)$w); 
        
$istore2 = (int)$istore2 + (int) $istore21;
    }
    
$istore2 = ((int)$istore2 2147483647) % 65536;
    for (
$istore5 4$istore5 >= 0$istore5-- ){
        
$astore4[$istore5] = ((int)$istore2 10) + 48;
        
$istore2 = (int)$istore2 10;
    }
    
$key=0;
    for (
$i=1$i<count($astore4); $i++){
        
$key.=chr($astore4[$i]);
    }
    return 
$key;
}
print 
ticket("216B22DD");
?>
El Archivo en el server local y en el host son exactamente los mismos, el resultado correcto debería ser: 07611

En el local muestra: 07611
Mientras que en el Hosting: 01072

Ahora, evidentemente tendrá que ver con las versiones/configuración, del php en ambos lados, pero si es asi en que variables de la configuración debo fijarme?? pues no veo que este usando alguna función fuera de las básicas, solo enteros grandes.

saludos y gracias por adelantado
  #2 (permalink)  
Antiguo 15/01/2011, 15:28
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sirve en el servidor local pero no en el del hosting.

No se que tan grande son los números que utilizas, mira esto .
Tienes una libreria para hacer operaciones de presicion con nros grandes.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #3 (permalink)  
Antiguo 15/01/2011, 15:46
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

Son grandes, y efectivamente exceden las limitaciones de los enteros en php, sin embargo, en mi caso eso es bueno.... pues en el servidor local me arroja exactamente los resultados deseados. Lo que me inclina a pensar (obviamente) que el problema son distintas configuraciones en ambos servidores... ahora la pregunta es, cuales configuraciones debería checar a fin de igualarlas????

Si he usado las librerías para enteros arbitrariamente grandes, sin embargo en este caso no los necesito, para mi va bien que se "revienten" esos enteros (en este caso particular).

Gracias por tu respuesta.
  #4 (permalink)  
Antiguo 17/01/2011, 14:54
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

vamos amigos... he probado en varios servidores locales y funciona, y 3 hosting distintos y nada....
  #5 (permalink)  
Antiguo 17/01/2011, 15:19
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sirve en el servidor local pero no en el del hosting.

Para mi tiene que ver con los servidores y los números grandes.
Fíjate si todos los servidores son de 64 bits y las localhost de 32 bits....

Código PHP:
Ver original
  1. echo PHP_INT_SIZE . '<br/>';
  2. echo PHP_INT_MAX;

Fijate si te da lo mismo en todas esos valores, pues el $istore2 enseguida da como valor 103033582379 que sobrepasa al máximo para entero de 2147483647 en 32 bits y en 64 bits me esta dando 9223372036854775807...

Se que una vez que se desborda un entero se convierte a float y eso puede hacer perder presicion...

Pero ni idea..
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #6 (permalink)  
Antiguo 17/01/2011, 15:45
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

Cita:
Iniciado por portalmana Ver Mensaje
Para mi tiene que ver con los servidores y los números grandes.
Fíjate si todos los servidores son de 64 bits y las localhost de 32 bits....

Código PHP:
Ver original
  1. echo PHP_INT_SIZE . '<br/>';
  2. echo PHP_INT_MAX;

Fijate si te da lo mismo en todas esos valores, pues el $istore2 enseguida da como valor 103033582379 que sobrepasa al máximo para entero de 2147483647 en 32 bits y en 64 bits me esta dando 9223372036854775807...

Se que una vez que se desborda un entero se convierte a float y eso puede hacer perder presicion...

Pero ni idea..
Excelente algo que no he revisado!! reviso y comento un millon de gracias, casi apostaria a que tiene que ver con la estructura del procesador, ahora... y de ser asi, soluciones??
  #7 (permalink)  
Antiguo 17/01/2011, 16:55
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

El resultado de las variables es:

4
2147483647

En ambos casos, tanto local como en el servidor!

Otra idea? Alguien mas?
  #8 (permalink)  
Antiguo 17/01/2011, 16:56
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

Cita:
Iniciado por portalmana Ver Mensaje
Para mi tiene que ver con los servidores y los números grandes.
Fíjate si todos los servidores son de 64 bits y las localhost de 32 bits....

Código PHP:
Ver original
  1. echo PHP_INT_SIZE . '<br/>';
  2. echo PHP_INT_MAX;

Fijate si te da lo mismo en todas esos valores, pues el $istore2 enseguida da como valor 103033582379 que sobrepasa al máximo para entero de 2147483647 en 32 bits y en 64 bits me esta dando 9223372036854775807...

Se que una vez que se desborda un entero se convierte a float y eso puede hacer perder presicion...

Pero ni idea..
La precision esta puesta en ambos a 12 tambien, disculpa una pregunta ya que tienes acceso a las 2 estructuras de cpu, en ambos te da el mismo resultado? Que imprime la funcion en ambos casos?
  #9 (permalink)  
Antiguo 17/01/2011, 16:57
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sirve en el servidor local pero no en el del hosting.

yo creo que definitivamente vas a necesitar de un servidor con procesador de 64bits, así como una versión de php compilada para ello...

o si te funciona en local, de menos deberías igualar idénticamente la configuración del servidor...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 17/01/2011, 17:02
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sirve en el servidor local pero no en el del hosting.

Mira este código... tiene una buena y otra mala...
Código PHP:
Ver original
  1. function ticket($pin)
  2. {  
  3.     $pin        = strtoupper($pin);
  4.     $pin        = str_split($pin);
  5.     $istore2    = 0;
  6.     $istore3    = 1313;
  7.     $bucle      = count($pin);
  8.  
  9.     for ($w = 0; $w < $bucle ; $w++) {
  10.         $istore5    = (int) ord($pin[$w]);
  11.         $istore2    = bcmul( (int) $istore2, (int) $istore3);
  12.         $istore21   = bcmul(bcmul(bcmul( bcmul((int) $istore5, (int) $istore5), (int) $istore5), 667), (int) $w);
  13.         $istore2    = bcadd( (int)$istore2, (int) $istore21);
  14.     }
  15.  
  16.     $istore2    = bcmod( ((int)$istore2 & 2147483647), 65536);
  17.    
  18.     for ($istore5 = 4; $istore5 >= 0; $istore5-- ) {
  19.         $astore4[$istore5]  = bcadd( bcmod((int)$istore2, 10), 48);
  20.         $istore2            = bcdiv((int)$istore2, 10);
  21.     }
  22.  
  23.     $key=0;
  24.     for ($i=1; $i<count($astore4); $i++){
  25.         $key.=chr($astore4[$i]);
  26.     }
  27.     return $key;
  28. }
  29. print 'Tichet: ' . ticket("216B22DD") . '<br />';
  30.  
  31. echo PHP_INT_SIZE . '<br/>';
  32. echo PHP_INT_MAX;

La buena: Da igual en servidores de 64 bits o 32 bits...
La mala: es que no da el valor que tu esperas, no se si erre algún calculo o que, pero capaz te sirva para encaminar el tema..

Saludos

P.D.: en la anterior me da diferente, es que los numero enseguida empiezan a separarse bastante...
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #11 (permalink)  
Antiguo 17/01/2011, 17:07
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

Revisare el codigo, ahora ando desde el movil, excelente tu ayuda, por encima creo que hiciste una division donde buscaba el modulo de la misma, pero no lo he analizado bien, pruebo y te aviso.!! Muchisimas gracias por la atencion prestada!
  #12 (permalink)  
Antiguo 17/01/2011, 17:10
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sirve en el servidor local pero no en el del hosting.

Mira sacando el casting a int de todos se comportan exactamente iguales en ambos lados...
Código PHP:
Ver original
  1. function ticket($pin)
  2. {  
  3.     $pin        = strtoupper($pin);
  4.     $pin        = str_split($pin);
  5.     $istore2    = 0;
  6.     $istore3    = 1313;
  7.     $bucle      = count($pin);
  8.  
  9.     for ($w = 0; $w < $bucle ; $w++) {
  10.         $istore5    = ord($pin[$w]);
  11.         echo $istore5 .'<br>';
  12.        
  13.         //$istore2 = ((int)$istore2 * (int)$istore3);
  14.         $istore2    = bcmul($istore2, $istore3);
  15.         echo 'i2:'. $istore2 .'<br>';
  16.  
  17.         //$istore21= (((((int)$istore5 * (int)$istore5) * (int)$istore5) * 667)* (int)$w);
  18.         $istore21   = bcmul(bcmul(bcmul( bcmul( $istore5, $istore5), $istore5), 667), $w);
  19.         echo $istore21 .'<br>';
  20.  
  21.         //$istore2    = (int)$istore2 + (int) $istore21;
  22.         $istore2    = bcadd( $istore2,  $istore21);
  23.         echo $istore2 .'<br>';
  24.     }
  25.  
  26.     //$istore2 = ((int)$istore2 & 2147483647) % 65536;
  27.     $istore2    = bcmod( ($istore2 & 2147483647), 65536);
  28.     echo ':'.$istore2 .'<br>';
  29.    
  30.     for ($istore5 = 4; $istore5 >= 0; $istore5-- ) {
  31.         //$astore4[$istore5] = ((int)$istore2 % 10) + 48;
  32.         $astore4[$istore5]  = bcadd( bcmod($istore2, 10), 48);
  33.         //$istore2 = (int)$istore2 / 10;
  34.         $istore2            = bcdiv($istore2, 10);
  35.     }
  36.  
  37.     $key=0;
  38.     for ($i=1; $i<count($astore4); $i++){
  39.         $key.=chr($astore4[$i]);
  40.     }
  41.     return $key;
  42. }
  43. print 'Tichet: ' . ticket("216B22DD") . '<br />';
  44.  
  45. echo PHP_INT_SIZE . '<br/>';
  46. echo PHP_INT_MAX;

P.D.: Después dime como al final lo pudiste solucionar, uno nunca sabe cuando va a caer en estos problemas...
Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #13 (permalink)  
Antiguo 18/01/2011, 10:49
 
Fecha de Ingreso: octubre-2010
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Sirve en el servidor local pero no en el del hosting.

Cita:
Iniciado por portalmana Ver Mensaje
P.D.: Después dime como al final lo pudiste solucionar, uno nunca sabe cuando va a caer en estos problemas...
Saludos
Usamos esta funcion para forzar u obligar a enteros signed de 32bits, asi no importa la estructura del procesador ni alguna variable, de esta forma la funcion daba los resultados iguales en ambos servidores:


Código PHP:
Ver original
  1. function ticket($pin){
  2. function thirtyTwoBitIntval($value)
  3. {
  4.     if ($value < -2147483648)
  5.     {
  6. return -(-($value) & 0xffffffff);
  7.     }
  8.     elseif ($value > 2147483647)
  9.     {
  10. return ($value & 0xffffffff);
  11.     }
  12.     return $value;
  13. }
  14. $pin=strtoupper($pin);
  15. $pin=str_split($pin);
  16. $istore2 = 0;
  17. $istore3 = 1313;
  18. for ($w = 0; $w < count($pin); $w++){
  19. $istore5 =  ord($pin[$w]);
  20. $istore2 = thirtyTwoBitIntval(thirtyTwoBitIntval($istore2) * $istore3);
  21. $istore21= thirtyTwoBitIntval(((($istore5 *$istore5) *$istore5) * 667)*$w);
  22. $istore2 = thirtyTwoBitIntval(thirtyTwoBitIntval($istore2) + thirtyTwoBitIntval($istore21));
  23. }
  24. $istore2 = thirtyTwoBitIntval((thirtyTwoBitIntval($istore2) & 2147483647) % 65536);
  25. for ($istore5 = 4; $istore5 >= 0; $istore5-- ){
  26. $astore4[$istore5] = ((int)$istore2 % 10) + 48;
  27. $istore2 = (int)$istore2 / 10;
  28. }
  29. $key=0;
  30. for ($i=1; $i<count($astore4); $i++){
  31. $key.=chr($astore4[$i]);
  32. }
  33. return $ticket;
  34. }
Agradezco muchisimo tu ayuda, aqui te dejo el codigo por si llegas a pasar algun dia por ese problema.

Última edición por nevusdotcom; 18/01/2011 a las 10:55

Etiquetas: hosting, local, servidores
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 23:58.