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.