gpt4 book ai didi

php - 在PHP中异步处理多个GET请求

转载 作者:行者123 更新时间:2023-12-03 13:04:00 25 4
gpt4 key购买 nike

对于使用PHP,我是一个新手,对于当前的项目,我正在运行一个外部API,该API从各种服务器返回ping结果。然后,我使用此信息在网页上显示“实时”事件。

一次为所有服务器运行一个请求将花费几分钟的时间来返回结果,因此我想将每个服务器作为一个单独的请求进行分解。但是,创建foreach循环并循环访问每个服务器的单个请求仍不会在循环完成之前返回结果。

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

使用PHP可以轻松实现吗?我只需要发送一个AJAX调用,获取结果并将其发布到数据库即可。但是,我确实需要一遍又一遍不断地运行它。

注意:
我使用的是PHP 5.5.12版,并曾尝试过短暂尝试冒险pthreads的方法,但它似乎破坏了我的MSSQL线程安全驱动程序并暂时杀死了我的Web应用程序。我猜这可能不是一个很简单的过程。

最佳答案

由于$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

}

即使在执行完所有url之后仍然显示结果,输入我的60多个服务器地址数组,仍使我返回大约10秒钟左右的响应时间,而响应时间大约为一分钟(对于每个服务器一次ping)。

正是我所需要的。

关于php - 在PHP中异步处理多个GET请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37717092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com