Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Salesforce/PHP-批量出站消息(SOAP),超时问题-请参阅更新#2_Java_Php_Soap_Timeout_Salesforce - Fatal编程技术网

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

Java Salesforce/PHP-批量出站消息(SOAP),超时问题-请参阅更新#2,java,php,soap,timeout,salesforce,Java,Php,Soap,Timeout,Salesforce,Salesforce可以在一条SOAP消息内发送多达100个请求。在发送这种类型的批量OOOutbound消息请求时,我的PHP脚本执行完毕,但SF无法接受用于清除Salesforce端消息队列的ACK。查看出站消息日志(监控),我看到所有消息都处于挂起状态,传递失败原因为“java.net.SocketTimeoutException:Read timed out”。如果我的脚本已完成执行,为什么会出现此错误 我尝试了以下方法来增加服务器上的执行时间,因为我无法访问Salesforce端:

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

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

  • 设置时间限制(0);//在剧本中
  • 最大执行时间=360;每个脚本的最大执行时间(秒)
  • 最大输入时间=360;每个脚本可能用于分析请求数据的最长时间
  • 内存限制=32M;脚本可能消耗的最大内存量
我使用高设置只是为了测试

您有没有想过为什么无法将ACK传递回Salesforce

下面是一些代码: 这就是我如何接受和发送imcoming 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); 
}
函数响应($tf){

$ACK=您是否100%确定Salesforce会等待您的脚本运行所需的时间?我觉得80秒也太长了


如果所有请求都失败,我猜Salesforce希望您适当地设置
内容类型
标题,但事实似乎并非如此。

听起来好像出站消息超时了。其他用户报告的超时时间只有10秒(见下面的论坛链接)。我使用的沙盒实例(cs1)大约1分钟后超时。超时可能是Salesforce控制的组织或实例级别设置

你可以尝试两件事:

  • 使用打开支持票证 销售人员,看看他们是否可以 增加的超时值 出站消息。来自我的 经验,有很多 他们可以在上修改的设置 组织级-这可能是 其中一个

  • 卸载对数据的处理,因此 确认立即发送 回到Salesforce,然后是实际的 处理您的数据将需要 异步放置。即消息 队列、独立线程等

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


    我想他们会让等待脚本结束的事情超时

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

    在开始时输出带有ack消息的信封,然后刷新它,以便他们的服务器在您结束处理之前获得它。没有线程,只是简单地重新思考:)


    我不知道Salesforce的情况,但是如果您想使用PHP进行一些多线程处理,那么您应该了解并更准确地了解它

    注意:pcntl在默认情况下未启用,在Windows平台上无法工作。

    因此我所做的是:

  • 接受所有传入的OBM,将其解析为DB
  • 完成此操作后,将启动在后台运行的进程(实际上我会将其发送到后台,以便脚本可以结束)
  • 发回确认文件

  • 只需接受原始数据,解析为字段并将其插入数据库就相当快了。然后,我发出一个Linux命令行命令,该命令还将处理脚本发送到后台运行。然后,我将ACK文件发送到SF,脚本在分配的时间内结束。将脚本过程分为两个单独的阶段很麻烦s但它是有效的。

    我同意SF等待80秒似乎很长,但我不知道如何增加SF方面的时间。你?我能做的最好的事情是等待发送ACK,直到它完成执行,这是为什么?我不能打印ACK然后完成执行吗?谢谢,我确实有一张SF的票证,并且已经在几个f上发布了关于这一点,我认为问题在于PHP是单线程进程。因此,无论何时发送ACK,它都将等待发送,直到进程完成。我一直在考虑将ACK和处理分为两个步骤,但想知道这是否可以在一个步骤中完成。有一个风险-这取决于它们的实现,但如果它等待处理结束,则如果您输出整个内容,它可能会继续等待。可以通过在结尾发送%00或其他形式的零值,或通过发送指定的文件结尾来进行黑客攻击。