PHP内存管理-致命错误:内存不足

PHP内存管理-致命错误:内存不足,php,mysql,Php,Mysql,我是一名PHP开发新手,正在学习这门伟大的语言。现在,我得到了一个包含1343579行的脚本,当我尝试运行它时,我得到了以下结果: Fatal error: Out of memory (allocated 269221888) (tried to allocate 536870912 bytes) in Unknown on line 0 我有一段代码被重复了512次,因为我允许2^9个不同的组合来解释不同的搜索选项。我正在通过使用unset()、为变量设置null,有时还显式调用gc\u

我是一名PHP开发新手,正在学习这门伟大的语言。现在,我得到了一个包含1343579行的脚本,当我尝试运行它时,我得到了以下结果:

Fatal error: Out of memory (allocated 269221888) (tried to allocate 536870912 bytes) in Unknown on line 0
我有一段代码被重复了512次,因为我允许2^9个不同的组合来解释不同的搜索选项。我正在通过使用
unset()
、为变量设置null,有时还显式调用
gc\u collect\u cycles()
,尽最大努力减少内存泄漏


请告诉我一百万行代码最终是否会出现这种内存问题,或者我在内存管理方面做了一些愚蠢的事情。

将源代码分成更小的部分,只包含您真正需要的内容。当你一遍又一遍地重复同样的事情时,把它重构成一个单独的函数,并用适当的参数调用它

如果不了解具体任务,我们就不能提供更多的建议

您可以根据您的条件逐步构建查询字符串

function execute_query($pdo, $cond1, $cond2, $cond3, ..., $cond9)
{
    $params = array();
    $bind_types = '';
    $sql = 'select * from mytable where';

    $sql = "$sql condition1 = ?";
    $params[] = $cond1;

    if (isset($cond2)) {
        $sql = "$sql and condition2 = ?";
        $params[] = $cond2;
    }

    if (isset($cond3)) {
        $sql = "$sql and condition3 = ?";
        $params[] = $cond3;
    }

    ...

    $sth = $pdo->prepare($sql);
    return $sth->execute($params);
}

内存泄漏是不正常的,不应该发生。您可以尝试一些解决方案,将这段代码分解成小部分,然后进行结构化处理

您可以尝试一些MVC解决方案,比如ZEND之类的。 确保你的代码没有做任何超出你需要的事情。 全部复习


> G.L。

你必须考虑GC的服务器,如果你用130万行代码结束了,那么你的应用程序的设计是非常错误的,很难确定到底是什么在浪费内存。使用xdebug查看泄漏的位置。代码行与内存使用量无关。您可能存在内存泄漏,但更可能的是,您只是在内存中积累了大量的值。您不能将代码重复512次,而不是将其作为函数编写一次并使用参数指定搜索选项吗?谢谢。我试图有9个搜索选项来缩小搜索范围。根据用户选择的选项,我将执行mysql SELECT*其中condition1=yes,…,condition9=met。这就是我重复代码2^9次的原因。我不熟悉MVC-这种设计会导致一个shoter代码吗?@siv4ppp。。。正如Olaf Dietsche所示,您不需要单独的代码和查询来处理条件条件。您只需要使用参数和条件语句来构建查询,这就是编码的威力——它应该可以为您完成这项工作。你好,Olaf Dietsche,谢谢您的回答。我只有3个问题。i) 我们是否需要在$sql中使用任何字符串压缩机制。=“$sql和条件2=?”;ii)为什么在$sql中使用“?”?这是否意味着您使用事务处理方法,还是仅仅为了explanation@Siv4PHPi)是的,您可以通过
$sql.=”和条件2=?
$sql=“$sql和…”
两种方式来执行该操作;ii)
是准备好的语句的占位符。看见当然,您可以直接在SQL语句中使用这些参数,但随后必须对它们进行转义。否则,您很容易受到SQL注入的攻击。因此,现在推荐的方法是使用准备好的SQL语句。@siv4ppp不客气;-)如果这解决了你的问题,考虑一下。谢谢。谢谢Guerra,我正在尝试使用9个搜索选项来缩小搜索范围。根据用户选择的选项,我将执行mysql SELECT*其中condition1=yes,…,condition9=met。这就是我重复代码2^9次的原因。我不熟悉MVC-这种设计会导致一个shoter代码吗?