天天看點

php curl http狀态碼100解決辦法

基礎知識背景:

“Expect: 100-continue”的來龍去脈:

HTTP/1.1 協定裡設計 100 (Continue) HTTP 狀态碼的的目的是,在用戶端發送 Request Message 之前,HTTP/1.1 協定允許用戶端先判定伺服器是否願意接受用戶端發來的消息主體(基于 Request Headers)。

即, Client 和 Server 在 Post (較大)資料之前,允許雙方“握手”,如果比對上了,Client 才開始發送(較大)資料。

這麼做的原因是,如果用戶端直接發送請求資料,但是伺服器又将該請求拒絕的話,這種行為将帶來很大的資源開銷。

libcurl 發送大于1024位元組資料時啟用“Expect:100-continue‘特性:

在使用 curl 做 POST 的時候,當要 POST 的資料大于 1024 位元組的時候,curl 并不會直接就發起 POST 請求,而是會分為兩步:
1. 發送一個請求,包含一個 "Expect: 100-continue" 頭域,詢問 Server 是否願意接收資料;
2. 接收到 Server 傳回的 100-continue 應答以後,才把資料 POST 給 Server;      

PHP Curl-library 可以主動封禁此特性:

PHP curl 遵從 libcurl 的特性。由于不是所有 web servers 都支援這個特性,是以會産生各種各樣的錯誤。如果你遇到了,可以用下面的指令封禁”Expect”頭域:

<?php
    //添加如下head頭就可傳輸大于1024位元組請求
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));