Salesforce 最多可以在 1 条 SOAP 消息中发送 100 个请求。在发送此类批量 Ooutbound 消息请求时,我的 PHP 脚本完成执行,但 SF 无法接受用于清除 Salesforce 端消息队列的 ACK。查看出站消息日志(监控),我看到所有消息都处于挂起状态,传递失败原因为“java.net.SocketTimeoutException:读取超时”。如果我的脚本已完成执行,为什么会出现此错误?
我已经尝试了这些方法来增加我服务器上的执行时间,因为我无法访问 Salesforce 端:
- 设置时间限制(0);//在脚本中
- 最大执行时间 = 360 ;每个脚本的最大执行时间,以秒为单位
- 最大输入时间 = 360 ;每个脚本可能花在解析请求数据上的最长时间
- 内存限制 = 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)。
感谢您对此的任何见解, --菲尔
更新:
如果我收到传入消息并打印响应,是否应该先发生这种情况,而不管我之后是否做任何其他事情?还是等待我的过程完成然后打印响应?
更新#2:
好的,我想我遇到了问题: PHP 使用单线程处理方法,在线程完成处理之前不会发回 ACK 文件。有没有办法使它成为一个多线程进程? 线程 #1 - 接受传入的 SOAP 请求并发回 ACK 线程 #2 - 处理 SOAP 请求
我知道我可以将其分解成数据库表或平面文件,但有没有办法在不这样做的情况下完成此操作?
我将尝试在 ACK 提交后关闭套接字并继续处理,祈祷它会起作用。
最佳答案
听起来出站消息超时了。其他用户报告超时低至 10 秒(请参阅下面的论坛链接)。根据我的测试,我使用的沙箱实例 (cs1) 在大约 1 分钟后超时。超时可能是 Salesforce 控制的组织或实例级别设置。
您可以尝试两件事:
使用 Salesforce 看看他们是否可以 增加超时值 出站消息。从我的 经验,有很多 他们可以修改的设置 组织级别 - 这可能是 其中之一。
卸载数据处理,因此 立即发送ACK 回到 Salesforce。那么实际的 处理您的数据需要 异步放置。 IE。信息 队列、独立线程等
一些其他可能有用的资源:
关于java - Salesforce/PHP - 批量出站消息 (SOAP),超时问题 - 请参阅更新 #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472746/