Salesforce 最多可以在 1 条 SOAP 消息中发送 100 个请求。在发送这种类型的批量出站消息请求时,我的 PHP 脚本完成执行,但 SF 无法接受用于清除 Salesforce 端的消息队列的 ACK。查看出站消息日志(监控),我看到所有消息都处于挂起状态,传递失败原因为“java.net.SocketTimeoutException:读取超时”。如果我的脚本已完成执行,为什么会出现此错误?
我已经尝试了这些方法来增加我的服务器上的执行时间,因为我在 Salesforce 端没有访问权限:
- 设置时间限制(0);// 在脚本中
- max_execution_time = 360;每个脚本的最大执行时间,以秒为单位
- 最大输入时间 = 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 秒。
会不会是阿帕奇?php?
我还测试了仅接受 100 请求 SOAP 响应并仅接受并发送队列清除的 ACK,所以我知道它在我这边。
我在 apache 日志中没有显示错误,脚本运行良好。
我确实在 Salesforce 网站上找到了一些信息,但仍然没有运气。这是链接。
我也在使用 PHP Toolkit 11(来自 Salesforce)。
感谢您对此的任何见解,--Phill
更新:
如果我收到传入的消息并打印响应,是否应该先发生这种情况,不管我之后是否做任何其他事情?还是等待我的过程完成然后打印响应?
更新#2:
好吧,我想我有问题:PHP 使用单线程处理方法,在线程完成处理之前不会发回 ACK 文件。有没有办法让它成为一个多线程进程?线程 #1 - 接受传入的 SOAP 请求并发送回 ACK 线程 #2 - 处理 SOAP 请求
我知道我可以把它分解成一个数据库表或平面文件,但是有没有办法在不这样做的情况下做到这一点?
我将在 ACK 提交后尝试关闭套接字并继续处理,交叉手指它会起作用。