2017-08-10 3 views
0

私は現在、いくつかのデータをまとめて、ローカルWebサーバー(Apache 2.4.27)にPOSTリクエストをしています。HTTP 100のコンティニューコードを送受信した後にcURLがハングするのはなぜですか?

ここで私は一緒にリクエストを入れている方法は次のとおりです。

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は最初にヘッダーを送信し、continueの応答を参照して、データを送信する必要があります。

クライアントはHTTP/1.1 100 Continueを受信したものの、タイムアウトすることがわかります。

タイムアウト時間を5分に設定しようとしましたが、タイムアウトまでハングアップします。

アイデア?

編集:I'vedがしようとすると設定されていないためにcontinue期待を強制的に

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

を使用しようとしました。応答は同じで、ちょうどExpect: ...の部分がありません。

+0

"0 bytes ** received **"と表示され、おそらくそれが鍵です。それは非常にうまくすべてのバイトを送ったかもしれませんが、何も受け取っていません...(まあ、 "100続行"の後) –

答えて

1

いくつかの理論があります.1:おそらくカールのバグです。 2:サーバーが読み込みを停止し、受信バッファーが完全に実行され、サーバーが読み込まれるのを待ってカールし、決して起こらないサーバーのバグかもしれません... 3:おそらく接続が遅く、 2645588バイトの送信には実際に5分以上かかります。

あなたはそれがどんな手がかりが得られていない場合は、あなたが作成することができ

$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; 
     } 
)); 
  • のように、これがうまくいけば、除外または理論2と3を確認することができ、転送速度をチェックするCURLOPT_PROGRESSFUNCTIONを追加する必要がありますPOSTリクエストを手動でsocket_create &と一緒に手動で実行しましたが、私はあなたに今見せてくれる例はありません(圧縮されたbtrfsパーティション上のいくつかの他のスクリプトフォルダを誤って削除したため、 ()
関連する問題