将PHP与Firebase数据库一起使用很慢

时间:2018-08-05 13:36:16

标签: php firebase firebase-realtime-database

想询问是否有人通过此库一起使用过PHP和Firebase: https://firebase-php.readthedocs.io/en/latest/

由于某种原因,firebase中的每个键都需要很长时间才能退出。每个项目约700-800ms。 10个项目大约8秒,等等。为什么这么慢?

foreach ($data as $key => $value){
    $this->database->getReference()->getChild($this->dbname)->getChild($userID)->getValue();
}

如果对象中有100个项目,则此循环可能永远持续。为什么这么慢,我该如何解决?

2 个答案:

答案 0 :(得分:1)

以这种方式从Firebase读取数据,这些是影响性能的主要因素:

  1. 连接到Firebase服务器所需的时间。
  2. Firebase服务器从磁盘获取数据所花费的时间。
  3. 将您请求的数据返回到计算机所花费的时间。

每个项目的总时间显然为700毫秒。没有任何魔术开关可以使此过程变得更快,您将不必从数据库中请求更多信息,也可以在更少的呼叫中完成请求。

提高性能的最常用方法:

  • 请求较少的数据,从而提高了#3(和#2)。当人们下载大量数据时,客户端的带宽通常是最大的限制因素。
  • 通过更快的连接拨打电话,从而改善了#3和#1。
  • 找到一种方法来减少通话次数。当您使用其中一个Firebase SDK来访问Firebase数据库时,这通常不是自they can pipeline the requests over a single connection起的因素。但是PHP库是基于Firebase的REST API构建的,每次调用可能会产生更多开销。

答案 1 :(得分:0)

减少运行时间的最快方法是获取整个数据库的快照。

这是数据库的层次结构

Database hierarchy in firebase

下面是使用自定义函数downloadDatabase()检索数据的基本代码。

require __DIR__.'/vendor/autoload.php';

use Kreait\Firebase\Factory;
use Kreait\Firebase\ServiceAccount;
class accountInfo{

    protected $database;
    protected $dbname = "users";

    public function __construct(){
        $serviceAccount = ServiceAccount::fromJsonFile(__DIR__.'/secret/yoursecret.json');
        $firebase = (new Factory)
                ->withServiceAccount($serviceAccount)
                ->create();
        $this->database = $firebase->getDatabase();
    }

    public function downloadDatabase(){
        return $this->database->getReference($this->dbname)->getValue();
    }
}

$users = new accountInfo();
$array = $users->downloadDatabase();

现在,您的$ array具有完整的数据库快照。您可以使用foreach循环轻松整齐地显示所有数据。

foreach ($array as $key => $value) {
    echo $key."<br>";
    if(is_array($value)){
    $value2 = $value;
        foreach ($value2 as $key2 => $value2) {
            echo "----";
            echo $key2." : ".$value2."<br>";
        }
    }
    echo "<hr>";
}

要测试代码的速度,请在代码开头使用它。

$start = microtime(true);

然后在文档末尾使用此

$time_elapsed_in_microsecs = microtime(true) - $start;
echo "<hr>Runtime : ".$time_elapsed_in_microsecs;