在PHP

时间:2016-06-09 04:54:17

标签: php multithreading asynchronous

我很擅长使用PHP和当前项目我正在运行一个外部API,它返回来自各种服务器的ping结果。然后,我使用此信息在网页上显示“实时”事件。

一次运行所有服务器的请求将需要几分钟才能返回结果,因此我想将每个服务器拆分为单独的请求。但是,创建一个foreach循环并循环遍历每个服务器的单个请求仍然没有返回结果,直到循环结束。

我现在认为我最好的选择是设置某种异步处理(多线程)函数,以便在它自己的独立线程上发出每个请求。

PHP很容易实现吗?我只需要发送一个AJAX调用,获取结果并发布到数据库。但是,我确实需要一遍又一遍地运行它。

注意: 我正在使用PHP版本5.5.12,并尝试短暂尝试pthreads的路径,但它似乎打破了我的MSSQL线程安全驱动程序,并暂时杀死我的Web应用程序。我猜这可能不是一个相当简单的过程。

1 个答案:

答案 0 :(得分:1)

感谢$Dagon的建议,我决定冒险走curl_multi的道路。利用php.net网站上的示例,我添加了以下功能:

function multiCurl( $res, $options="" ) {

    if( count( $res ) <= 0 ) return False;

    $handles = array();

    if( !$options ) // add default options

        $options = array(
            CURLOPT_HEADER          => 0,
            CURLOPT_RETURNTRANSFER  => 1
        );


    // add curl options to each handle
    foreach( $res as $k => $row ) {

        $ch{$k} = curl_init();
        $options[CURLOPT_URL] = $row['url'];
        $opt = curl_setopt_array( $ch{$k}, $options );
        //var_dump( $opt );
        $handles[$k] = $ch{$k};

    }

    $mh = curl_multi_init();

    // add handles
    foreach( $handles as $k => $handle ) {

        $err = curl_multi_add_handle( $mh, $handle );

    }

    $running_handles = null;


    do {

        curl_multi_exec( $mh, $running_handles );
        curl_multi_select( $mh );

    } while( $running_handles > 0 );


    foreach( $res as $k=>$row ) {

        $res[$k]['error'] = curl_error( $handles[$k] );

        if( !empty( $res[$k]['error'] ) ) {

            $res[$k]['data']  = '';

        } else {

            $res[$k]['data']  = curl_multi_getcontent( $handles[$k] );  // get results

        }

        // close current handler
        curl_multi_remove_handle( $mh, $handles[$k] );

    }

    curl_multi_close( $mh );

    return $res; // return response

}

即使在执行完所有网址后仍然显示结果,但是我的60多个服务器地址数组中的数据仍然大约为10秒左右,相比大约一分钟(每个服务器一次ping一次) )。

正是我所需要的。