PHP: MySQL-Daten von einen Server auf dem anderen bekommen – ohne direkten SQL Zugriff

Für ein Neues Projekt muss ich von meinem Root-Server auf die Daten eines Kunden zugreifen, welche in einer eine MySQL-Datenbank bei 1und1 liegen.
Das Problem hierbei ist, dass man nur von dem Webspace-Paket auf die Datenbank zugreifen kann, zu dem diese auch gehört.
Getestet habe ich es mit meinem Root-Server, welcher bei 1und1 steht und auch mit einem anderen Webspace-Paket bei 1und1 – funktioniert einfach nicht.

Da ich diese Daten aber trotzdem zwingend brauche, habe ich mich entschlossen eine kleine PHP-SQL-Bridge zu schreiben.

Der Sinn dahinter ist folgender:
Auf Server 1 liegt eine server.php, welche Anfragen von Server 2 entgegen nimmt und damit in der Datenbank sucht. Das Ergebnis bekommt die client.php wiederum als Serialisiertes Ergebnis zurück, damit kann man auf dem Server 2 dann weiter arbeiten.

Die Client.php könnte dann so aussehen:

1
2
3
4
5
6
7
<?php
include("PHPSQLBridge.php");
 
$PHPSQLBridge = new PHPSQLBridge("http://localhost/test/sqlbridge/server.php");
$array = $PHPSQLBridge->client("SELECT * FROM test");
print_r($array);
?>

Und Passend dazu die server.php:

1
2
3
4
5
6
7
8
9
10
11
<?php
include("PHPSQLBridge.php");
 
$PHPSQLBridge = new PHPSQLBridge();
$PHPSQLBridge->host = "localhost";
$PHPSQLBridge->user = "root";
$PHPSQLBridge->passwd = "master";
$PHPSQLBridge->database = "test";
 
$PHPSQLBridge->server();
?>

Und hier noch der Code der PHPSQLBridge.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
/*
-------------------------------------------------------------------------
Server:
-------------------------------------------------------------------------
include("PHPSQLBridge.php");
$PHPSQLBridge = new PHPSQLBridge();
$PHPSQLBridge->host = "localhost";
$PHPSQLBridge->user = "root";
$PHPSQLBridge->passwd = "";
$PHPSQLBridge->database = "test";
 
$PHPSQLBridge->server();
 
-------------------------------------------------------------------------
Cleint:
-------------------------------------------------------------------------
include("PHPSQLBridge.php");
$PHPSQLBridge = new PHPSQLBridge("http://localhost/test/sqlbridge/server.php");
$array = $PHPSQLBridge->client("SELECT * FROM test3");
 
print_r($array);
-------------------------------------------------------------------------
*/
 
class PHPSQLBridge
{
    public $host = "";
	public $user = "";
	public $passwd = "";
	public $database = "";
 
	public $Serialisierung = "PHP"; // "PHP" oder "JSON"
 
	private $ServerURL;
 
	public function __construct($ServerURL="") 
	{
		$this->ServerURL = $ServerURL;
    }
 
    public function server()
	{
		mysql_connect($this->host,$this->user,$this->passwd);
 
		mysql_select_db($this->database);
 
		if(!empty($_GET['qry']))
		{
			$qry = base64_decode($_GET['qry']);
		}
		else
		{
			$qry = "SHOW VARIABLES LIKE '%version%';";
		}
 
		$res = mysql_query($qry);
 
		while($array[]=mysql_fetch_array($res));
 
		if($this->Serialisierung=="PHP")
		{	
			echo serialize($array);
		}
 
		if($this->Serialisierung=="JSON")
		{	
			echo json_encode($array);
		}
	}
 
	public function client($qry)
	{
		$inhalt = file_get_contents($this->ServerURL."?qry=".base64_encode($qry)."");
 
		if($this->Serialisierung=="PHP")
		{	
			return unserialize($inhalt);
		}
 
		if($this->Serialisierung=="JSON")
		{	
			return json_decode($inhalt);
		}
	} 
}
?>

Das ganze ist auch im Googe-Code SVN-Repository zu finden:
http://code.google.com/p/frickelblog/source/browse/trunk/samples/PHP/20111107_PHPSQLBridge/

7 Responses to PHP: MySQL-Daten von einen Server auf dem anderen bekommen – ohne direkten SQL Zugriff

  1.  

    Hallo Sven,

    vielen Dank für das super Beispiel.

    Ich habe noch folgende Frage:
    Welche Datenmengen können über dieses System übertragen werden?
    Ich benötige hier zwischen 32k – 64k als reinen Text, also keine Binärdaten.

    Danke und guten Start ins neue Jahr
    Alex

  2. Hi Alex,
    theoretisch und praktisch können darüber auch mehrere MB an Daten übertragen werden.
    Das Maximum wird der RAM sein, der auf beiden Seiten für das verarbeiten der PHP Files (Serialisiertes Ausgeben / Serialisiertes einlesen) eingestellt ist.
    Binärdaten können auf dem selben weg übertragen werden.

    Allerdings sollte man sich für den Produktiveinsatz für deses Script noch diverse Möglichkeiten der Absicherung ausdenken.
    Es sind ja direkte SQL Befehle die dort ausgeführt werden.
    Ein „DROP TABLE“ würde genauso funktionieren wie ein „DELETE FROM“ – wäre schade um die Daten 🙂

     
  3.  

    @Sven

    Hoi Sven,

    das ist ja schonmal eine gute Ausgangsposition. 🙂
    Ich denke die zweite Hürde wäre die Laufdauer eines Scriptes, PHP hat doch immer noch die 30 Sekunden per Default. Aber auch OK, dass kann man ändern.

    Das beim Transport übers Internet eine Absicherung in Form einer Anmeldung und Verschlüsselung rein muss ist eh klar.

    Ich bin von deiner grundlegenden Idee immer noch begeistert.
    Über was man halt so per Zufall stolpert. 🙂

    MfG und nochmals danke
    Alex

  4. Ich weiß nicht was du für Daten dort hin und her Schieben magst – aber 30sec sind für eine SQL-Abfrage doch schon einiges an Zeit?!

    Hast du vielleicht ein Beispiel-Szenario um deine Gedanken nachverfolgen zu können?

     
  5.  

    Hoi Sven,

    wenn alles funktioniert ist die Idee folgendes:
    Anbindung einer hausinternen Software an einen externen Webserver.

    Der Timeout kommt dann eher durch die langsame DSL-Leitung beim Transport größerer binärer Daten. Es gibt tatsächlich noch Gegenden mit lahmen Anschlüssen. Macht aber nix, dann jedes Insert/Update/usw. als einzelnen Aufruf.

    Ich schau mal, wie ich deine Idee einbauen/umbauen/erweitern kann. Wenn das OK ist, bekommst du meine Ergebnisse per Email.

    Wir lesen uns
    Alex

  6. Klingt Spannend…
    Ich würde sowas denke ich jedoch über einen HTTP/FTP Upload der Binären Daten als JSON bzw BSON auf dem Webserver realisieren und aus selbigen die Auswertung der Daten über einen CronJob laufen lassen (sofern bei dem Hoster möglich).

    Hängt am Ende aber auch am 30 Sec Timeout – nur das Upload der Daten und das verarbeiten selbiger in 2 getrennte Prozesse aufgeteilt wäre.

     
  7. Ahso – was ich eigentlich schreiben wollte:
    Drück lieber mal auf meinen Paypal Knopf 😀

     

leave your comment


*

Unterstütze den Frickelblog!