Problema con fgetc

Hola, soy yo de nuevo. Probé la función fread y fgets pero al final me funcionó con fgetc.
El problema es el tiempo que tarda. Es enorme y no lo entiendo porque el bucle no es nada del otro mundo:
for($i=0;$i<5300;$i++){
$codigo[] = fgetc($enlace);
}
He probado ha hacer un bucle mucho más grande en C:
for(i=0;i<5000;i++)
     for (j=0;j<5000;j++)
           a++;
Este bucle realiza 25millones de iteraciones y tarda 0.062 segundos en realizarse.
Es un bucle 5000 veces más grande! ¿Cómo puede tardar tan poco y en cambio el otro, en php, tardar tanto?
Para intentar reducir el tiempo me gustaría saber cómo avanzar el puntero manualmente. El bucle for que utilizo es para llevar el puntero hasta la posición 5261, que es a partir de ahí donde está el enlace que quiero guardar. Si pudiera iniciar el puntero en esa posición, el bucle para almacenar el enlace tendría como mucho 30 iteraciones y no 5000, lo que reduciría bastante el tiempo.
¿Se puede iniciar el puntero en la posición 5261?

1 Respuesta

Respuesta
1
Las cookies no puedes 'conseguirlas' porque se encuentran en el ordenador de cada usuario.
Cuando un usuario hace login, la cookie se almacena en su PC, de forma que si accede desde otro ordenador esa cookie no se ve. Por lo tanto tampoco puedes acceder tu a esa cookie accediendo al servidor.
Además, aunque pudieras acceder a la cookie eso no garantiza que la página te deje entrar. Puesto que no todas las páginas almacenan la misma información en las cookies (algunas no guardan ninguna), y lo relevante es que realices el login con el sistema que tiene establecido esa página.
La mayoría de estas páginas establecen estos sistemas para que sus imágenes y videos no sean accedidos por terceros directamente sino sólo a través de su web.
Me gustaría añadir que he probado a guardar el código fuente de una web en un fichero (todo de golpe, sin bucle) y solo guarda 16k... ¿Puedo cambiar eso sin cambiar la configuración de php?
Y muchas gracias por la ayuda.
Me autorespondo a la segunda pregunta:
No se cómo cambiar el problema de los 16k, pero hay otra forma que no da problemas. No lo guarda en un fichero pero lo guarda entero en memoria y de forma rápida. Luego el problema del puntero lo sigo teniendo.
Para conseguir el código fuente de forma rápida sin el problema de los 16k el código (sin bucles) es el siguiente:
<?
$gestor = fopen("http://www.enlace.com", "r");
$contenidos = stream_get_contents($gestor);
fclose($gestor);
echo "$contenidos";
?>
Lo que me gustaría saber es cómo se puede obtener el código fuente de esa página usando esa función pero usando cookies. Es decir, hay páginas que no muestran exactamente lo mismo si estás logueado que si no lo estas. Pues yo quiero usar ese código para obtener el código fuente de la web que ponga, pero el que mostraría estando logueado.
El valor de la cookie lo quiero guardar en una base de datos.
Vale, pero yo si he conseguido la cookie y he comprobado que me deja entrar desde otro PC (le he pasado la cookie a otro PC). Ahora solo me queda hacer que sea mi servidor web quien use esa cookie a la hora de recibir el código fuente de una web.
He preferido pasar de las cookies y loguearme como dios manda, pero de forma automática.
El formulario del loguin es el siguiente:
<script language="Javascript">
function postlogin(login,password)
{
document.loginform.login.value = login;
document.loginform.password.value = password;
document.loginform.submit();
}
function postlogin2()
{
document.loginform2.submit();
}
</script>
<div style="position:absolute; top:0px; left:0px;">
<form action="" method="POST" name="loginform">
<input type="hidden" name="login">
<input type="hidden" name="password">
</form>
</div>
y yo he probado a loguearme con lo siguiente:
<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,
'http://www.ejemplo.com/');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'login=usuario&password=clave');
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl, CURLOPT_HEADER, 0); //no mostrar cabeceras
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //no mostrar en pantalla
$data = curl_exec($curl); //descargar página
curl_close($curl);
?>
Pero, en el caso de que sea correcto, aún me faltaría la parte en la que se envían los datos, es decir, el submit.
La verdad es que lo que estás haciendo funciona como de casualidad.
La página acepta que le envíes unos valores por post que coinciden con los que espera (afortunadamente) y por eso te funciona. Pero claro no puedes garantizar que en una página que no controles tu, los parámetros que espere sean exactamente estos. Y tampoco vas a poder forzar un 'submit' si la página no quiere, a menos que sepas que enviándole un cierto parámetro realice la validación.
En todo caso, para cada página puede ser distinto: depende de cómo se haya programado.
Si, entiendo que tienen su código interno, pero cuando yo navego con firefox de alguna forma le indico que quiero loguearme. ¿No puede hacer lo mismo curl?
La forma en que indicas a Firefox que quieres logearte, es pulsando el botón de enviar el formulario. Sólo entonces se envían los datos para comprobar la autentificación.
Que yo sepa curl no puede ejercer esa acción de 'pulsar el botón'.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas