Como evitar o Oracle Object Nesting / Creation Limit?

Eu tenho um ORM feito à mão no PHP que parece estar batendo contra um limite de object e causando que o php pareça. Aqui está um script simples que causará falhas:

parent = $parent; } public function __toString() { if($this->parent) return (string) "x " . $this->parent; return "top"; } } $bobs = array(); for($i = 1; $i  

Mesmo executar isso a partir da linha de comando causará problemas. Algumas checkboxs levam mais de 40.000 objects. Eu tentei no Linux / Apache (falha), mas meu aplicativo é executado no IIS / FastCGI. No FastCGI, isso faz com que o famoso “O processo FastCGI tenha saído inesperadamente”.

Obviamente 20k objects é um pouco alto, mas ele trava com muito menos objects se eles têm dados e complexidade aninhada.

O CGI rápido não é o problema – tentei executá-lo a partir da linha de comando. Eu tentei configurar a memory para algo realmente alto – 6,000MB e para algo realmente baixo – 24MB. Se eu configurá-lo baixo o suficiente, eu recebo o erro “tamanho da memory alocado xxx bytes esgotado”.

Estou pensando que isso tem a ver com o número de funções que se chama – algum tipo de prevenção de nidificação. Eu não pensei que o aninhamento do meu ORM foi tão complicado, mas talvez seja. Eu tenho alguns casos bastante claros onde se eu carregar apenas um object mais, ele morre, mas carrega em menos de 3 segundos se ele funcionar.

Curiosamente, no meu ambiente, parece que o segfault ocorre quando chega a hora de desconstruir os objects – o código colocado depois que o loop é executado corretamente. É somente quando o PHP começa a desligar que o segfault ocorre.

Você pode arquivar um bug , mas você pode achar que os mantenedores do PHP não irão fazer o possível para suportar esse tipo de coisa. Eu vi pelo menos um relatório de erro sobre um memory leaks em que a resposta oficial era essencialmente “Wontfix: a memory é liberada depois que a página é renderizada, então isso realmente não importa” – implicando efetivamente que usa fora do simples O caso de renderizar rapidamente uma página da Web e terminar não é realmente suportado.

Após 5 anos de desenvolvimento PHP em tempo integral, cheguei a uma regra simples: se ele falhar no PHP, não faça isso. O PHP tem suas limitações, e você se encontrará com maior sucesso se você não forçar esses limites.

Isso significa coisas como evitar create_function() em PHP <= 5.2 (vazamentos de memória como loucos). Você pode tentar usar create_function() para usar o PHP como se fosse um idioma funcional. Não é, e você achará que ele falha miseravelmente se você tentar usá-lo como tal.

Então, se o PHP chokes em objects de aninhamento 40000 níveis profundos … não aninhe objects 40000 níveis profundos. Uma alternativa possível é usar arrays em vez de objects – mas isso ainda parece muito hediondo.

    Intereting Posts