Support » Plugin: Claudio Sanches - Correios for WooCommerce » Add to Cart extremamente lento quando plugin dos correios ativo

  • Resolved Fábio

    (@fabiopulitta)


    Fala Claudio,
    demorei pra identificar de onde é que vinha tanta lentidão, mas resolvi fazer o teste padrão de desativar todos os plugins e ir ativando e percebi que é no WooCommerce Correios que o problema aparece. Explicando o caso:

    O problema:
    Uso ajax para incluir produtos no carrinho (sem ajax da na mesma). Quando clico, demora entre 14-17s pra obter resposta e o botão mudar para “ver carrinho”.

    O que notei.
    A lentidão só acontece se estou logado. Se um novo usuário entra no site e começa a incluir produtos no carrinho, a resposta é ok, de 1,5s.

    Desativando o plugin, o problema desaparece. Eu nunca tinha notado o problema. talvez alguma mudança nas últimas atualizações?

    Alguma ideia?

    Vlw!

    The page I need help with: [log in to see the link]

Viewing 10 replies - 1 through 10 (of 10 total)
  • Plugin Support Alex Koti

    (@alexkoti)

    Oi Fábio,

    Confira se a opção “Modo de depuração” está ligado, pode ser ele que está interferindo. Essa opção fica em “WooCommerce > Configurações > aba Entrega > sub Opções de entrega”

    De qualquer forma, dê uma conferida no log de erros para ver se está registrando algo.
    https://codex.wordpress.org/Debugging_in_WordPress#WP_DEBUG_LOG

    Thread Starter Fábio

    (@fabiopulitta)

    Obrigado pela resposta Alex,
    De fato, estava ativo a depuração, mas mesmo desativando, não mudou nada. Ativei a depuração e não há qualquer menção de erro relacionado ao plugin. Existem outros warnings do woocommerce que estão aparecendo aos montes ultimamanete de funções depreciadas, mas mesmo assim não parecem ter relação com o problema.

    Thread Starter Fábio

    (@fabiopulitta)

    Vamos lá… colhi mais alguns dados, agora usando o Query Monitor:

    Eu achei que o problema era apenas nas chamadas com o add-to-cart com ajax na home, mas acontece qdo adiciono um produto diretamente na página do produto em si.

    Veja o que ele me mostra quando adiciono um produto. Aqui levou certa de 25s até finalizar o carregamento, sendo que 23s é do correio.

    Veja nessa imagem: http://camaleoa.com/chamada-correios.png

    Curiosamente, se eu faço a chamada na API, a resposta é bem rápida. Abaixo estão as duas para teste:

    Essa é a primeira, que demora 20s
    http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdServico=04669&nCdEmpresa=14448769&sDsSenha=12966706&sCepDestino=05414001&sCepOrigem=06612280&nVlAltura=2&nVlLargura=11&nVlDiametro=0&nVlComprimento=16&nVlPeso=1,5&nCdFormato=1&sCdMaoPropria=N&nVlValorDeclarado=0&sCdAvisoRecebimento=N&StrRetorno=xml

    E essa é a segunda, que demora 2s
    http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdServico=04162&nCdEmpresa=14448769&sDsSenha=12966706&sCepDestino=05414001&sCepOrigem=06612280&nVlAltura=2&nVlLargura=11&nVlDiametro=0&nVlComprimento=16&nVlPeso=1,5&nCdFormato=1&sCdMaoPropria=N&nVlValorDeclarado=0&sCdAvisoRecebimento=N&StrRetorno=xml

    Algum ideia de onde vem essa lentidão?

    Plugin Support Alex Koti

    (@alexkoti)

    Oi Fábio!
    Então eu imagino que possa ser algum problema na class WP_Http ( https://codex.wordpress.org/HTTP_API ), que é do core do WP, eu sei que ela tenta diversos métodos de requisição externa, considerando vários ambientes php.

    Olhando no fonte o wp_safe_remote_get() vai acabar chamando essa classe e utilizando o método request() na linha 148 ( https://developer.wordpress.org/reference/classes/wp_http/ )

    Um teste que pode ser feito seria o seguinte, utilizar os vários filtros que existem nessa classe e salvar o time em que ele é executado, e comparar os valores para achar em qual momento do código está acontecendo a lentidão. Um exemplo simples:

    
    add_filter( 'http_request_args', 'test_http_1', 10, 2 );
    function test_http_1( $r, $url ){
        error_log( 'hook http_request_args: ' . time() , 0);
        return $r;
    }
    
    add_filter( 'http_response', 'test_http_2', 10, 3 );
    function test_http_2( $response, $r, $url ){
        error_log( 'hook http_response: ' . time() , 0);
        return $r;
    }
    

    O error_log() vai salvar no arquivo /wp-content/debug.log
    Existem vários filtros nessa classe, teria ir testando até achar o ponto de gargalo.

    Esse código teria que ser colocado num plugin seu, pois não tenho certeza de que ele daria certo apenas colocando no functions.php do tema.

    Thread Starter Fábio

    (@fabiopulitta)

    O esperado é algo assim?

    Inclui esses filtros que vc sugeriu no functions.php mesmo.
    Aí no debug veio esses tempos:

    [09-Nov-2017 04:51:35 UTC] hook http_request_args: 1510203095
    [09-Nov-2017 04:51:46 UTC] hook http_response: 1510203106
    [09-Nov-2017 04:51:46 UTC] PHP Notice: Undefined index: response in /home/puravida/public_html/wp-content/plugins/woocommerce-correios/includes/class-wc-correios-webservice.php on line 558
    [09-Nov-2017 04:51:46 UTC] hook http_request_args: 1510203106
    [09-Nov-2017 04:51:49 UTC] hook http_response: 1510203109
    [09-Nov-2017 04:51:49 UTC] PHP Notice: Undefined index: response in /home/puravida/public_html/wp-content/plugins/woocommerce-correios/includes/class-wc-correios-webservice.php on line 558

    Aí dei uma olhada no request e escolhei um dos filtros pra testar novamente. Foi o abaixo:

    add_filter( ‘pre_http_request’, ‘test_http_3’, 10, 3 );
    function test_http_3( $response, $r, $url ){
    error_log( ‘hook pre_http_request: ‘ . time() , 0);
    return $r;
    }

    Agora o comprar responde em 2 a 2,5s. Só por ter colocado esse filtro pre_http_request
    Estou deixando tudo pronto para a requisição antes de fazer ela?
    Faz sentido? o_O

    Edit: A inclusão no carrinho é rápida, porém descobri que o pedido não calcula mais o frete e não passa nenhum pedido por isso. Não funcionou.

    • This reply was modified 4 years, 9 months ago by Fábio.
    Plugin Support Alex Koti

    (@alexkoti)

    O add_filter sempre precisa retornar o primeiro argumento que recebe, os outros são auxiliares.

    Por exemplo nesse
    $pre = apply_filters( 'pre_http_request', false, $r, $url ); será aplicado os filtros associados ao ‘pre_http_request’, e ele espera o valor filtrado(ou não) do primeiro argumento que nesse caso é o false. Se olhar o código fonte, verá que logo em seguida ele verifica se esse valor de $pre é false. Por isso foi mais rápido, mas não deu certo, pois o valor retornado não era no formato correto.
    Esse caso específico é meio confuso pois o valor inicial é false.

    De qualquer forma, pelos tempos ali do log deu 11 segundos entre ‘http_request_args’ e ‘http_response’, que é o retorno de fato da url 🙁

    Uma coisa que seria possível tentar é nesse mesmo filtro pre_http_request realizar o pedido da url via cURL e retornar o array no modelo necessário(explicado nas linhas 229-246 da class WP_Http)

    Inclusive, creio que seja uma boa você fazer um teste pedindo diretamente a url dos urls via cURL, sem passar pelo wordpress, para conferir se não está tendo lentidão nele.

    Thread Starter Fábio

    (@fabiopulitta)

    Opa Alex,
    ainda não testei essa última ideia sua, mas me ocorreu uma coisa.

    Atualmente não uso FastCGI no servidor. Tive que usar certas configurações que não são compatíveis com ele. Poderia ser este um motivo?

    Thread Starter Fábio

    (@fabiopulitta)

    Bingo, Alex.

    O problema todo era o fato de não estar usando FastCGI no servidor.

    Plugin Support Alex Koti

    (@alexkoti)

    Que bom que deu certo! Essa é uma informação importante, vou ver se é possível adicionar isso na descrição do plugin

    Thread Starter Fábio

    (@fabiopulitta)

    Sim, caso resolvido depois das configurações alteradas.

    Obrigado pela ajuda.

    abs

Viewing 10 replies - 1 through 10 (of 10 total)
  • The topic ‘Add to Cart extremamente lento quando plugin dos correios ativo’ is closed to new replies.