【发布时间】: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)。
感谢您对此的任何见解, --菲尔
更新:
如果我收到传入的消息并打印响应,是否应该先发生这种情况而不管我之后是否执行其他任何操作?还是等待我的过程完成然后打印响应?
更新 #2:
好的,我想我有问题: PHP 使用单线程处理方法,在线程完成处理之前不会发回 ACK 文件。有没有办法让它成为一个多线程进程? 线程 #1 - 接受传入的 SOAP 请求并发回 ACK 线程 #2 - 处理 SOAP 请求
我知道我可以把它分解成一个数据库表或平面文件,但是有没有办法在不这样做的情况下完成这个?
我打算在ACK提交后尝试关闭套接字并继续处理,交叉手指它会工作。
【问题讨论】:
-
尽我所能,我的脚本正在等待发送 ACK,直到它完成执行,这是为什么呢?我不能打印 ACK 然后完成执行吗?
标签: java php soap timeout salesforce