【问题标题】:Salesforce/PHP - Bulk Outbound message (SOAP), Time out issue - See update #2Salesforce/PHP - 批量出站消息 (SOAP),超时问题 - 请参阅更新 #2
【发布时间】:2011-01-29 04:30:12
【问题描述】:

Salesforce 最多可以在 1 条 SOAP 消息中发送 100 个请求。在发送这种类型的批量出站消息请求时,我的 PHP 脚本完成执行,但 SF 无法接受用于清除 Salesforce 端的消息队列的 ACK。查看出站消息日志(监控),我看到所有消息都处于挂起状态,传递失败原因为“java.net.SocketTimeoutException:读取超时”。如果我的脚本已完成执行,为什么会出现此错误?

我已经尝试了这些方法来增加我的服务器上的执行时间,因为我在 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

感谢您对此的任何见解, --菲尔

更新:

如果我收到传入的消息并打印响应,是否应该先发生这种情况而不管我之后是否执行其他任何操作?还是等待我的过程完成然后打印响应?

更新 #2:

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

我知道我可以把它分解成一个数据库表或平面文件,但是有没有办法在不这样做的情况下完成这个?

我打算在ACK提交后尝试关闭套接字并继续处理,交叉手指它会工作。

【问题讨论】:

  • 尽我所能,我的脚本正在等待发送 ACK,直到它完成执行,这是为什么呢?我不能打印 ACK 然后完成执行吗?

标签: java php soap timeout salesforce


【解决方案1】:

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

你可以尝试两件事:

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

  2. 卸载数据处理,因此 确认立即发送 返回 Salesforce。那么实际 处理您的数据需要 异步放置。 IE。信息 队列、单独的线程等。

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

related Salesforce forum discussion

Outbound messaging documentation

【讨论】:

  • 谢谢,我确实有一张 SF 的票,并且已经在几个论坛上发布过这个问题。问题是 PHP 我相信是单线程进程。因此,无论我何时发送 ACK,它都会等待发送,直到进程完成。我一直在考虑将 ACK 和处理分成 2 个步骤,但想知道这是否可以一次性完成。
【解决方案2】:

我认为他们将等待你的脚本结束的事情超时。

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

在开始时输出带有确认消息的信封,然后刷新该东西,以便他们的服务器在您结束处理之前获取它。没有线程,只是重新考虑简单的优先事项:)

read this for best info on flushing content

【讨论】:

  • 有一个风险——它取决于它们的实现,但如果它等待处理结束,如果你输出整个东西,它可能会继续等待。通过在末尾发送 %00 或其他形式的零值,或者发送指定的文件结尾,它可能会被破解。
【解决方案3】:

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

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

【讨论】:

  • 我同意 80 秒对于 SF 来说确实等待很长,但我不知道如何在 SF 方面增加这个时间。你?
【解决方案4】:

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

注意:pcntl 默认启用,并且无法在 Windows 平台上运行。

【讨论】:

    【解决方案5】:

    所以我所做的是:

    1. 接受所有传入的 OBM,将它们解析到数据库中
    2. 完成后启动在后台运行的进程(实际上我将其发送到后台以便脚本可以结束)
    3. 发回 ACK 文件

    通过仅接受原始数据、解析成字段并将其插入数据库是相当快的。然后我发出一个 Linux 命令行命令,该命令还发送处理脚本以在后台运行。然后我将 ACK 文件发送到 SF,脚本在分配的时间内结束。将脚本过程分成两个单独的阶段很麻烦,但它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多