PHP echo 5000记录和Unset

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我想回收300000的大数据集中的记录。

回显首先5000条记录而不是unset($ data)并迭代直到mysql表中的记录结束。

像这样的东西,

1)

 for ($i=0; $i < 5; $i++) {
        $data = openssl_random_pseudo_bytes(1000000);
        echo "peak_memory_usage = ” . memory_get_peak_usage(true) . “\n”;
        doSomething($data);

        //unset($data);

    }

    echo “for loop completed, memory now at ” . memory_get_usage(true) . “\n”;

    function doSomething($data) {
        echo “size:” . strlen($data) . “\n”;
    }

或类似的东西?

2)

 nRows = $pdo->query('select count(*) from employees')->fetchColumn();

        $users = new ArrayIterator(range(1, nRows)); // nRows are 3000000 test records
        foreach(new LimitIterator($users, 0, 50000) as $u) {
          echo $u, "\n";
        }

要么

3)

 $data = $DB->query("SELECT * FROM user_details")->fetchAll();

        foreach ($data as $row) {
          echo $row['username']." -- ID :" .$row['user_id']. " -- FirstName :" .$row['first_name']. "<br />\n";
        }

第三个3)选项可以很好地处理50,000个记录而不是RAM上的负载而CPU,有没有办法优化它以减少CPU上的负载,想象如果30个人运行相同的查询它会最大化CPU?如果我添加usleep(10) - 它会回显记录,但最后会出现错误,说超时。

任何建议都非常感谢。

提问于
用户回答回答于

尝试修复你的第三次尝试:

  1. 选择所需的列而不是选择*。
  2. 缓存结果,因此只需为每个加载页面的人运行一次。
  3. 添加LIMIT(分页),这样您只需选择前100行或1000行而不是50,000行。当您同时加载50k行时,这也将阻止浏览器爆炸。
用户回答回答于

$data 已经被覆盖了,所以这不是问题所在。

重型环路会在服务器上产生持续的张力,从而增加负载。

您可以添加sleep几微秒来允许服务器释放资源和一些喘息时间,这将降低服务器负载。使用usleep并设置最佳微秒。

for ($i=0; $i < 5; $i++) {
    usleep(100);
    $data = openssl_random_pseudo_bytes(1000000);
}

扫码关注云+社区

领取腾讯云代金券