Class "MongoDB\Driver\Manager" 随后调用时未找到
Class "MongoDB\\Driver\\Manager" not found when called subsequently
所以我得到了这个小的 webhook 端点,它使用 JSON 数据调用,然后将此数据存储到远程 MongoDB Atlas 数据库中。
除了数据库执行之外,一切都在本地发生。
- 环境:Ubuntu 20.04.2 LTS
- 服务:Apache2
- PHP: 8.0.3
- MongoDB: 1.8.0 // 通过 composer 安装,在 composer.json 中需要,在 php.ini[=55= 中启用扩展]
为了模拟这些请求,我在本地构建了一个 PHP 脚本 sender.php
,它通过 curls 向我本地安装的网络服务器发送一个 POST 请求到我的接收文件 listener.php
.
当我直接执行 listener.php
时它工作正常,所有数据都通过并写入远程 MongoDB Atlas 数据库。
但是当它从我的 webhook 文件 sender.php
中调用时,我收到以下错误:
PHP Fatal error: Uncaught Error: Class "MongoDB\Driver\Manager" not found
这是最基本的代码文件,我可以用它重现错误。
composer.json
{
"require": {
"mongodb/mongodb": "^1.8"
}
}
sender.php
$url = "http://localhost/listener.php";
$data = array(
"id" => "12345",
"title" => "Test",
"status" => "updated"
);
$ch = curl_init($url);
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
listener.php
require 'vendor/autoload.php';
$incomingWebhookData = json_decode(file_get_contents('php://input'));
function submitToDb($database, $collection, $data)
{
$manager = new MongoDB\Driver\Manager(
'mongodb+srv://<user_placeholder>:<password_placeholder>@<cluster_placeholder>.mongodb.net/?retryWrites=true&w=majority'
);
$bulk = new MongoDB\Driver\BulkWrite;
$doc = [
"_id" => new MongoDB\BSON\ObjectID,
"data_id" => $data->id,
"title" => $data->title,
"status" => $data->status,
];
$bulk->insert($doc);
$manager->executeBulkWrite($database . "." . $collection, $bulk);
}
$database = "webhook_data";
$collection = "internal";
submitToDb($database, $collection, $incomingWebhookData);
- 我已经尝试在
listener.php
中为 MongoDB Class 命名空间 -> 同样的事情
- 重新启动所有服务,转储自动加载,从头开始重新安装所有内容 -> 同样的事情
我错过了什么全球性的灾难?
感谢您的宝贵时间和帮助
事实证明,我的本地网络服务器 (Apache2) 使用与我的开发环境不同的 PHP-CLI,因此一旦请求被解析到网络服务器,所有启用的扩展和配置都没有效果。
使用 docker 个孩子。
所以我得到了这个小的 webhook 端点,它使用 JSON 数据调用,然后将此数据存储到远程 MongoDB Atlas 数据库中。 除了数据库执行之外,一切都在本地发生。
- 环境:Ubuntu 20.04.2 LTS
- 服务:Apache2
- PHP: 8.0.3
- MongoDB: 1.8.0 // 通过 composer 安装,在 composer.json 中需要,在 php.ini[=55= 中启用扩展]
为了模拟这些请求,我在本地构建了一个 PHP 脚本 sender.php
,它通过 curls 向我本地安装的网络服务器发送一个 POST 请求到我的接收文件 listener.php
.
当我直接执行 listener.php
时它工作正常,所有数据都通过并写入远程 MongoDB Atlas 数据库。
但是当它从我的 webhook 文件 sender.php
中调用时,我收到以下错误:
PHP Fatal error: Uncaught Error: Class "MongoDB\Driver\Manager" not found
这是最基本的代码文件,我可以用它重现错误。
composer.json
{
"require": {
"mongodb/mongodb": "^1.8"
}
}
sender.php
$url = "http://localhost/listener.php";
$data = array(
"id" => "12345",
"title" => "Test",
"status" => "updated"
);
$ch = curl_init($url);
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
listener.php
require 'vendor/autoload.php';
$incomingWebhookData = json_decode(file_get_contents('php://input'));
function submitToDb($database, $collection, $data)
{
$manager = new MongoDB\Driver\Manager(
'mongodb+srv://<user_placeholder>:<password_placeholder>@<cluster_placeholder>.mongodb.net/?retryWrites=true&w=majority'
);
$bulk = new MongoDB\Driver\BulkWrite;
$doc = [
"_id" => new MongoDB\BSON\ObjectID,
"data_id" => $data->id,
"title" => $data->title,
"status" => $data->status,
];
$bulk->insert($doc);
$manager->executeBulkWrite($database . "." . $collection, $bulk);
}
$database = "webhook_data";
$collection = "internal";
submitToDb($database, $collection, $incomingWebhookData);
- 我已经尝试在
listener.php
中为 MongoDB Class 命名空间 -> 同样的事情 - 重新启动所有服务,转储自动加载,从头开始重新安装所有内容 -> 同样的事情
我错过了什么全球性的灾难?
感谢您的宝贵时间和帮助
事实证明,我的本地网络服务器 (Apache2) 使用与我的开发环境不同的 PHP-CLI,因此一旦请求被解析到网络服务器,所有启用的扩展和配置都没有效果。
使用 docker 个孩子。