Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP cURL转换为GuzzleHttp_Php_Curl - Fatal编程技术网

PHP cURL转换为GuzzleHttp

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

请问,如何将以下代码转换为异步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($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);