Salesforce/PHP - Mensagem de saída em massa (SOAP), Problema de tempo out - veja a atualização #2

StackOverflow https://stackoverflow.com/questions/2472746

Pergunta

O Salesforce pode enviar até 100 solicitações dentro de 1 mensagem de sabão. Ao enviar esse tipo de solicitação de mensagem em massa para o script PHP, termina a execução, mas o SF não aceita o ACK usado para limpar a fila de mensagens no lado do Salesforce. Olhando para o log de mensagens de saída (monitoramento), vejo todas as mensagens em um estado pendente com o motivo da falha de entrega "java.net.sockettimeoutException: Leia o tempo de tempo". Se meu script terminou a execução, por que recebo esse erro?

Eu tentei esses métodos para aumentar o tempo de execução no meu servidor, pois não tenho acesso ao lado do Salesforce:

  • set_time_limit (0); // no script
  • max_execution_time = 360; Tempo máximo de execução de cada script, em segundos
  • max_input_time = 360; Quantidade máxima de tempo que cada script pode gastar dados de solicitação de análise
  • memória_limit = 32m; Quantidade máxima de memória Um script pode consumir

Eu usei as configurações altas apenas para teste.

Alguma idéia de por que isso está falhando na entrega da ACK de volta ao Salesforce?

Aqui está um pouco do código: é assim que eu aceito e envio o arquivo ACK para a solicitação de sabão da IMA

$data = 'php://input';
$content = file_get_contents($data);

if($content) {
    respond('true');
} else {
    respond('false');
}

A função de resposta

function respond($tf) {
    $ACK = <<<ACK
<?xml version = "1.0" encoding = "utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <notifications xmlns="http://soap.sforce.com/2005/09/outbound">
            <Ack>$tf</Ack>
        </notifications>
    </soapenv:Body>
</soapenv:Envelope>
ACK;

    print trim($ACK); 
}

Estes estão em um script genérico que eu incluo no script que usa os dados para um fluxo de trabalho específico. Posso processar cerca de 25 solicitações (que estão na resposta de 1 SOAP), mas uma vez que passo o erro de tempo limite na fila do Salesforce. Para 50 solicitações, geralmente leva meu script PHP 86,77 segundos.

Poderia ser apache? PHP?

Também testei apenas aceitando a resposta de sabão de 100 solicitação e apenas aceitando e enviando a ACK que a fila limpa, então eu sei que está do meu lado.

Não mostro erros no log do Apache, o script funciona bem.

Encontrei algumas informações no site do Salesforce, mas ainda não há sorte. Aqui está a ligação.

Também estou usando o PHP Toolkit 11 (da Salesforce).

Outro fórum com boa ajuda SF

Obrigado por qualquer visão disso, -Phill

ATUALIZAR:

Se eu receber a mensagem recebida e imprimir a resposta, isso deve acontecer primeiro, independentemente de eu fazer mais alguma coisa? Ou ele espera que meu processo termine e depois imprima a resposta?

Atualização #2:

Ok, acho que tenho o problema: o PHP usa a abordagem de processamento de encadeamento único e não enviará de volta o arquivo ACK até que o thread conclua seu processamento. Existe uma maneira de fazer deste um processo de thread mutli? Tópico #1 - Aceite a solicitação de sabão recebida e envie de volta o thread ACK #2 - Processe a solicitação de sabão

Eu sei que poderia dividi -lo como uma tabela de banco de dados ou arquivo plano, mas existe uma maneira de conseguir isso sem fazer isso?

Vou tentar fechar o soquete após o envio da ACK e continuar o processamento, cruze os dedos, ele funcionará.

Foi útil?

Solução 5

Então, o que eu fiz é:

  1. Aceite todos os OBMs recebidos, analisam -os em um banco
  2. Quando isso é feito chute de um processo que é executado em segundo plano (na verdade eu o envio para o fundo para que o script possa terminar)
  3. Enviar o arquivo ACK de volta

Apenas aceitar os dados brutos, analisar os campos e inseri -los em um banco de dados é bastante rápido. Em seguida, emito um comando Linux Command Line que também envie o script de processamento para ser executado em segundo plano. Em seguida, envio o arquivo ACK para SF e o script termina dentro do tempo previsto. É complicado dividir o processo de script em dois estágios separados, mas funciona.

Outras dicas

Parece que a mensagem de saída está atingindo o tempo limite. Outros usuários relataram tempo limite tão baixo quanto 10 segundos (veja o link do fórum abaixo). A instância do Sandbox que eu uso (CS1) está cronometrando após cerca de 1 minuto, a partir dos meus testes. É possível que o tempo limite seja uma definição de nível de organização ou instância que o Salesforce controla.

Duas coisas que você poderia tentar:

  1. Abra um ticket de suporte no Salesforce para ver se eles podem aumentar o valor do tempo limite para mensagens de saída. Pela minha experiência, existem muitas configurações que eles podem modificar no nível da organização - esse pode ser um deles.

  2. Officamento de descarga de seus dados, para que o ACK seja enviado imediatamente ao Salesforce. Em seguida, o processamento real de seus dados ocorrerá de forma assíncrona. ou seja. Fila de mensagens, tópico separado, etc.

Alguns outros recursos que podem ser úteis:

discussão do fórum do Salesforce relacionado

Documentação de mensagens de saída

Eu acho que eles têm tempo limite, a coisa que espera seu script terminar.

Existe uma maneira de tentar consertar isso.

Saia o envelope com a mensagem ACK no início e depois lave a coisa para que o servidor o obtenha antes de terminar o processamento. Sem rosqueamento, apenas prioridades repensando :)

Leia isso para obter as melhores informações sobre o conteúdo de descarga

Você tem 100% de certeza de que o Salesforce esperará a quantidade de tempo que seus scripts precisam ser executados também? 80 segundos parecem um tempo tão frouxo também para mim.

Se todas as solicitações falhassem, acho que o Salesforce espera que você defina o Content-Type Cabeçalho adequadamente, mas esse não parece ser o caso.

Eu não sei sobre o Salesforce, mas se você quiser fazer um pouco de leitura com PHP, você deve dar uma olhada este exemplo de código e mais precisamente pcntl_fork ().

NB: PCNTL é não ativado por padrão e não funcionará nas plataformas do Windows.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top