HTTP Posting 大字符串导致请求超时

Posted

技术标签:

【中文标题】HTTP Posting 大字符串导致请求超时【英文标题】:HTTP Posting large string results in request timeout 【发布时间】:2016-12-07 11:06:52 【问题描述】:

我的桌面应用程序是 HTTP 将数据发布到我的 Apache 服务器(与我的 php 脚本交互)。我正在发布大量数据(一个 800kb 大小的文件的内容)。

当我发送 HTTP 发布请求时,它超时并出现以下 Windows 错误:

ERROR_INTERNET_TIMEOUT 请求已超时

但如果我发送较小的文件,那么一切都很好,我的 PHP 脚本会处理发布请求。这可能是什么原因,我该如何解决这个问题?

我的网站是 WordPress,我已将我的 php.iniphp5.ini.user.ini 更改为都具有以下文本,但对于大文件仍然失败。

file_uploads = On
post_max_size = 128M
upload_max_filesize = 128M 

编辑:使用phpinfo(); 进行检查后(max_execution_time 是否应该在末尾有一个 S(秒数?):

max_execution_time 10 memory_limit 128M post_max_size 128M upload_max_filesize 128M max_input_nesting_level 64 max_input_time 10 max_input_vars 1000

C++ 代码:

TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
LPSTR accept[2] =  "*/*", NULL ;

HINTERNET hConnect = NULL, hSession = NULL, hRequest = NULL;
DWORD len = postData.length() * 2;
tstring formattedPostData(len, ' ');
InternetCanonicalizeUrl(postData.c_str(), &formattedPostData[0], &len, ICU_BROWSER_MODE);
std::replace(formattedPostData.begin(), formattedPostData.end(), '=', '~');
tstring authData = _T("usage=") + formattedPostData + _T("&auth=") + authToken;

hSession = InternetOpen(_T("uploader"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (!hSession) 
    output(_T("InternetOpen failed: %s\n"), getLastErrorAsString().c_str());
    res = S_UNDEFINED_ERROR.state;
    goto Cleanup;


hConnect = InternetConnect(hSession, domain.c_str(),
    INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
if (!hConnect) 
    output(_T("InternetConnect failed: %s\n"), getLastErrorAsString().c_str());
    res = S_UNDEFINED_ERROR.state;
    goto Cleanup;


hRequest = HttpOpenRequest(hConnect, _T("POST"),
    domainScript.c_str(), NULL, NULL, (LPCWSTR*)&accept, INTERNET_FLAG_NO_CACHE_WRITE, 1);
if (!hRequest) 
    output(_T("HttpOpenRequest failed: %s\n"), getLastErrorAsString().c_str());
    res = S_UNDEFINED_ERROR.state;
    goto Cleanup;


// Error occurs here
output(_T("Post: %s\n"), authData.c_str());
if (!HttpSendRequest(hRequest, hdrs, -1, (LPVOID)authData.c_str(), authData.size() * sizeof(TCHAR))) 
    // Error is 12002: timeout
    output(_T("HttpSendRequest failed: %d.\n"), GetLastError());
    res = S_UNDEFINED_ERROR.state;

    char responseText[1024]; 
    DWORD responseTextSize = sizeof(responseText);

    output(_T("Res: %d\n"), HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, &responseText, &responseTextSize, NULL));
    output(_T("Response: %s\n"), responseText);

    goto Cleanup;

【问题讨论】:

检查错误日志并告诉我。 也许这可以帮助你:max_input_time @Saching。我检查了错误日志,今天没有条目。 php.ini 中的 max_execution_time 是多少? @Saching。它的 10,查看我的编辑,显示一些 phpinfo() 属性 【参考方案1】:

您是否尝试过增加脚本超时时间?

http://php.net/manual/en/function.set-time-limit.php

您还在将文件或文本块复制粘贴到文本区域或类似内容中吗?

【讨论】:

我的桌面应用程序将文件内容作为一个长字符串发布。例如; fileContents=abc....&auth=abc 作为 http 帖子还是获取?还有你发送的字符串里面有什么奇怪的字符吗? 它是一个帖子,它是 urlencoded,但我还必须将文件 = 字符替换为 ~ 字符,以免与帖子格式冲突 好酷 - 您是否使用表单来发送数据?你设置了enctype吗? w3schools.com/tags/att_form_enctype.asp你有我们可以查看的代码示例吗? 在更新 .ini 文件时,您是否重新启动了 http 服务器?

以上是关于HTTP Posting 大字符串导致请求超时的主要内容,如果未能解决你的问题,请参考以下文章

返回非常大的字符串时.asmx 请求超时

PHP curl 上传大文件非常大慢,导致超时,小文件(10M以下)的还可以,请问如何解决啊!

Heroku PHP - 从 Heroku 服务器到自身的 file_get_contents 导致 H12 请求超时

PHP大文件分片上传/多线程上传

PHP大文件分片上传/多线程上传

b/s 大文件分片上传处理