作為第三方開發商,經常會需要調用平台接口,遠程調用,就要用到curl,其實質就是叫調用的方法與用到的參數以http post的方式發送至平台服務器。
簡單的例子:
$url = 'http://'; //調用接口的平台服務地址
$post_string = array('a'=>'b');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$result = curl_exec($ch);
curl_close($ch);
其實CURLOPT_POSTFIELDS的這個設置中,亦可以直接發送數組的,但是這樣做的后果是嚴重增加的請求的時間,耗時大約在2秒多,同樣的操作用socket方式操作則正常,在毫秒級別。
若將此處:curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
修改為:curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
則執行時間恢復正常
PS:
http_build_query — 生成 URL-encode 之后的請求字符串
說明
string http_build_query ( array $formdata [, string $numeric_prefix ] )
使用給出的關聯(或下標)數組生成一個經過 URL-encode 的請求字符串。參數 formdata 可以是數組或包含屬性的對象。一個 formdata 數組可以是簡單的一維結構,也可以是由數組組成的數組(其依次可以包含其它數組)。如果在基礎數組中使用了數字下標同時給出了 numeric_prefix 參數,此參數值將會作為基礎數組中的數字下標元素的前綴。這是為了讓 PHP 或其它 CGI 程序在稍后對數據進行解碼時獲取合法的變量名。
Note:
用 arg_separator.output 來分隔參數。
Example #1 http_build_query() 使用示例
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor'
);
echo http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor
?>
Example #2 http_build_query() 使用數字下標的元素
<?php
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
echo http_build_query($data);
echo http_build_query($data, 'myvar_');
?>