Salesforce / PHP - 批量出站消息(SOAP),超时问题 - 请参阅更新#2

时间:2010-03-18 19:25:28

标签: java php soap timeout salesforce

Salesforce可以在1条SOAP消息中发送最多100个请求。在发送此类型的Bulk Ooutbound消息请求时,我的PHP脚本完成执行,但SF无法接受用于清除Salesforce端消息队列的ACK。查看Outbound消息日志(监视),我看到所有处于挂起状态的消息都带有Delivery Failure Reason“java.net.SocketTimeoutException:read timed out”。如果我的脚本已完成执行,为什么会出现此错误?

我尝试过这些方法来增加服务器上的执行时间,因为我无法访问Salesforce端:

  • 参数或者set_time_limit(0); //在脚本中
  • max_execution_time = 360;每个脚本的最长执行时间,以秒为单位
  • max_input_time = 360;每个脚本可能花费在解析请求数据上的最长时间
  • memory_limit = 32M;脚本可以使用的最大内存量

我使用高设置进行测试。

为什么这会导致ACK交付给Salesforce失败?

以下是一些代码: 这就是我接受并发送即将发送的SOAP请求的ACK文件

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

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

回复功能

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); 
}

这些是我在脚本中包含的通用脚本,该脚本使用特定工作流的数据。我可以处理大约25个请求(这是在1个SOAP响应中)但是一旦我查看,我在Salesforce队列中得到超时错误。 50个请求通常需要我的PHP脚本86.77秒。

可能是Apache吗? PHP?

我还测试过只接受100个请求SOAP响应,只是接受并发送队列清除的ACK,所以我知道这是我自己的事情。

我在apache日志中没有显示错误,脚本运行正常。

我确实在Salesforce网站上找到了一些信息,但仍然没有运气。这是the link

我也在使用PHP Toolkit 11(来自Salesforce)。

Other forum with good SF help

感谢您对此有任何见解, --Phill

更新:

如果我收到收到的消息并打印回复,那么不管我之后做了什么,我都会先发生这种情况吗?还是等待我的流程完成然后打印响应?

更新#2:

好吧我觉得我有问题: PHP使用单线程处理方法,并且在线程完成处理之前不会发回ACK文件。有没有办法使这成为一个多线程进程? 线程#1 - 接受传入的SOAP请求并发回ACK 线程#2 - 处理SOAP请求

我知道我可以将其分解为数据库表或平面文件,但有没有办法在不这样做的情况下实现这一目标?

在ACK提交后我将尝试关闭套接字并继续处理,交叉指示它会起作用。

5 个答案:

答案 0 :(得分:1)

听起来出站消息正在超时。其他用户报告的暂停时间低至10秒(请参阅下面的论坛链接)。我使用的沙箱实例(cs1)在我的测试后约1分钟后超时。超时可能是Salesforce控制的组织或实例级别设置。

你可以尝试两件事:

  1. 打开支持票证 Salesforce看看他们是否可以 增加超时值 出站邮件。从我的 经验,有很多 他们可以修改的设置 组织级别 - 这可能是 其中之一。

  2. 卸载您的数据处理,所以 ACK立即发送 回到Salesforce。那么实际 处理您的数据将需要 异步地放置。即。信息 队列,单独的线程等

  3. 其他一些可能有用的资源:

    related Salesforce forum discussion

    Outbound messaging documentation

答案 1 :(得分:1)

我认为他们会等待你的脚本结束。

有一种方法可以尝试解决这个问题。

在开头输出带有ack消息的信封,然后刷新物品,以便他们的服务器在您结束处理之前获取它。没有线程,只是重新考虑的优先事项:)

read this for best info on flushing content

答案 2 :(得分:0)

您是否100%确定Salesforce会等待脚本运行所需的时间? 80秒似乎也是我的时间。

如果所有请求都失败了,我猜想Salesforce希望您适当地设置Content-Type标头,但似乎并非如此。

答案 3 :(得分:0)

我不了解Salesforce,但是如果你想用PHP进行多线程处理,你应该看看this code example,更准确地说是pcntl_fork()

N.B:默认情况下,pcntl ,并且无法在Windows平台上运行。

答案 4 :(得分:0)

所以我所做的是:

  1. 接受所有传入的OBM,将其解析为数据库
  2. 当在后台运行的进程完成时(实际上我将它发送到后台以便脚本可以结束)
  3. 发回ACK文件
  4. 通过接受原始数据,解析到字段并将其插入到数据库中相当快。然后我发出一个Linux命令行命令,该命令也发送处理脚本以在后台运行。然后我将ACK文件发送到SF,脚本在指定的时间内结束。将脚本过程分成两个单独的阶段是很麻烦的,但它可以工作。