这个问题的一个解决方案可能不是建立从服务器 B 到服务器 A 上的 MySQL 数据库的直接连接,而是在服务器 A 上实现一个安全 API 以在本地运行所有数据库查询并让服务器 B 使用该 API运行查询。
例如,在服务器 A 上,您可以在 api.php 中保存类似于:
<?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 ));
然后在服务器 B 上,您可以使用类似于以下内容的方式启动查询:
<?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 ));
重要提示: 显然,这个实现不是生产就绪的,需要在验证检查、安全性(加密)、扩展 PDO 实现等领域进行一些重大改进等。此示例代码用于演示 API 概念。