Curl::getMultiUser PHP Method

getMultiUser() public static method

[getMultiUser 多进程获取用户数据]
public static getMultiUser ( [type] $user_list ) : [type]
$user_list [type]
return [type]
    public static function getMultiUser($user_list)
    {
        $ch_arr = array();
        $text = array();
        $len = count($user_list);
        $max_size = $len > 5 ? 5 : $len;
        $requestMap = array();
        $mh = curl_multi_init();
        for ($i = 0; $i < $max_size; $i++) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_URL, 'http://www.zhihu.com/people/' . $user_list[$i] . '/about');
            curl_setopt($ch, CURLOPT_COOKIE, self::genCookie());
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            $requestMap[$i] = $ch;
            curl_multi_add_handle($mh, $ch);
        }
        $user_arr = array();
        do {
            while (($cme = curl_multi_exec($mh, $active)) == CURLM_CALL_MULTI_PERFORM) {
            }
            if ($cme != CURLM_OK) {
                break;
            }
            while ($done = curl_multi_info_read($mh)) {
                $info = curl_getinfo($done['handle']);
                $tmp_result = curl_multi_getcontent($done['handle']);
                $error = curl_error($done['handle']);
                $user_arr[] = array_values(getUserInfo($tmp_result));
                //保证同时有$max_size个请求在处理
                if ($i < sizeof($user_list) && isset($user_list[$i]) && $i < count($user_list)) {
                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_HEADER, 0);
                    curl_setopt($ch, CURLOPT_URL, 'http://www.zhihu.com/people/' . $user_list[$i] . '/about');
                    curl_setopt($ch, CURLOPT_COOKIE, self::$user_cookie);
                    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36');
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                    $requestMap[$i] = $ch;
                    curl_multi_add_handle($mh, $ch);
                    $i++;
                }
                curl_multi_remove_handle($mh, $done['handle']);
            }
            if ($active) {
                curl_multi_select($mh, 10);
            }
        } while ($active);
        curl_multi_close($mh);
        return $user_arr;
    }

Usage Example

Exemplo n.º 1
0
/**
 * [getOnePageUserList 如果关注的用户只有一页的处理]
 * @param  [type] $result    [description]
 * @param  [type] $u_id      [description]
 * @param  string $user_type [description]
 * @param  [type] $count     [description]
 * @return [type]            [description]
 */
function getOnePageUserList($result, $u_id, $user_type = 'followees', $count, $u_name, $op_type)
{
    $follow_user_list = array();
    $user_list = array();
    preg_match_all('#<h2 class="zm-list-content-title"><a data-tip=".*?" href="http://www.zhihu.com/people/(.*?)" class="zg-link" title="(.*?)">#', $result, $out);
    $user_list = Curl::getMultiUser($out[1]);
    for ($i = 0; $i < $count; $i++) {
        if ($user_type == 'followees') {
            $user = array('', $u_id, $u_name, empty($out[1][$i]) ? '' : $out[1][$i], empty($out[2][$i]) ? '' : $out[2][$i]);
        } else {
            $user = array('', empty($out[1][$i]) ? '' : $out[1][$i], empty($out[2][$i]) ? '' : $out[2][$i], $u_id, $u_name);
        }
        array_push($follow_user_list, $user);
    }
    User::addMulti($user_list);
    if (!empty($follow_user_list) && $op_type == 2) {
        echo "--------adding " . count($follow_user_list) . " {$u_id}'s {$user_type} user--------\n";
        User::addFollowList($follow_user_list);
        echo "--------adding " . count($follow_user_list) . " {$u_id}'s {$user_type} user done--------\n";
    }
    return $follow_user_list;
}