So che sono leggermente OT perchè il problema che sto sottoponendo alla vostra attenzione non è legato propriamente a Drupal ma al PHP ma sto realizzando un sito drupal che prevede anche l'uso di PHP e voi siete una community molto attiva e presente e son sicuro che qualcuno saprà aiutarmi...
Premetto che tutto quello che voglio fare qua sotto in locale funzionava...
Sto cercando di recuperare un foglio XML dal server di un gestionale e di sovrascrivere un file che ho sul database sul mio server (Aruba, linux).
Il codice php che fa la cosa è il seguente:
[CODE]
//RECUPERO IL FOGLIO XML DAL SERVER FTP
//Connessione al server ftp
$ftp_host = 'www.hostgesionale.it';
$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
//Login al server ftp
$username = 'miousersulgestionale';
$pwd = 'miapasssulgestionale';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
//recupero del file
$destination_file = "http://www.miosito.it/aggiornamento/studenti.xml";
$source_file = "/file.xml";
[B]ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");[B]
//Chiusura della connessione al server ftp
ftp_quit($connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
[/CODE]
Però quando eseguo il php mi da questo errore:
Warning: ftp_get(h*tp://www.miosito.it/aggiornamento/studenti.xml): failed to open stream: HTTP wrapper does not support writeable connections in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Warning: ftp_get(): Error opening [CODE]http://www.miosito.it/aggiornamento/studenti.xml[CODE] in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29
Errore durante il recupero del file dal server ftp
(dove la frase "Errore durante il recupero del file dal server ftp" è scritta dal mio codice...)
la riga 29 è quella che ho messo in grassetto dove ho "ftp_get"
I possibili errori che mi vengono in mente sono questi:
1. non devo mettere $destination_file = "h*tp://www.miosito.it/aggiornamento/studenti.xml"; ma $destination_file = "f*p://user@aruba.it@ftp.miosito.it/www.miosito.it/aggiornamento
/studenti.xml";
2. cambiare i permessi dei file php e xml da 755 a 777 (anche se quando ho settato a 777 mi dava INTERNAL ERROR)
3. Ho fatto l'accesso al server prima di connettermi al server del gesionale, potrebbe essere un problema?
Io non sono un mago del php, qualcuno sa quindi dove sto sbagliando?
Mi sembra che stai girando quel script (
/web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php[/codefilter_...) sul server di destinazione - il tuo sito Drupal.
In quel caso il valore di
$local_file
in ftp_get si riferisce a/web/htdocs/www.miosito.it/[/codefilter_code] quindi è sufficiente specificare
$destination_file = "/aggiornamento/studenti.xml";
HTH
John
Più imparo, più dubito.
I file studenti.xml e aggiornamentodatabase.php sono nella stessa cartella infatti ho provato come dici tu ma mi ha detto che non trovava il file:
allora ho provato mettendo solamente
$destination_file = "/studenti.xml";
e mi dice che non ho i permessi:
ho provato a settare a 777 i permessi del file aggiornamentodatabase.php mantenendo a 755 quelli di studenti.xml ma mi ha dato errore interno del server:
QUALCUNO SA COSA STO SBAGLIANDO!?
colgo anche l'occasione per fare un'altra domanda:
dove vedo i log di errore su un server linux di aruba?
grazie mille a tutti!
:D
Ho fatto un'ulteriore prova e, secondo me, mi sto avvicinando alla soluzione...
ho provato a mettere:
$destination_file = "ftp://utente@aruba.it:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml";
$source_file = "ftp://utentegestionale:passgestionale@www.gestionale.it/studenti.xml";
quindi, sempre secondo me, devo capire il modo di dirgli che il file va sovrascritto e il gioco è fatto!
ditemi che è cosi!!!
e magari ditemi anche come fare...
:P
Sposto.
La tua domanda mi pare sia quella di RECUPERARE un file da FTP e salvarla in locale, andando poi a modificare il file locale e caricandolo nel DB, corretto? Se si, il codice iniziale mi pare che prenda il file locale e cerchi di sovrascrivere quello remoto, mi sbaglio? Tra l'altro stai passando come path del file uno stream wrapper (HTTP) che non permette la scrittura (a meno che non hai installato e configurato WebDav con autenticazione), quindi presumo che il problema sia nei path che stai usando, corretti i path dovrebbe essere tutto ok ;)
Per quanto riguarda i path dell'FTP ti consiglio di loggarti con un client "manipolabile" (es: Filezilla) e vedere quale è il path del tuo file remoto, potrebbe essere che devi indicare il path assoluto o meno, in base alla configurazione del server FTP.
Ciao
Marco
--
My blog
Working at @agavee
praticamente io prendo il file studenti.xml dal server del gestionale e lo devo spostare sul mio server (dove c'è già un file studenti.xml che deve essere sovrascritto) le altre operazioni che devo fare sono già apposto.
Ora provo a vedere i path...
grazie della risposta!
:D
Ho provato cambiando i path ed il codice è questo:
//RECUPERO IL FOGLIO XML DAL SERVER FTP
ma ho sempre il solito errore:
avete in mente qualcos'altro che protrei sbagliare?
Il problema è che la funzione
ftp_get()
non può fare quello che stai tentando tu. Oppura stai sbagliando l'utilizzo della funzione.Sia le parametri della funzione, sia l'esempio su php.net indicano che la funzione accetta una sola conessione, specificando due percorsi.
Ma tu stai cercando di usare due connessioni.
Allora, (secondo me, ma posso sbagliare) o devi cercare una funzione diverse, o devi fare due passaggi; dal remoto A in locale, e poi da locale in remoto B. Altrimenti fai girare il codice sul server che deve ricevere il file, quindi diventa locale e deve solo prendere il file da remoto A.
HTH
John
Più imparo, più dubito.
esatto...
penso che la soluzione giusta sia la seconda.
Ho caricato il mio script sul server che deve ricevere il file, faccio la connessione sul server origine e carico il file.
Il codice che ho usato è questo:
/* Connessione al server ftp per il recupero del file studenti.xml*/
$ftp_host = 'www.nomeorigine.it';
$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
/* login al server ftp */
$username = 'utente';
$pwd = 'password';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
$destination_file = "ftp://nomearuba@aruba.it:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml";
$source_file = "ftp://utente:password@www.nomeorigine.it/studenti.xml";
if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");
come potete vedere dal codice ho fatto un controllo sull'esistenza del file origine (che comunque sono sicuro che esiste), inoltre prima di questo pezzo di codice ho fatto in modo che il file studente.xml sul mio server venisse cancellato per evitare problemi di permessi.
Comunque lo script mi da questo errore:
inizio
ciao
ftp://utente:password@www.nomeorigine.it/studenti.xml esiste
Warning: ftp_get(): Failed to open file. in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 47 Errore durante il recupero del file dal server ftp
la riga 47 è quella che ha il ftp_get()...
Come ho detto nel primo post di questo thread, la tua
$destination_file
deve riferire al file system del server, non una connessione FTP - che fra l'altro non l'hai neanche creato.Prima abbiamo provato con
/aggiornamento/studenti.xml
ed anche/studenti.xml
, ma dava errore, quindi prova:./studenti.xml
e se quello fallisce, con
studenti.xml
(come l'esempio in php.net)
Ovviamente bisogna controllare che
/web/htdocs/www.miosito.it/home/aggiornamento[/codefilter_code] ha i permessi giusti per scrivere dei file, per l'utenza che fa girare Drupal.
Fateci sapere...
Più imparo, più dubito.
Ho ricominciato e fatto diverse prove perchè stavo cominciando a perdere il lume della ragione.
Il codice è questo:
<?php
/* Recupero del file studenti.xml nuovo e inserimento nel server*/
/* login al server ftp */
$username = 'utente_remoto'; //l'utente sul server remoto sul quale vado a prendere il file nuovo
$pwd = 'password_remoto'; //la password sul server remoto sul quale vado a prendere il file nuovo
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
$destination_file = <---qua vado a inseire i valori sui quali ho fatto le varie prove
$source_file = "<a href="ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml";
if" rel="nofollow">ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml";
if</a> (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
if (file_exists($destination_file)) {print $destination_file." esiste<br/>";}
else {echo $destination_file.' does not exist<br/>';}
ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");
/* chiusura connessione al server ftp */
ftp_quit($connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
?>
e queste sono i risultati che ho ottenuto in base a ciò che ho messo in $destination_file:
1)La prova con http://www.miosito.it/aggiornamento/studenti.xml mi ha dato questo risultato
ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml esiste
http://www.miosito.it/aggiornamento/studenti.xml does not exist
Warning: ftp_get(http://www.miosito.it/aggiornamento/studenti.xml): failed to open stream: HTTP wrapper does not support writeable connections in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 18 Warning: ftp_get(): Error opening http://www.miosito.it/aggiornamento/studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 18 Errore durante il recupero del file dal server ftp
2)La prova con /aggiornamento/studenti.xml mi ha dato questo risultato
ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml esiste
/aggiornamento/studenti.xml does not exist
Warning: ftp_get(/aggiornamento/studenti.xml): failed to open stream: No such file or directory in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Warning: ftp_get(): Error opening /aggiornamento/studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp
3)La prova con /studenti.xml mi ha dato questo risultato
ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml esiste
/studenti.xml does not exist
Warning: ftp_get(/studenti.xml): failed to open stream: Permission denied in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Warning: ftp_get(): Error opening /studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp
4)La prova con./studenti.xml mi ha dato questo risultato
ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml esiste
./studenti.xml esiste
Warning: ftp_get(): Failed to open file. in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp
5)La prova con studenti.xml mi ha dato questo risultato
ftp://utente_remoto:password_remoto@www.server_remoto.it/studenti.xml esiste
studenti.xml does not exist
Warning: ftp_get(): Failed to open file. in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp
Poichè solo la prova numero 4 (./studenti.xml) sembra dire che il file esiste penso che sia quella alla quale dedicare maggiore attenzione.
secondo voi che cosa non torna?
ps:
Come faccio questa verifica?
Potrebbe essere proprio questo il problema!
:D
grazie dell'aiuto!!!
e scusate se ho scritto un poema...
:P
Meglio la poesia, più informazione che dai, più facile trovare la soluzione...
Mi sa che ti stai creando confusione. Il codice che hai pubblicato nel post originale era più corretto.
Il confusione sta nella connessione FTP. Devi fare tre cose:
1. Creare la connessione (qui quel codice manca)
2. Con la connessione, fare il login (e questo va bene)
3. Estrare il file, che prima si chiamava
file.xml
Una volta connesso e loggato (come per un qualunque cliente FTP), il server FTP va ad un indirizzo - questo è di solito lo home. Per accedere ad un file, è sufficiente specificare il percorso dal home - ma tu ti sei messo ad aggiungere utente/password@server.it - creando un altro connessione. Non credo che questo sia necessario - lo so, lo so, funziona, ma probabilmente funziona usando un percorso più semplice.
Per quanto riguarda le tue prove:
1. Insisti? Perchè chiamare te stesso tramite http? Il codice sta già girando su quel server...
2. Dice "No such file or directory" - probabilmente non c'è l'indirizzo, il file non dovrebbe esistere la prima volta.
3. Non hai i permessi corretti per aprire (cioè creare) il file.
4. Perchè il file esiste? Forse non hai cancellato i file dopo ogni test?
5. Quale file? Secondo me quello sul server FTP. Possibilmente un firewall, allora proviamo il modo passivo.
Fateci sapere...
Più imparo, più dubito.
Hai proprio ragione, sto facendo confusione...
Comunque stamattina ho avuto un'illuminazione: ho pensato che a me non serve che scriva il file xml sul mio server ma basta che lo legga dal server del gestionale risparmiando il tempo necessario alla scrittura...
Ho preparato questo codice che verifica anche se il file sul gestionale esite o no...
<?php
/* Connessione al server ftp*/
$ftp_host = '<a href="http://www.server_gesionale.it';
" rel="nofollow">www.server_gesionale.it';
</a>$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
/* login al server ftp */
$username = 'user_gestionale';
$pwd = 'pass_gestionale';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
$source_file = "<a href="http://www.server_gestionale.it/studenti.xml";
" rel="nofollow">http://www.server_gestionale.it/studenti.xml";
</a> if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "<a href="ftp://www.server_gestionale.it/studenti.xml";
" rel="nofollow">ftp://www.server_gestionale.it/studenti.xml";
</a> if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "./studenti.xml";
if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "/studenti.xml";
if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "studenti.xml";
if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "<a href="ftp://user_gestionale@www.server_gestionale.it/studenti.xml";
" rel="nofollow">ftp://user_gestionale@www.server_gestionale.it/studenti.xml";
</a> if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "<a href="ftp://user_gestionale:pass_gestionale@www.server_gestionale.it/studenti.xml";
" rel="nofollow">ftp://user_gestionale:pass_gestionale@www.server_gestionale.it/studenti....</a> if (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
$source_file = "<a href="ftp://user_gestionale:pass_gestionale@www.server_gestionale.it/studenti.xml";
" rel="nofollow">ftp://user_gestionale:pass_gestionale@www.server_gestionale.it/studenti....</a> $xml = simplexml_load_file ($source_file);
echo "<h3>Studenti salvati nel file studenti.xml (".count($xml->studente).")</h3>";
foreach($xml->studente as $studente)
{
$id=$studente->ID;
print "id=".$id."<br/>";
}
?>
Però come si vede da questo risultato solo il percorso ftp contenente utente e pass risulta valido...
http://www.server_gestionale.it/studenti.xml does not exist
ftp://www.server_gestionale.it/studenti.xml does not exist
./studenti.xml does not exist
/studenti.xml does not exist
studenti.xml does not exist
ftp://user_gestionale@www.server_gestionale.it/studenti.xml does not exist
ftp://user_gestionale:pass_gestionale@www.server_gestionale.it/studenti.xml esiste
Warning: simplexml_load_file(): connect() failed: Connection timed out in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 34 Warning: simplexml_load_file(ftp://...@www.server_gestionale.it/studenti.xml): failed to open stream: FTP server reports RETR in /web/htdocs/www.tuscanyre.it/home/aggiornamento/provanuova.php on line 34 Warning: simplexml_load_file(): I/O warning : failed to load external entity "ftp://ex_1094_periodici:vb89ds23@www.ssd.it/immobili.xml" in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 34 Warning: simplexml_load_file(): I/O warning : failed to load external entity "ftp://utente@aruba.it:pass_aruba@ftp.miosito.it/www.miosito.it/aggiornamento/immobili.xml" in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 35
Immobili salvati nel file studenti.xml (0)
Warning: Invalid argument supplied for foreach() in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 37
Secondo voi cosa sto sbagliando?
ps: ora provo anche il codice che mi avevi suggerito te... non si sa mai! grazie mille!!!
:D