php - 从辅助 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']);
在后端文件中做同样的事情,但我什么也没得到。
解决方案
推荐阅读
- excel - MS-ACCESS 调用 Excel 函数中位数
- html - Vue.js | webpack:无法将“assets”文件夹中的图像加载到“vue components”中
- .net - 防止错误无法在某些服务器上创建 SSL/TLS 安全通道
- asp.net - 我们可以使用“dotnet run”在没有项目文件且仅使用二进制文件的情况下运行 ASPnet Core 应用程序吗
- javascript - Material UI - 错误:使用 create-react-library + MUI 的挂钩调用无效
- java - 自定义操作实施 Magnolia CMS
- arrays - 如何让猫鼬将一组 url 推送到数组子文档
- angular - 离子 - amcharts4 - 对象原型可能只是一个对象或空:未定义
- terraform - Lambda 资源中变量引用的 Terraform 错误,甚至不会被创建
- java - 如何使用 JOptionPane 创建菜单