Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Sposób na wysyłanie danych przez fsockopen()
Forum PHP.pl > Forum > PHP
franki01
Witam,

Robię eksport danych pewnego sklepu. Do tej pory działał on [eksport] na tej zasadzie, że na jednym serwerze (w pliku export.php) został wygenerowany kod XML z baża danych tego sklepu (kategorie+przedmioty). Ten XML należało skopiować do textarea w pliku (import.php) na innym serwerze, a następnie z tego XML'a dane zostały wprowadzane do drugiej bazy danych.

Teraz chciałbym uprościć całą procedurę i zrobić to w ten sposób, że plik export.php wysyła już gotowy XML do pliku import.php, bez żadnych dodatkowych czynności administratora sklepu.

Na razie mam mniej więcej takie rozwiązanie:

  1. <?php
  2. # plik export.php
  3.  
  4. $fs = fsockopen('serwer.pl', 80, $errno, $errstr, 15);
  5. $req = "POST /import.php?auto=1 HTTP/1.1r\n"
  6. ."Host: serwer.plr\n"
  7. ."User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14r\n"
  8. ."Connection: closer\n"
  9. ."Content-type: application/x-www-form-urlencodedr\n"
  10. ."Content-length: ".strlen($xml)."r\n"
  11. ."r\n"
  12. .$xml;
  13. fwrite($req);
  14. fclose($fs);
  15. ?>


  1. <?php
  2. # plik import.php
  3. # i właśnie tutaj jak odebrać ten przesłany XML
  4. ?>


Chodzi głównie o to, jak w pliku import.php odebrać dane wysłane do tego pliku. Żaden element w tablicy $_SERVER w import.php nie zawiera tego XML'a. Być może w export.php też trzeba wprowadzić jakieś zmiany...

Mam nadzieję, że dość jasno opisałem problem smile.gif
webdice
Moim zdaniem strasznie kombinujesz. W pliku XML dodaj pole ostatniego generowania bazy. W pliku import.php, odczytujesz plik ze zdalnego serwera i wgrywasz go do bazy.
bim2
Jeśli zależy ci, że klikasz [Eksport] na danym serwerze, a nie na innym Import. To zrób tak:
Klikasz [Eksport] i skrypt robi coś na zasadzie:
  1. <?php
  2. $fs = fsockopen('serwer.pl', 80, $errno, $errstr, 15);
  3. $req = "GET /import.php HTTP/1.1r\n"
  4. ."Host: serwer.plr\n"
  5. ."User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14r\n"
  6. ."Connection: closer\n"
  7. ."Content-type: application/x-www-form-urlencodedr\n"
  8. ."Content-length: ".strlen($xml)."r\n"
  9. ."r\n"
  10. .$xml;
  11. fwrite($req);
  12. ?>


a plik import.php na serwerze innym:
$xml = file_get_contents('http://serwer1.pl/exkport_xml.php');

a w export_xml.php wyświetlasz poprostu te dane winksmiley.jpg
franki01
Kiedyś pamiętam, że widziałem jakiś przykład z takim działaniem. Chciałem zrobić to bez tworzenia nowych plików i odwoływania się do nich... Wiem, że jedna funkcja (lub zmienna) zawierała ten przesyłany string, tylko nie pamiętam jaka smile.gif

EDIT:
@bim2:
Takie sposoby to biorę jako ostateczność... Jednak, jeżeli nie będzie się dało nic zrobić, to będzie działało w ten sposób, że import.php będzie odwoływał się do export.php, a w export.php będzie dynamicznie tworzony ten XML bez dodatkowych plików. Bardziej mi zależy, żeby odwołanie było z export.php do import.php...
Kicok
Wypadałoby trochę poczytać o protokole HTTP.

Po pierwsze to metodą GET nic w ten sposób nie prześlesz. Z POST dobrze kombinowałeś, ale nie można do niego wrzucać danych jak leci. Struktura ma być mniej więcej taka:
Kod
POST /import.php HTTP/1.1
Host: serwer.com
Content-Type: application/x-www-form-urlencoded
Content-Lenght: 12345
Connection: close

zmienna1=abcde&zmienna2=jakies%20inne%20dane&zmienna3=123456
bim2
Nikt mnie chyba nie zrozumiał.

Chodziło mi o taką sytuację. Mamy serwer.pl (na nim chcemy kliknac eksport do serera1) i serwer1.pl (do tego maja zostac wyslane dane).

I teraz tak:
serwer.pl:
Klikamy [Eksport] - plik uruchamia serwer1.pl/import.php?addr=serwer1.pl/eksport_xml.php

serwer1.pl:
Został uruchomiony plik import.php, który pobiera dane
$xml = file_get_contents('http://'.$_GET['addr']);
file_put_contents('cache.xml', $xml);

Rozumiecie? Tak chyba będzie najprościej smile.gif Nie ma sensu kombinować z wysyłaniem czegoś, jeśli łatwiej to odebrać winksmiley.jpg
franki01
@kicok:
Właśnie się zacząłem zastanawiać, żeby zrobić to jednak w ten sposób... Chyba nie pozostaje mi nic innego.

import.php dostanie w zmiennej $_POST['data'] cały string i po sprawie...


PS Kilka osób podało dość dobre rozwiązanie, więc Was nagrodze biggrin.gif


EDIT:
@bim2
Wiem, że o to Ci chodziło, ale tutaj jest jedno niepotrzebne odwołanie, którego bym nie chciał. XML jest dość długi, więc oba serwery byłyby dość długo zajęte smile.gif
bim2
Ok, tylko pamiętaj, że maksymalna wielkość POST na większości serwerów to 8mb. Niby można zmienić w ustawieniach, ale zawsze.

Długo zajętę za pierwszym razem, mógłbyś dodać do tego cache i odwoływac się do pliku cache.xml winksmiley.jpg Wtedy nie byłoby problemu :] Tylko serwer1.pl zajęty byłby odczytywaniem tego. ;]
franki01
Wyżej uprościłem trochę sytuację. Naprawdę plik export.php znajduje się na serwerze za NATem. Na tym samym komputerze znajduje się baza danych pewnej firmy. Z zewnątrz nikt nie ma dostępu do tego serwera (oczywiście ze względów bezpieczeństwa). Dlatego odwołanie z import.php do export.php niezbyt wchodziłoby w grę. Chodziło o to, żeby z bazy tej firmy robić eksport do jego sklepu on-line. Dlatego najbardziej mi pasowało odwołanie z export.php... Również tworzenie dodatkowych plików nie pomogłoby przy takim czymś smile.gif
jacekl
Ja bym to zrobił przy użyciu mysqldump i mysql, tak jak np. tu:
http://www.daniweb.com/forums/thread83365.html#post402793

Możesz do tego użyć f-cji system, passthru lub exec. Na początku możesz mieć problemy z uruchomieniem (z uprawnieniami, ścieżkami a nawet konfiguracją PHP itp.), ale jest to chyba najłatwiejszy i najszybszy sposób osiągnięcia tego, czego Ci trzeba.

JL
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.