Php problem s komunikaciou

Programovacie jazyky, rady, poradňa...
jojko001
Amateur
Amateur
Príspevky: 19
Registrovaný: 23 okt 2006, 8:44

Php problem s komunikaciou

Príspevok od používateľa jojko001 »

Please help me, som v koncoch. Potrebujem spravit v php komunikaciu medzi dvoma serverami, cize klient - server. Chcel by som to spravit cez XML-RPC ale dako sa mi to nedari rozbehat, potreboval by som priklad ako ma vyzerat server aj klient - aspon ukazka. Som si stiahol aj neaku triedu RPC pre php, ale dako mi to nejde. Prosim Vas dajte aspon daky odkaz jak na to, bo jak by ste riesili tu ... komunikaciu???
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Chceš komunikovať klient-php -> server-php? Alebo má byť php iba na servri?
jojko001
Amateur
Amateur
Príspevky: 19
Registrovaný: 23 okt 2006, 8:44

Príspevok od používateľa jojko001 »

Takze klient aj server su v php. Ide o to, ze potrebujem spravit nieco taketo: Niekto ma na svojom webe (servery) umiestneny napr. CMS a z ineho servera sa budu stahovat aktualizacie pre dany CMS. Ide len o to, ze ked dany klient si bude chciet dane CMS aktualizovat, tak sa musi overit jeho seriove cislo v hlavnom servery - to potrebujem vyriesit, cize potrebujem, aby prebehla komunikacia medzi dvoma serverami a hlavny server mi posle odpoved, ci sa moze stahovat. Na webe som nasiel nieco, ze sa da pouzit na komunikaciu medzi dvoma serverami XML-RPC, alebo SOAP... len neviem jak na to ???
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ta komunikáciu by sa dala použiť funkcia fsockopen. Pomocou nej nadviažeme spojenie s druhým serverom (pomocou klasického http protokolu). Samozrejme treba urobiť nejaké zabezpečenie.
Vyskúšal som urobiť nejaké skripty a pridal som tam aj jednoduché zabezpečenie (možno by sa to dalo upraviť tak, aby každý server mal svoj tajný reťazec, aby sa dali na hlavnom servri zablokovať oddelene).

Toto prvé ulož ako check-update.php

Kód: Vybrať všetko

<?php

$salt = "pomocny retazec";	// tajny retazec (v oboch skriptoch musi byt rovnaky)

$id = isset($_POST['id']) ? $_POST['id'] : "";
$pwd = isset($_POST['pwd']) ? $_POST['pwd'] : "";

if ($id === "3141529") {
	$result = md5("$salt$pwd");
} else {
	$result = "BAD";
}

print("result=$result");
?>
Toto druhe ako check.php

Kód: Vybrať všetko

<?php

function check_user($id)
{
	$host = "localhost";		// toto bude treba upravit na adresu toho skriptu na overovanie (napr. www.pocitac.sk)
	$port = 80;
	$path = "/check-update.php";	// toto treba upravit na cestu+meno
	$salt = "pomocny retazec";	// tajny retazec (v oboch skriptoch musi byt rovnaky)

	$result = false;
	$pwd = $random = strtolower(MD5(date("MdHis")));
	$formdata = array("id" => $id,
			"pwd" => $pwd);
	$poststring = "";
	foreach($formdata AS $key => $val){
		$poststring .= urlencode($key) . "=" . urlencode($val) . "&";
	}
	$poststring = substr($poststring, 0, -1);

	$fp = fsockopen("". $host, $port, $errno, $errstr, $timeout = 30);

	if (!$fp) {
		echo "$errstr ($errno)\n";
	} else {
		fputs($fp, "POST $path HTTP/1.1\r\n");
		fputs($fp, "Host: $host\r\n");
		fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
		fputs($fp, "Content-length: ".strlen($poststring)."\r\n");
		fputs($fp, "Connection: close\r\n\r\n");
		fputs($fp, $poststring . "\r\n\r\n");

		$response_ok = false;
		do {
			$response = fgets($fp, 1024);
			$response_ok = $response_ok || substr_count($response, "200 OK") > 0;
		} while(!feof($fp) && $response != "\r\n");

		if ($response_ok) {
			do {
				$response = fgets($fp, 1024);
				if (preg_match('/result=([0-9a-f]{32})/', $response, $matches)) {
					$result = md5("$salt$pwd") === $matches[1];
					break;
				}
			} while(!feof($fp));
		}

		fclose($fp);
	}
	return $result;
}

if (check_user("3141529")) {
	echo "<b>Check:</b> OK";
} else {
	echo "<b>Check:</b> Error";
}
?>
Skús v tom skripte check.php zmeniť to číslo 3141529 na niečo iné (malo ba sa zobraziť chyba).
Napísať odpoveď