上传文件时出现 SoapFault 未知错误

SoapFault unknown error when uploading file

运行 两台服务器,服务器 1:是 Soap 客户端,服务器 2:是 Soap 服务器

我从服务器 1 向服务器 2 发送了一个包含以下参数的信封:

client_hash(字符串), unique_code(字符串), unique_code2(字符串), query_id(整数), 参数(字符串)

参数将是一个 json 字符串,其中将包含: file_name(字符串), file_mime(字符串), file_content (string:base64编码的文件), file_size(整数)

出于某种原因,如果文件大于 700kb,php 将通过 SoapFault 未知错误。虽然任何较小的都很好。

尝试使用 Wireshark 进行调试,信封已发送,但在 0.5234 秒后连接关闭。

所以我尝试了所有方法来增加php两边相关的变量限制,但还是一样,

知道还有什么可能限制连接吗?

注:

在 PHP:

post_max_size
upload_max_filesize

已经15M

并在 mysql 上:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

innodb_buffer_pool_size=10M
innodb_additional_mem_pool_size=10M
innodb_log_buffer_size=10M
innodb_thread_concurrency=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=NO_ENGINE_SUBSTITUTION
long_query_time=1
max_allowed_packet=500M
log-slow-queries=/var/log/mysql-slow-query.log

几个月前,我们遇到了大型 SOAP 请求的类似问题。经过几个小时的调查,我们发现 Transfer-Encoding-headers 有所不同。小请求使用 gzip 传输编码,大请求使用分块编码(您可以使用 Wireshark 或 SOAPUI 客户端检查)。

您是否对其他 SOAP 客户端(如 SOAPui)或仅对本机 SoapClient 有同样的问题?!如果您在任何 SOAP 客户端中收到错误,那么问题似乎是服务器端问题。我知道一些较旧的 nginx 版本在分块编码方面存在已知问题...

如果您仅在使用本机 SoapClient 时收到此错误:您是否使用跟踪参数启动了 SoapClient?因为我认为未知错误有这样的消息:"Error Fetching http body, No Content-Length, connection closed or chunked data":

try {
 $client=new SoapClient("your wsdl",array('trace'=>TRUE));
} catch(SoapFault $error) {
 print_r($error);
} 

如果您收到关于内容长度的错误,您可以通过设置协议版本来修复它:

$client = new SoapClient("your wsdl", 
    array(
        'trace' => 1,
        'stream_context' => stream_context_create(array('http' => array('protocol_version' => 1.0) ) )
        )
    );

如果问题与这些 server/client 端分块编码问题之一无关,请添加更多(服务器)信息。

在您的 soap 服务器幻灯片 php.ini 上尝试以下设置。确保根据您的情况调整参数。很可能这些应该没问题。

post_max_size = 1024M         ; Maximum size of POST data that PHP will accept.

max_execution_time = 7200     ; Maximum execution time of each script, in seconds

max_input_time = 7200         ; Maximum amount of time each script may spend parsing request data

memory_limit =1024M           ; Maximum amount of memory a script may consume

file_uploads = On             ; Whether to allow HTTP file uploads.

upload_max_filesize = 1024M   ; Maximum allowed size for uploaded files.

在服务器上,您可能希望添加:use_soap_error_handler(); 使服务器 return 如果错误源自服务器,则在其中包含错误消息的错误响应。

与 "SoapFault unknown error" 相比,这可能有助于您获得更好的错误消息。

    post_max_size = 1024M         ; Maximum size of POST data that PHP will accept.

max_execution_time = 7200     ; Maximum execution time of each script, in   seconds

max_input_time = 7200         ; Maximum amount of time each script may spend parsing request data

memory_limit =1024M           ; Maximum amount of memory a script may consume