首页 > 解决方案 > 从辅助 PHP 文件获取数据/从辅助 PHP 文件获取数据 - 适用于某些数据,而不适用于其他数据

问题描述

我有一个使用 PHP 调用连接到 MongoDB 的 SPA (react)。

效果很好。

但是,由于“规则”,我需要从不同的服务器提供 javascript 文件——该服务器既不支持 MongoDB 也不支持 MongoDB php 客户端。我们称这个服务器为 SERVER_A。

我们将托管 MongoDB PHP 客户端和 MongoDB 的服务器称为 SERVER_B。(“B”代表“后端”... :))

我相信,解决方案是在 SERVER_A 上构建一个 php“中间人”,将数据简单地传递到 SERVER_B。研究表明,这file_get_contents是实现此目的的工具。

所以我把我原来的已知工作 PHP 文件,我把它放在 SERVER_B 上并将它重命名为“mongoPatch_backend.php”。

<?php
$user = "xxxx";
$pwd = 'xxx';
$filter = [];

if (isset($_REQUEST['needleKey'])) {
    $needleKey = $_REQUEST['needleKey'];
    $needle = $_REQUEST['needle'];
    $filter = [$needleKey => $needle];
} 

$newData = $_REQUEST['newData'];

$filter = ['x' => ['$gt' => 1]];
$options = [
    'projection' => ['_id' => 0],
    'sort' => ['x' => -1],
];

$bson = MongoDB\BSON\fromJSON($newData);
$value = MongoDB\BSON\toPHP($bson);

$manager = new MongoDB\Driver\Manager("mongodb://${user}:${pwd}@SERVER_B:27017");


$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    [$needleKey => $needle],
    ['$set' => $value],
    ['multi' => false, 'upsert' => true]
);

$results = $manager->executeBulkWrite('sedwe.users', $bulk);

var_dump($results);
?>

然后在 SERVER_A 上创建一个新文件 dbPatch.php,如下所示:

<?php
$API = "https://SERVER_B/php/mongoPatch_backend.php?";

if (isset($_REQUEST['needleKey'])) {
    $needleKey = $_REQUEST['needleKey'];
    $needle = $_REQUEST['needle'];
    $filter = [$needleKey => $needle];
} 

$newData = $_REQUEST['newData'];

$postData = "needleKey=".urlencode($needleKey);
$postData .= "&needle=".urlencode($needle);
$postData .= "&newData=".urlencode($newData);

// echo $API.$postData;
$data = file_get_contents($API.$postData);

echo $data;
?>

但是当我调用它时,我没有从 $data 中得到任何回显。

知道为什么吗?请记住,直接对 mongoPatch_backend.php 的完全相同的调用工作得很好(但它是一个 CORS 调用,所以它不是一个有效的选项)。

所以这是我尝试过的:

首先,为了确保我的 AJAX 调用仍然有效,我将响应吐出到控制台。我什么都得不到。所以我将中间人(dbPatch.php)的最后一行更改为,echo "Hello World"而不是echo $data按预期在控制台上收到“Hello World”。

接下来,我将中间人(dbPatch.php)的最后一行改回echo $data并尝试将“后端”简化为一个简单的<?php echo "Hello Back World"; ?>并且在控制台上什么也没有。

接下来,我在浏览器中访问https://SERVER_B/php/mongoPatch_backend.php ......我在浏览器中看到了“Hello Back World”。

...这让我相信从服务器到服务器的信息传输出现了问题。逻辑调用,嗯?

不幸的是,当我只使用“获取”命令尝试相同的事情时,它工作得非常好:

这是我在 SERVER_A 上的“中间人”(dbFetch.php)脚本:

<?php
$API = "https://SERVER_B/php/mongoFetch_backend.php?";

$collection = $_REQUEST['collection'];
$postData = "collection=".urlencode($collection);

$needleID = $_REQUEST['needleID'];
$postData .= "&needleID=".urlencode($needleID);

$data = file_get_contents($API.$postData);

echo $data;
?>

这是后端的文件,SERVER_B:

<?php

$user = "xxxx";
$pwd = 'xxxx';
$filter = [];

if (isset($_REQUEST['needleID'])) {
    $needleID = $_REQUEST['needleID'];
    $filter = ['id'=> $needleID];
} 

if (isset($_REQUEST['collection'])) {
    $collection = $_REQUEST['collection'];
} 

//Manager Class
$connection = new MongoDB\Driver\Manager("mongodb://${user}:${pwd}@SERVER_B:27017");

// Query Class
$query = new MongoDB\Driver\Query($filter);

$rows = $connection->executeQuery("db_name.$collection", $query);

// Convert rows to Array and send result back to client
$rowsArr = $rows->toArray();
echo json_encode($rowsArr);
?>

Huzzah,这行得通!...这也证明服务器到服务器的通信似乎没有问题。

所以回到零地。

然后我使用一个非常简单的newData值——更短,但总体布局相同——字符串化 json。有用!数据最终进入数据库。

所以我不得不认为其中的数据有问题newData (只有几百行这样的字符串化 JSON:。encodeURIComponent(JSON.stringify(newData))但是,这需要重复:如果我跳过中间人,这将有效。

……这让我不知所措。PHP 不是我理解的东西...你能帮忙吗?

编辑回答评论:当我直接在 SERVER_B 上调用 mongoPatch_backend.php 时,它可以工作(如上所述)。我让它回显$newData它并吐出一个字符串化的 JSON 版本的变量(不是 URL 编码的)。当我调用 dbPatch.php 时,它没有给我任何从 mongoPatch_backend 传回的东西。正如我在 OP 中所说,如果我将 mongoPatch_backend.php 修改为除了 echo "hellow world" 之外什么都不做,我仍然无法在通过上述 dbPatch.php 文件调用它时将其记录到控制台。

编辑:我还尝试将两个 PHP 文件放在同一台服务器上并得到相同的结果。(即:dbPatch.php 和 mongoPatch.php 文件都在同一服务器上的同一目录中)

EDIT2:我从中间人那里做了一个 var_dump,我得到了标准的人类可读的字符串化文本。我var_dump($_REQUEST['newData']);在后端文件中做同样的事情,但我什么也没得到。

标签: phpmongodb

解决方案


推荐阅读