Google
Web dns.bdat.net

Re: [PHP-ES] delay en php

Write haof XML files: Satyam ( satyam@satyam.com.ar)
Fecha: vie 13 may 2005 - 18:52:15 CEST


En primer lugar, puede que te interese ver el apéndice L del manual,
respecto de los URL que puedes especificar al usar la función fopen(),
especialmente:

http://www.php.net/manual/en/wrappers.http.php

Esto sólo te permite hacer un GET, no un POST, espero que eso te sirva
igual.

Veo que no esperas respuesta al POST que haces, sino que cierras la conexión
inmediatamente, descartando cualquier respuesta, sin embargo, por esas
cuestiones de los tiempos y las demoras, puede que al hacer el fclose
inmediatamente despues del fputs, al servidor le llegue la información de la
caida de la conexion antes de haber procesado el dato y el POST puede que
sea desechado. Deberías hacer el fgets, aunque más no fuera para asegurarte
que la comunicacion se ha establecido en ambos sentidos. El fopen te lo
resuelve mejor pues al enviar la información del URL, con los datos del GET,
abre inmediatamente un buffer para recibir la posible respuesta.

Además, el fopen te permite manejar proxies.

Me imagino que tu consulta es como puedes enviar uno de estos pedidos cada
segundo. La respuesta es, basicamente, no puedes. El fsockopen y luego el
fputs pueden tardar tiempos muy variables, nunca sabes cúanto. Lo mismo
ocurrirá con in fopen. En definitiva, no es diferente de lo que ocurre
cuando tipeas un URL en tu navegador. Podrían quedarse varios segundos
colgados hasta salir con timeout. El timeout lo puedes controlar, pero si lo
haces muy corto, eso haria que muchas peticiones que simplemente se estan
demorando terminen canceladas.

El unico lugar donde ponerle el sleep sería en el lazo for(), pero esa
demora simplemente se sumaría a la demora de la transmision, nunca lograrías
una demora de 1 segundo entre peticion y peticion sino de 1 segundo mas lo
que hubiera tardado la peticion anterior, que pueden ser varios segundos.

Si quieres hacer una consulta cada segundo, entonces deberás recurrir a
algun entorno multitareas, que el PHP no lo es. Java es una buena opcion
para esto. El problema que tienes aca es el fsockopen y el fputs que pueden
demorar tiempos arbitrarios, mayores que el segundo que tu buscas. Con un
entorno multitareas puedes tener un lazo principal generando 'threads' a
razón de uno por segundo, cada uno de ellos haciendo un pedido y cerrándose
por si solos cuando lo hubieran hecho. Deberas poner un limite a la
cantidad de 'threads' que lanzas, pues si hubiera muchos abiertos, eso
indicaría que el servidor no esta respondiendo y si no le pusieras limite
llegarías a consumirte toda la memoria de tu máquina.

Tener varias operaciones pendientes enter maquinas no es problema, de hecho,
cuando un navegador carga una pagina, en la medida que va leyendo el
documento y reconociendo referencias a otros URL, por ejemplo, hojas de
estilo o imágenes, genera multiples conexiones que conviven hasta haber
cargado todo el documento.

Respecto del 'tick', no tiene una medida fija. Es el tiempo que tarda en
ejecutarse una instrucción, que puede variar muchisimo segun la instrucción
y la velocidad y carga de la máquina. Pero es lo más cercano que tienes a
multitareas en PHP. De todas maneras, tu problema reside en la demora
indeterminada del fsockopen, que no hay forma de arreglar.

Satyam

"Gerardo Aquino" < mogurbon2000@yahoo.com.mx> wrote in message
news:20050512233617.92190.qmail@web60314.mail.yahoo.com...
> Si mira hago esto:
> $numero=$_REQUEST['numero'];
> function
> smspb($url,$server,$puerto,$trigger,$mensaje){
> $chrdata="dato1=eldato&dato2=elostrodato";
> $s_Request = "POST " . $url . " HTTP/1.0\n";
> $s_Request .= "Host: " . $server . ":" .
> $puerto . "\n";
> $s_Request .= "Content-Type:
> application/x-www-form-urlencoded\n";
> $s_Request .= "Content-Length: " .
> strlen($chrdata) . "\n";
> $s_Request .= "\n" . $chrdata .
> "\n\n";
> $fp = fsockopen ($server, $puerto,
> $errno, $errstr, 30) or die( "Error" );
> fputs ($fp, $s_Request);
> fclose($fp);
>
> }
>
>
>
> for($i=1;$i<=$numero;$i++){
>
> smspb($url, $server, $puerto, $trigger,"mesage".$i);
>
> }
>
> ahora lo que no entiendo es:
> ¿register_tick_function
> declare ()
> hacen que la funcion se ejecute en un solo tick?, y si
> es asi ¿cuanto dura el tick?
> no se si me pudieran dar un ejemplo,
> de antemano gracias
>
>
> --- Satyam < satyam@satyam.com.ar> escribió:
>
>> Ok, ahora nos vamos entendiendo. En algun lugar por
>> ahi dices 'se va la
>> primera URL'. Que usas? Fopen? Si lo que quieres
>> es consultar regularmente
>> un URL a intervalos exactos de 1 segundo, te va a
>> ser muy dificil hacerlo
>> con PHP. El fopen se demorará hasta establecer la
>> conexion, lo cual puede
>> tardar una buena parte de un segundo, a eso se le
>> sumará el segundo de la
>> demora del sleep y esto sin siquiera haber leido
>> algo. Tendrías que estar
>> generando y manteniendo múltiples identificadores de
>> recursos para cada
>> lectura pendiente, de las cuales podrías llegar a
>> tener muchas andando a un
>> tiempo. Lamentablemente en PHP, no siendo
>> multitareas, es muy dificil que
>> puedas lograrlo. Lo mas aproximado a algo
>> multitareas lo puedes lograr con
>> register_tick_function y el declare 'tick', y si la
>> temporización es algo
>> vital, pues deberas buscar otro entorno de
>> ejecucion, pues PHP no te
>> servirá.
>>
>> Satyam
>>
>>
>> "Gerardo Aquino" < mogurbon2000@yahoo.com.mx> wrote
>> in message
>>
> news:20050510215318.19550.qmail@web60325.mail.yahoo.com...
>> > disculpen son posts a otro server
>> > digamos:
>> > http://php.net?parametro1=algo&parametro2=otracosa
>> > y necesito generar varios
>> > con un retardo de un segundo por url
>> > gracias de antemano
>> >
>> > --- Satyam < satyam@satyam.com.ar> escribió:
>> >> Lo que queremos saber es qué quieres hacer con
>> esos
>> >> URL. No se cuántos
>> >> miles de URL podrías generar por segundo y
>> tambien
>> >> puedes demorar la
>> >> generacion de URLs a gusto, pero luego, que vas a
>> >> hacer con ellos?
>> >>
>> >> Si esperas enviarselos a un navegador, olvidalo.
>> >> Una vez que a un navegador
>> >> le has enviado un documento, no hay forma que le
>> >> envíes otro, ni que tengas
>> >> ningún control de ningún tipo sobre lo que hace
>> el
>> >> navegador. Cuando un
>> >> navegador recibió lo que pidió a través de un
>> URL,
>> >> es como si no existiera
>> >> mas.
>> >>
>> >> Es el navegador al que le tienes que decir, 'al
>> cabo
>> >> de tanto tiempo,
>> >> consultame de nuevo'. Es el navegador el que
>> debe
>> >> iniciar la comunicacion,
>> >> el servidor, donde corre PHP, no puede hacer
>> nada,
>> >> por mucho que quiera.
>> >> Por eso, el problema, si es que es este, que no
>> lo
>> >> sabemos, es un problema
>> >> de JavaScript y DHTML, no de PHP.
>> >>
>> >> Satyam
>> >>
>> >>
>> >> "Gerardo Aquino" < mogurbon2000@yahoo.com.mx>
>> wrote
>> >> in message
>> >>
>> >
>>
> news:20050510165400.25509.qmail@web60322.mail.yahoo.com...
>> >> > la cosa es que necesito generar urls con
>> distintos
>> >> > parametros cada segundo y para detenerlo aunke
>> use
>> >> > sleep se va a la primera url y ya no aclanza a
>> >> > utilizar la segunda tercera o cuarta, alguna
>> >> > sugerencia?
>> >> >
>> >> > --- Victor Saldaña D. < vsaldana@gmail.com>
>> >> escribió:
>> >> >> On 5/9/05, Gerardo Aquino
>> >> >> < mogurbon2000@yahoo.com.mx> wrote:
>> >> >> > Saludos a todos los de la lista
>> >> >> > disculpen, hay forma de cada determinado
>> tiempo
>> >> >> mandar
>> >> >> > generar un url, digamos 1 seg un url 2 seg
>> otro
>> >> >> url,
>> >> >> > etc..
>> >> >> > de antemano gracias
>> >> >>
>> >> >> hay multiples formas pero depende de que es lo
>> >> que
>> >> >> quieras hacer (y
>> >> >> como lo quieras abordar).
>> >> >>
>> >> >> para detener la ejecucion de PHP X segundos se
>> >> usa
>> >> >> sleep www.php.net/sleep
>> >> >>
>> >> >> --
>> >> >> Victor Saldaña D.
>> >> >> User #330054 counter.li.org
>> >> >>
>> >> >> --
>> >> >> PHP Spanish Localization Talk Mailing List
>> >> >> (http://www.php.net/)
>> >> >> To unsubscribe, visit:
>> >> http://www.php.net/unsub.php
>> >> >>
>> >> >>
>> >> >
>> >> >
>> >>
>> >
>>
> _________________________________________________________
>> >> > Do You Yahoo!?
>> >> > La mejor conexión a internet y 25MB extra a tu
>> >> correo por $100 al mes.
>> >> > http://net.yahoo.com.mx
>> >>
>> >> --
>> >> PHP Spanish Localization Talk Mailing List
>> >> (http://www.php.net/)
>> >> To unsubscribe, visit:
>> http://www.php.net/unsub.php
>> >>
>> >>
>> >
>> >
>>
> _________________________________________________________
>> > Do You Yahoo!?
>> > La mejor conexión a internet y 25MB extra a tu
>> correo por $100 al mes.
>> > http://net.yahoo.com.mx
>>
>> --
>> PHP Spanish Localization Talk Mailing List
>> (http://www.php.net/)
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>>
>
>
> _________________________________________________________
> Do You Yahoo!?
> La mejor conexión a internet y 25MB extra a tu correo por $100 al mes.
> http://net.yahoo.com.mx

-- 
PHP Spanish Localization Talk Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


Este archivo fue generado por hypermail 2.1.7 : sáb 18 mar 2006 - 18:24:01 CET