PHP cURL同步和异步

PHP cURL同步和异步,php,curl,asynchronous,Php,Curl,Asynchronous,我想在一个项目中使用PHP cURL,在一个场景中,我需要通过cURL发送数据并等待响应(并延迟所有代码,直到在cURL请求中收到响应)-同步请求,我还想在另一个场景中异步发送数据,而不是等待cURL请求完成 是否有一个cURL参数或函数可以用来异步发送数据,而不必等待来自目标URL的响应来继续代码执行 下面是我的代码,默认情况下,请求是同步的,脚本将等待来自目标URL的响应发送 $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl

我想在一个项目中使用PHP cURL,在一个场景中,我需要通过cURL发送数据并等待响应(并延迟所有代码,直到在cURL请求中收到响应)-同步请求,我还想在另一个场景中异步发送数据,而不是等待cURL请求完成

是否有一个cURL参数或函数可以用来异步发送数据,而不必等待来自目标URL的响应来继续代码执行

下面是我的代码,默认情况下,请求是同步的,脚本将等待来自目标URL的响应发送

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result = curl_exec($ch);
curl_close($ch);
我的应用程序有两种情况:

1) 数据需要传递到辅助服务器,一旦确认服务器收到数据,就继续在我的应用程序中执行代码

2) 数据被传递到辅助服务器,但传递的信息并不重要,因此我们不需要等待服务器接收到数据的确认才能继续。
谢谢

下面是一个PHP示例,介绍如何异步使用curl:

<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();

// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//create the multiple cURL handle
$mh = curl_multi_init();

//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
//execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>


Curl始终是同步的。你唯一能做的就是将超时设置为一个很低的数字,或者在另一个线程上使用execute启动curl请求。你需要解释你的异步用例,以便更好地了解你的选项。例如,异步操作DOESE不需要立即完成(即在脚本执行过程中),您可以考虑建立一个排队机制,在这里只需向队列中添加一个项并继续操作。但是,如果您需要在脚本执行期间完成操作(但本质上希望并行工作),则可能需要研究从主进程派生该请求。@MikeBrant我已在文章底部添加了一些详细信息。我们需要一个异步请求,以便在等待目标服务器响应cURL请求时,其他代码(来自同一脚本)的执行不会暂停/延迟。@DarkBee-您能告诉我如何使用exec启动另一个线程吗?基本上,我认为如果我们这样做,发送cURL请求的脚本中的代码执行将不会延迟,主代码将完成它的工作,然后次线程将管理cURL响应。@NVG如果信息与脚本执行无关,为什么不将数据放入队列中进行服务呢?