php - 为什么 cURL 在发送和接收 HTTP 100 继续代码后挂起,而不是继续处理正文?

标签 php curl

我目前正在整理一些数据并向我的本地 Web 服务器 (Apache 2.4.27) 发出 POST 请求。

以下是我整理请求的方式:

public function sendPost($url, array $data) {
    $ch = curl_init($url);
    $httpCodes = parse_ini_file(CONF::HTTP_CODES_INI);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 30);
    curl_setopt($ch, CURLOPT_TIMEOUT , 30);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, ['data' => json_encode($data)]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    //Ignore SSL issues, testing on a dev box
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    $curlInfo = curl_getinfo($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    $curlInfo["http_code"] = $httpCode . ': ' . $httpCodes[$httpCode];
    if ($result === false || $httpCode > 299) {
        $result = json_encode($curlInfo);
    }
    curl_close($ch);
    return $result;
}

这是我从 cURL 看到的对话

*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to my.local.server.com (127.0.0.1) port 80 (#0)
> POST /path/script.php?action=receive HTTP/1.1
Host: my.local.server.com
Accept: */*
Content-Length: 2645588
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------051580b0f5143de8

< HTTP/1.1 100 Continue
* Operation timed out after 30000 milliseconds with 0 bytes received
* Curl_http_done: called premature == 1
* Closing connection 0

但是,在服务器上调试脚本时,我确实获得了数据,并且请求似乎一直在进行。根据我对 HTTP 100 Continue 状态代码的理解,cURL 应该只先发送 header ,查看 Continue 响应,然后发送数据。

您可以在上面看到客户端收到 HTTP/1.1 100 Continue,但随后超时。

我尝试将超时时间设置为 5 分钟,但它仍然挂起直到超时。

有什么想法吗?

编辑:我尝试过使用

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

尝试强制不设置继续期望。响应是相同的,只是没有 Expect: ... 部分。

最佳答案

有一些理论,1:可能是curl 中的一个错误。 2:可能是服务器中的错误,服务器停止读取,并且接收缓冲区已满,curl 等待服务器读取,这永远不会发生,并且超时... 3:也许您的连接速度很慢,发送 2645588 字节确实需要 5 分钟以上。

您应该添加一个 CURLOPT_PROGRESSFUNCTION 来检查传输速度,这有望排除或确认理论 2 和 3,例如

$starttime = microtime ( true );
curl_setopt_array ( $ch, array (
        CURLOPT_NOPROGRESS => false,
        CURLOPT_PROGRESSFUNCTION => function ($ch, int $expectedDownloadBytes, int $bytesDownloaded, int $expectedUploadBytes, int $bytesUploaded) use (&$starttime): int {
            var_dump ( 'runtime seconds:', microtime ( true ) - $starttime, 'uploaded so far:', $bytesUploaded, 'expected to upload:', $expectedUploadBytes );
            return 0;
        } 
) );
  • 如果这没有产生任何线索,您可以使用 socket_create & co 手动创建 POST 请求,但我现在没有示例可以向您展示(由于有时意外删除了一些杂项脚本文件夹)回来,在压缩的 btrfs 分区上,我尝试恢复它们,但什么也没有:( )

关于php - 为什么 cURL 在发送和接收 HTTP 100 继续代码后挂起,而不是继续处理正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622863/

相关文章:

php - 随着目标集的增长,循环哈希能否保持一致?

php - 我的标记技术是否正确?

php - Setcookie 没有创建 cookie

php - 带有 PHP 和 cURL 的 Paypal API

php - 设置一个 cookie 供 cURL 使用

r - 为 curl 请求构建等效的 R 请求

PHP + SSH : Interactive Shell

php - Nginx 将所有请求从子目录重定向到另一个子目录根目录

ruby-on-rails - Curl::Error::Partial File Error: 传输部分文件错误

forms - 如何访问在 multipart/form-data POST 中上传的内容数据?