script php

Pepe
14 de Febrero del 2005
Estoy comenzando a realizar cosas con php y me ha surgido el siguiente problema:

Tengo un pagina php (prueba.php) cuyo cometido es devolver un fichero. Si invoco desde un navegador a la URL http://www.pruebas.com/prueba/prueba.php, este me pregunta que deseo hacer con él.

El problema que tengo es que lo que yo quiero hacer es desde un script php invocar a esa URL, coger el contenido de ese fichero y almacenarlo en otro fichero.

¿Es posible llevar a cabo esto con php?

Lo he intentado de esta manera pero el script se queda como colgado.

<?php
$file = fopen ("http://www.pruebas.com/prueba/prueba.php", "r");
$file1 = fopen ("prueba.txt", "w");
if (!$file)
{
echo "Error.\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
fputs($file1,$line);
}
fclose($file);
fclose($file1);
?>

¿Que error/es estoy cometiendo?

Muchas gracias a todos.

lostsoul
14 de Febrero del 2005
joer como me he quedado con la mosca, he pensado que se puede hacer siguiendo un modelo cliente-servidor. Asi que mire si php tenia las librerias para trabajar con sockets como en C y existe una extención que al parecer aun es experimental (osea que es sucetibles de futuros cambios), pero que nos permite manipular. Osea retirando todo lo dicho si se puede hace en php lo unico que el script de tu maquina A como hace de servidor debe estar en ejecución constante. Dame un poco de tiempo ya que el tema me parecio interesante y estoy haciendo un codigo para hacerlo, ya tengo hecho el servidor solo me falta el cliente en este caso tu maquina B. Y mirar si todo funciona lo más importante...jejeje...Un saludo espero acabarlo pronto.

Todos los dias se aprenden cosas nuevas :-)

lostsoul
14 de Febrero del 2005
Espero que esta solución te sirva para algo. Saludos

lostsoul
14 de Febrero del 2005
Lo unico que en B debe haber un script que actue de 'cliente' no vale con lo que tenias. El codigo del cliente podria ser:

<?
/*Leemos el fichero*/
$fichero = './principal/fondo/1.gif';
$nombre = basename($fichero);
$id = fopen ($fichero, "r");
$contenido = fread ($id, filesize($fichero));
fclose ($id);

/*Definimos puerto del servidor, al que debe
conectarse el cliente. NOTA debe ser el mismo
que el elegido en servidor*/
define('SERV_PUERTO',6667);

/*Definimos la dirección de la maquina donde se
encuentra el servidor. NOTA nos referimos a la
dirección IP*/
define('DIR_SERV','@IP de la maquina A');

/*Creamos el socket con el nos comunicaremos con el servidor*/
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0){
echo "Error al crear el socket de comunicaci&oacute;n<br>";
exit(1);
}

/*Abrimos conecci&oacute;n con el servidor*/
if (($resultado = socket_connect($sock, DIR_SERV, SERV_PUERTO))<0){
echo "Error al intentar conectarnos con el servidor.<br>";
exit(1);
}

/*Escribimos en el socket el contenido del fichero*/
socket_write($sock, $contenido);

/*Cerramos el socket*/
socket_close($sock);

echo "Todo ha ido bien";
?>

lostsoul
14 de Febrero del 2005
Exactamente lo que queirias hacer no se puede hacer, al menos hasta donde alcanzan mis conocimientos. Pero si que se puede conseguir "algo parecido" en la maquina A tienes un scrip que actuaria como un servidor, que permaneceria escuchando en un determinado puerto a que un cliente se 'conecte' el codigo del servidor puede ser el siguiente:

<?
/*Definimos un puerto cualquiera para comunicarnos,
puedes poner el que desees*/
define ('SERV_PUERTO',6667);

/*Creamos un sockect (punto de conexión),
nosotros nos comunicaremos con el socket,
y este a su vez con el socket del 'cliente'*/
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0){
echo "Error al crear el socket de comunicaci&oacute;n.<br>";
exit(1);
}


/*Asignamos una dirección de transporte
al socket que hemos creado, ya que cuando
lo creamos no se le asigna ninguna dirección
IP ni puerto*/
if (!socket_bind($sock,'0.0.0.0',SERV_PUERTO)){
echo "Error no se pudo asignar direcci&oacute;n al socket<br>";
exit(1);
}


/*Creamos otro socket pero este es especial,
su usa para aceptar conxiones TCP*/
socket_listen($sock);

$cont = 0;
while (true) {
//bucle infinito
/*Extraemos una petición de conexión de la cola de peticiones
pendientes (socket_listen) y abrimos un nuevo socket, que en
este caso también es especial, será al que se conectará el
'cliente'. Sino hay conexiones pendientes nos quedaremos bloquedos
hasta que haya alguna*/
if (!$sock_dialogo = socket_accept($sock)){
echo "Error conexi&oacute;n no aceptada<br>";
exit(1);
}

/*Inicializamos el buffer donde guarderemos,
lo que vamos a leer*/
$buffer = "";

/*Y por fin leemos*/
while ($buffer_aux = socket_read($sock_dialogo,1024, PHP_BINARY_READ)){
$buffer.= $buffer_aux;
}

/*Cerramos el socket, ya hemos leido su contenido*/
socket_close($sock_dialogo);

/*Directorio donde queremos guardar los ficheros
en este caso en una carpeta "ficheros_descargados"
que se encuentra en el mismo directorio que el
script*/
$dir = './ficheros_descargados';
if (!is_dir($dir)){
/*Si no existe, lo creamos*/
/*NOTA: Yo le ha dado todos los permisos si quieres
puedes modificar que permisos deseas darle*/
if (!mkdir($dir,0777)){
echo "Error al crear el directorio";
exit(1);
}
}

$cont +=1;
/*Creamos el fichero donde escribiremos*/
$id = fopen($dir."/imagen".$cont.".gif",'w');

/*Escribimos en el fichero*/
fwrite($id, $buffer, strlen($buffer));

/*Y cerramos el fichero*/
fclose($id);


}
?>

lostsoul
14 de Febrero del 2005
Utiliza la función copy("origen", "destino")

Por ejemplo:
copy("./prueba.php", "/.prueba.txt");
//Suponiendo que ambos esten en el mismo directorio
//Sino es así trendrás que cambiar la ruta './prueba.php'

Lo que pasa es que no entiendo muy bien que es lo quieres hacer, ¿que quieres hacer una copiar de ese fichero en la maquina que llama a la url o en el servidordonde esta la url?

si es en la maquina que llama a la url, es decir, la maquina del usuario, pues no se puede hacer en php. La unica forma es que el usurio le de a guardar cuando se habra el cuadro de dialogo. Si lo que quieres es guardar un fichero en la maquina del usuario sin que este se de cuenta, tendrás que usar algún exploit (casi todos solo funcionan en el explorer), pero mucho antivirus los detectan como virus, y además no es muy etico ¿porque vas ha querer guardar un fichero en la maquina del usuario sin que este se entere? si lo que desea es guardar información para secciones, identificar al usuario etc utiliza cookies

Pepe
14 de Febrero del 2005
Te explico:

Yo tengo un script php en una maquina A. En una maquina B existe una pagina php que devuelve como resultado un fichero. Si esa pagina php se invoca desde una navegador me aparece el tipico mensaje de que deseo hacer con él.

Lo que yo quiero es que desde el script php de la maquina A, llamar a la página o script php de la máquina B, y almacenar el fichero que devuelve en el sistema de archivos de la maquina A.

Espero haberme explicado mejor.

Un saludo.