PHP cURL转换为GuzzleHttp
请问,如何将以下代码转换为异步HTTP? 通过这种方式,php正在等待每个查询的返回PHP cURL转换为GuzzleHttp,php,curl,Php,Curl,请问,如何将以下代码转换为异步HTTP? 通过这种方式,php正在等待每个查询的返回 while ($p = pg_fetch_array($var)) { $url = "https://url"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($c
while ($p = pg_fetch_array($var)) {
$url = "https://url";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$headers = array("Content-Type: application/json");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$data = '{"s1":"s1","number":"'.$p['number'].'"}';
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);
}
下面是一个使用本机函数的工作示例。具体而言:
现在,如何将代码cUrl转换为GuzzleHttp?PHP不支持async
/wait
。默认情况下,它也不支持多线程,您需要配置您的PHP安装(如果需要,包括从源代码编译)启用pthreads
。PHP持续缺乏对异步性的支持是Node.JS今天如此流行的原因之一:web开发人员从PHP迁移到了JS+NodeJS+等。这是对其他语言供应商的警告:接受最新的范式转变,否则将被谴责为Java或Cobol。现在没有人想像Java一样。@Dai对Postgres不太确定,但PHP的MySQLi支持异步,例如,这将以并行异步方式运行3个SELECT查询:$db->query(“SELECT 1”,MySQLi_async | MySQLi_STORE_RESULT)$db->query(“选择1”,MYSQLI_异步,MYSQLI_存储结果)$db->query(“选择1”,MYSQLI_异步,MYSQLI_存储结果)$db->eaw_async_query()$db->eaw_async_query()$db->eaw_async_query()
(不幸的是,PDO不支持异步。如果你想在PHP中与MySQL一起使用异步,你需要使用MySQLi,而不是PDO-在我看来,这是MySQLi唯一比PDO:async支持更好的地方。)@hanshenrik对,但这不是PHP做的,这是MySQL客户端管理自己的线程。。这可能是一个安全风险!不要为curl_multi使用busylop,下载时它将使用100%的cpu(1个内核),这是没有充分理由的。改为:对于(;){curl_multi_exec($multiHandle,$stillRunning);如果($stillRunning<1){/*所有下载已完成*/break;}其他{/*一些句柄仍在下载,请睡眠等待数据到达*/curl_multi_select($multiHandle,1)}
-它将使用大约1-2%的cpu,并且不会变慢。
<?php
$urls = ['https://example.com/', 'https://google.com'];
$handles = [];
foreach ($urls as $url) {
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$handles[] = $handle;
}
$multiHandle = curl_multi_init();
foreach ($handles as $handle) {
curl_multi_add_handle($multiHandle, $handle);
}
for(;;){
curl_multi_exec($multiHandle, $stillRunning);
if($stillRunning > 0){
// some handles are still downloading, sleep-wait for data to arrive
curl_multi_select($multiHandle);
}else{
// all downloads completed
break;
}
}
foreach ($handles as $handle) {
$result = curl_multi_getcontent($handle);
var_dump($result);
curl_multi_remove_handle($multiHandle, $handle);
}
curl_multi_close($multiHandle);