惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
有赞技术团队
有赞技术团队
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
月光博客
月光博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog

博客园 - 随机

10周年整 年中review Javascript 模块化开发上线解决方案 AMDJS编译工具 第三方组件接入方案(演示文稿图片) 代码打包预处理工具 manifest资源提取工具 也来山寨一版Flappy Bird (js版) 2014 todo list 2013年终总结 #1分钟删# 模块合并小工具 移动端页面前端提速的技术梳理 状态机——Javascript词法扫描示例 [整理] ES5 词法约定文档树状图 [转]给明年依然年轻的我们:欲望、外界、标签、天才、时间、人生目标、现实、后悔、和经历 javascript基础组件设计资料 2013 草莓音乐节妹子抓拍 [组图] 键盘按键事件的fireEvent 错觉
php并发请求
随机 · 2013-07-28 · via 博客园 - 随机

一般在php进行请求url的时候,直接用 fopen 函数就可以搞定了,比如像这样:

$file=fopen("http://www.cnblogs.com","r") or exit("");
$ret="";

while (!feof($file)){
    $ret=$ret.fgetc($file);
}
fclose($file);

echo $ret;

当然,也可以直接用 socket 方式,自己定义好http头参数手动实现:

$host="www.cnblogs.com";
$port=80;

$content="GET / HTTP/1.1\r\n".
    "Accept: */*\r\n".
    "Connection: Keep-Alive\r\n".
    "Host: $host";

$fp = fsockopen($host, $port, $errno, $errstr, 30);
if ($fp) {
    fwrite($fp, $content);
    while (!feof($fp)) {
        $ret.=fgets($fp, 128);
    }
    fclose($fp);
}
echo $ret;

但这些请求方式都是阻塞的,如果需要同时进行多请求的话,就得借助于curl了。

其实php下可以有两种方式使用curl,一种是直接用exec函数调用命令式的curl,这个没什么多说的,跟直接命令使用没什么区别,只是被放在php里调用了而已。

php自己也对 curl 进行了包装,这里我们需要使用到 curl_multi_ 的一些方法实现:

function curl_multi_request ($query_arr) {
    $ch = curl_multi_init();
    $count = count($query_arr);
    $ch_arr = array();
    for ($i = 0; $i < $count; $i++) {
        $query_string = $query_arr[$i];
        $ch_arr[$i] = curl_init($query_string);
        curl_setopt($ch_arr[$i], CURLOPT_RETURNTRANSFER, true);
        curl_multi_add_handle($ch, $ch_arr[$i]);
    }
    $running = null;
    do {
        curl_multi_exec($ch, $running);
    } while ($running > 0);
    for ($i = 0; $i < $count; $i++) {
        $results[$i] = curl_multi_getcontent($ch_arr[$i]);
        curl_multi_remove_handle($ch, $ch_arr[$i]);
    }
    curl_multi_close($ch);
    return $results;
}

核心就是循环地调用 curl_multi_exec 方法来并发地进行url请求即可。

谢谢。