// 只需返回HTTP header
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回结果,而不是输出它
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
// 有重定向的HTTP头信息吗?
if (preg_match("!Location: (.*)!", $output, $matches)) {
echo "$test_name: redirects to $matches[1]n";
} else {
echo "$test_name: no redirectionn";
}
}
echo "nn";
}
用POST方法发送数据
当发起GET请求时,数据可以通过查询字串(query string)传递给一个URL:
http://www.google.com/search?q=demo
这种情况下你可能并不需要cURL来模拟 。把这个URL丢给“file_get_contents()”就能得到相同结果 。
不过有一些HTML表单是用POST方法提交的 。这种表单提交时,数据是通过 HTTP请求体(request body) 发送,而不是查询字串 。例如,当使用CodeIgniter论坛的表单,无论你输入什么关键字,总是被POST到如下页面:
http://cc.com/a/b/
你可以用PHP脚本来模拟这种URL请求 。首先,新建一个可以接受并显示POST数据的文件,我们给它命名为post_output.php:
print_r($_POST);
接下来,写一段PHP脚本来执行cURL请求:
以下为引用的内容:
$url = "http://localhost/post_demo.php";
$post_data = https://www.isolves.com/it/cxkf/yy/php/2019-08-20/array (
"foo" => "bar",
"query" => "demo",
"action" => "Submit"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 我们在POST数据哦!
curl_setopt($ch, CURLOPT_POST, 1);
// 把post的变量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
这段脚本发送一个POST请求给 post_demo.php,这个页面 $_POST 变量并返回输出 。
文件上传
上传文件和前面的POST十分相似 。因为所有的文件上传表单都是通过POST方法提交的 。
首先新建一个接收文件的页面,命名为 upload_info.php:
print_r($_FILES);
以下为引用的内容:
$url = "http://localhost/upload_info.php";
$post_data = https://www.isolves.com/it/cxkf/yy/php/2019-08-20/array (
"foo" => "bar",
// 要上传的本地文件地址
"upload" => "@C:/wamp/www/a.zip"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
文章插图
如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加上@符号 。执行这段脚本应该会得到如下输出:
cURL批处理(multi cURL)
cURL还有一个高级特性——批处理句柄(handle) 。这一特性允许你同时或异步地打开多个URL连接 。
下面是来自来自php.net的示例代码:
以下为引用的内容:
// 创建两个cURL资源
$ch1 = curl_init();
$ch2 = curl_init();
// 指定URL和适当的参数
【CURL功能原来这么强大,PHP大神都在用】curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
// 创建cURL批处理句柄
$mh = curl_multi_init();
// 加上前面两个资源句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
// 预定义一个状态变量
$active = null;
// 执行批处理
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// 关闭各个句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
这里要做的就是打开多个cURL句柄并指派给一个批处理句柄 。然后你就只需在一个while循环里等它执行完毕 。
这个示例中有两个主要循环 。第一个 do-while 循环重复调用 curl_multi_exec()。这个函数是无隔断(non-blocking)的,但会尽可能少地执行 。它返回一个状态值,只要这个值等于常量 CURLM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做(例如,把对应URL的http头信息发送出去) 。也就是说,我们需要不断调用该函数,直到返回值发生改变 。
推荐阅读
- 小红书|贵价丛中过钱包抖三抖?才发现原来平价也可以出奇迹!
- 保洁大妈:情侣住酒店,最好先开手机摄像功能再开灯,不然会吃亏
- 微信多开,不用任何插件
- 手机为什么不再需要内存卡了,其原因你知道吗,原来都在这里
- 手机自动亮度调节功能,是省电还是费电?
- 手机内存不够用,微信才是“内存杀手”?这个默认功能最好要关掉
- 手机分屏哪家强,OPPOColorOS 最新分屏功能教你做人
- 使用华为手机拍照,这3个照片编辑功能要知道,能让照片好看几倍
- 如何利用手机的HDR功能来拍照
- 华为S5700交换机设置IP-MAC绑定功能