上传文件时出现 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
运行 两台服务器,服务器 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