致命错误:类';MongoDate';在使用mongodb php驱动程序1.1.2和php 7.0.2-L


Fatal error: Class 'MongoDate' not found when using mongodb php driver 1.1.2 and PHP 7.0.2 - Laravel 5.1

我正在尝试将MongoDB配置为在虚拟Ubuntu 14.04机器上使用我的Laravel 5.1 Homestead实例。我能够使用sudo pecl install mongodb成功安装支持PHP 7.0的MongoDB的最新版本(这对7.0是正确的,不再sudo pecl install mongo)。

然后,我在Ubuntu机器上的php.ini文件(全部三个)中添加了扩展名,每个文件都在:中

  • /etc/php/7.0/cli/php.ini
  • /etc/php/7.0/fpm/php.ini
  • /etc/php/7.0/cgi/php.ini

这是我写的扩展,适用于PHP 7.0:

  • extension=mongodb.so(不再是mongo.so)

当我在浏览器中运行phpinfo()时,它表明MongoDB已经用我的PHP 7.0正确配置。

如果MongoDB配置正确,我怎么会一直得到:

Fatal error: Class 'MongoDate' not found

当我尝试用php artisan migrate:refresh --seed运行迁移和种子时?

我已经试过了:

  • 使用vagrant reloadvagrant reload --provision重新启动Ubuntu计算机
  • sudo service nginx restartsudo service php7.0-fpm restart重新启动PHP和Nginx

两者都不起作用。

正如您所提到的,您正在为PHP7使用新的Mongo扩展。

类名已从旧版本更改,即

MongoClient现在是MongoDB'Driver'Manager

MongoDate现在是MongoDB'BSON'UTCDateTime

我不确定一切向后兼容的程度,但这应该让你开始!

在整个应用程序中,我们定期将unix时间戳转换为MongoDate实例。示例:

new MongoDate(strtotime('-1 day'));

因此,我创建了一个类,允许在unix时间戳和新的MongoDB'BSON'UTCDateTime之间进行转换,并返回

<?php
class MongoHelper {
    const SECONDS_IN_A_MILLISECOND = 1000;
    public static function getMongoUTCDateTimeFromUnixTimestamp($timestamp) {
        return new 'MongoDB'BSON'UTCDateTime(intval($timestamp * self::SECONDS_IN_A_MILLISECOND));
    }
    public static function getUnixTimestampFromMongoUTCDateTime('MongoDB'BSON'UTCDateTime $utc_date_time) {
        return intval((string) $utc_date_time / self::SECONDS_IN_A_MILLISECOND);
    }
}

示例用法:

MongoHelper::getMongoUTCDateTimeFromUnixTimestamp(strtotime('-1 day'));