Jednym z rozwiązań tego problemu może być raczej ustanowienie bezpośredniego połączenia z serwera B do bazy danych MySQL na serwerze A, aby zaimplementować bezpieczny interfejs API na serwerze A, aby uruchomić wszystkie zapytania do bazy danych lokalnie i aby serwer B korzystał z interfejsu API do uruchamiania zapytań.
Na przykład na serwerze A mogłeś zapisane w api.php
coś podobnego do:
<?php
/* Configuration */
define('DB_HOSTNAME', '127.0.0.1');
define('DB_USERNAME', 'dbuser');
define('DB_PASSWORD', 'dbpass');
define('DB_DATABASE', 'dbname');
/* Process JSON request */
$aRequest = (array)json_decode(file_get_contents("php://input"));
if(isset($aRequest['query']) && isset($aRequest['params'])) {
/* Connect to database and run requested query */
try {
$oPDO = new PDO(sprintf('mysql:host=%s;dbname=%s', DB_HOSTNAME, DB_DATABASE),
DB_USERNAME, DB_PASSWORD);
$oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$hStatement = $oPDO->prepare((string)$aRequest['query']);
$hStatement->setFetchMode(PDO::FETCH_ASSOC);
$hStatement->execute((array)$aRequest['params']);
$aResponse = array('success' => true, 'data' => (array)$hStatement->fetchAll());
} catch(PDOException $oError) {
$aResponse = array('success' => false, 'error' => (string)$oError->errorInfo[2]);
}
} else {
$aResponse = array('success' => false, 'error' => 'Invalid request');
}
/* Process JSON response */
header('Content-Type: application/json');
echo(json_encode($aResponse));
A potem na serwerze B można uruchomić zapytania używając coś podobnego do:
<?php
/* Configuration */
define('PATH_API', 'http://118.140.84.78/api.php');
class RemotePDO {
private $sURL = '';
function __construct($sURL) {
$this->sURL = $sURL;
}
function exec($sQuery, $aParams) {
$sRequest = json_encode(array('query' => $sQuery, 'params' => $aParams));
$aHttpOptions = array('http' => array('header' =>
"Content-Type: application/json", 'method' => 'POST', 'content' => $sRequest));
$oHttpContext = stream_context_create($aHttpOptions);
return json_decode(@file_get_contents($this->sURL, false, $oHttpContext));
}
}
/* Testing */
$sSQL = "SELECT * FROM orders WHERE order_id=:order_id";
$aParams = array(':order_id' => 1);
$oRemotePDO = new RemotePDO(PATH_API);
print_r($oRemotePDO->exec($sSQL, $aParams));
Ważna uwaga: Oczywiście ta implementacja nie jest gotowa do produkcji i wymagałaby znacznej poprawy w obszarach takich jak ecking, bezpieczeństwo (szyfrowanie), rozszerzenie implementacji PDO itd. Ten przykładowy kod jest dostarczony w celu zademonstrowania koncepcji interfejsu API.
Może być [problem z zaporą ogniową] (http://stackoverflow.com/questions/5755819/lost-connection-to-mysql-server-at-reading-initial-communication- pack-syste). –
Czy połączenie w tym IP jest otwarte, to znaczy, że nie ma problemu w tym IP. Sprawdź go raz – Nehal
może to być port, do którego chcesz nawiązać połączenie. Możesz ustawić port w PDO w ten sposób: '$ pdo = new PDO ('mysql: host = 118.140.84.78, port = $ newPortNumber, dbname = $ dbname', '$ username', '$ password');' –