gpt4 book ai didi

Php MySQL 查询在资源有限的托管中内存不足

转载 作者:行者123 更新时间:2023-11-29 03:59:46 27 4
gpt4 key购买 nike

大家好之前我想设置无法更改的重要事实:

  • 主机无法更改
  • 在 php 中设置的 php_ini 最大内存将不起作用
  • 无法编辑 php.ini
  • php无法更新

我们有一个 webapi(类似于 restful 服务),其中有一个 url,用户可以以 json 方式显示。但是我们有 85k+ 条记录,当我们尝试将它们全部复制时,php 崩溃了(当我们只查找 1 条记录时不会发生这种情况),我们有 2 个代码可以使用,但它们都没有带来所有用户

版本 1

<?php
//security variables
$variableName = 'name';
$variableValue = 'value';

//system variables

ob_end_flush();
ob_start();
if(isset($_GET[$variableName]) && $_GET[$variableName]== $variableValue){
$dbVars = array();
$query = 'SELECT * FROM users_data ';
foreach ($_GET as $key => $value) {

if( $key != $variableName && $key != 'sized' && $key != 'devmode'){
array_push($dbVars, $key."='".$value."'");
}
}
if( count($dbVars) > 0 ){

$query .= 'WHERE '.implode(' AND ', $dbVars);
}
$result = mysql($w['database'], $query);
$results = array();
while($row = mysql_fetch_assoc($result)){
array_push($results, $row);
}
echo json_encode($results);
}
?>

版本 2(使用冲洗)

<?php
//security variables
$variableName = 'name';
$variableValue = 'value';

//system variables

ob_end_flush();
ob_start();
if(isset($_GET[$variableName]) && $_GET[$variableName]== $variableValue){
$dbVars = array();
$query = 'SELECT * FROM users_data ';
foreach ($_GET as $key => $value) {

if( $key != $variableName && $key != 'sized' && $key != 'devmode'){
array_push($dbVars, $key."='".$value."'");
}
}
if( count($dbVars) > 0 ){

$query .= 'WHERE '.implode(' AND ', $dbVars);
}
$result = mysql($w['database'], $query);
echo "[";
while($row = mysql_fetch_assoc($result)){
$results = array();
foreach($row as $key => $value){
array_push($results, '"'.$key.'":"'.$value.'"');
}
echo '{'.implode(',',$results).'}';
ob_flush();
}
echo "]";
}
?>

当我们想要获取数据库中所有用户都是85k时,结果是none,因为内存限制我们如何才能让所有用户都能使用它?

最佳答案

首先,您的代码充满了 SQL 注入(inject)漏洞。任何人都可以拥有您的数据库。这是你的问题。

现在,PHP 内存不足的原因是您正在使用缓冲查询

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

Queries are using the buffered mode by default. This means that query results are immediately transferred from the MySQL Server to PHP and then are kept in the memory of the PHP process.

阅读我提供的链接(老天爷,它使用 mysqli)并使用无缓冲模式将您的结果集流式传输到客户端。

另外,不要将整个结果集 array_push() 到一个数组中。

另外,显然,

array_push($dbVars, $key."='".$value."'");

如果任何值包含 "或其他转义字符,将生成无效的 JSON。

关于Php MySQL 查询在资源有限的托管中内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com