使用==时,递归函数中的PHP内存泄漏

时间:2018-03-01 22:54:37

标签: php recursion memory-leaks

我在这里遇到一个奇怪的问题:我要粘贴你的函数会导致内存泄漏,从而导致服务器崩溃。

奇怪的是,如果我将每个==更改为===,则不会发生此内存泄漏。

private function controllaPrerequisitiPerEliminazioneAbilita( $pgid, $id_abilita, $lista_ab, $params = array() )
{
    global $PREREQUISITO_TUTTE_ABILITA;
    global $PREREQUISITO_F_TERRA_T_SCELTO;
    global $PREREQUISITO_5_SUPPORTO_BASE;
    global $PREREQUISITO_3_CONTROLLER;
    global $PREREQUISITO_4_SPORTIVO;
    global $ID_ABILITA_F_TERRA;
    global $ID_ABILITA_T_SCELTO;

    $query_ab = "SELECT * FROM abilita WHERE id_abilita = :id";
    $abilita  = $this->db->doQuery( $query_ab, array( ":id" => $id_abilita ), False );
    $abilita  = $abilita[0];

    $ab_prereq  = array_filter( $lista_ab, "Utils::filtraAbilitaSenzaPrerequisito" );

    $new_params = array();

    if( count( $ab_prereq ) > 0 )
    {
        $qta_sportivo = count( array_filter( $lista_ab, "Utils::filtraAbilitaSportivo" ) );
        $qta_sup_base = count( array_filter( $lista_ab, "Utils::filtraAbilitaSupportoBase" ) );
        $qta_controll = count( array_filter( $lista_ab, "Utils::filtraAbilitaController" ) );

        foreach( $ab_prereq as $i => $ap )
        {
            if (
                $ap["prerequisito_abilita"] == $id_abilita
                || $ap["prerequisito_abilita"] == $PREREQUISITO_TUTTE_ABILITA && $abilita["classi_id_classe"] == $ap["classi_id_classe"]
                || (
                    $ap["prerequisito_abilita"] == $PREREQUISITO_F_TERRA_T_SCELTO
                    && (
                        $id_abilita == $ID_ABILITA_F_TERRA
                        || $id_abilita == $ID_ABILITA_T_SCELTO
                    )
                )
                || $ap["prerequisito_abilita"] == $PREREQUISITO_5_SUPPORTO_BASE && $qta_sup_base < 5
                || $ap["prerequisito_abilita"] == $PREREQUISITO_4_SPORTIVO && $qta_sportivo < 4
                || $ap["prerequisito_abilita"] == $PREREQUISITO_3_CONTROLLER && $qta_controll < 3
            )
            {
                $new_params[] = $ap["id_abilita"];
                //removing this element from the array we will pass in the recursion
                Utils::rimuoviElementoArrayMultidimensionale( $lista_ab, "id_abilita", $ap["id_abilita"] );
            }
        }
    }

    if( count( $new_params ) > 0 )
    {
        foreach( $new_params as $p )
            $params = $this->controllaPrerequisitiPerEliminazioneAbilita( $pgid, $p, $lista_ab, $params );
    }

    return array_merge( $new_params, $params );
}

我真的不明白为什么会这样。你能帮我一把吗?

提前谢谢!

0 个答案:

没有答案