gpt4 book ai didi

php - 如何将额外数据存储到多 curl 信息处理程序中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:02:45 25 4
gpt4 key购买 nike

我无法在多 curl 场景中找到有关特定 curl 句柄的更多信息。这是代码。

$job_count = 5;
while ( $eachPr = $prList->fetch () ) {


for ( $job_number = 1 ;
$job_number <= $job_count ;
$job_number ++ , $index ++ ) {


$url = $this->getURL ( $eachPr[ "name" ] ,
$eachPr[ "category" ] ) ;

$this->log ( $url ) ;



$curl_handle = curl_init () ;

curl_setopt ( $curl_handle ,
CURLOPT_USERAGENT ,
$userAgent ) ;
curl_setopt ( $curl_handle ,
CURLOPT_URL ,
$url ) ;
curl_setopt ( $curl_handle ,
CURLOPT_FAILONERROR ,
TRUE ) ;
curl_setopt ( $curl_handle ,
CURLOPT_FOLLOWLOCATION ,
TRUE ) ;
curl_setopt ( $curl_handle ,
CURLOPT_AUTOREFERER ,
TRUE ) ;
curl_setopt ( $curl_handle ,
CURLOPT_RETURNTRANSFER ,
TRUE ) ;

curl_setopt ( $curl_handle ,
CURLOPT_COOKIE ,
$cookie ) ;
var_dump($curl_handle);

/* add a request to the multiple handle */
curl_multi_add_handle ( $multi_handler ,
$curl_handle ) ;
$eachPr = $prList->fetch () ;
}


do {
while ( ($execrun = curl_multi_exec ( $multi_handler ,
$running )) == CURLM_CALL_MULTI_PERFORM ) ;
if ( $execrun != CURLM_OK ) {
break ;
}
/* a request was just completed -- find out which one */
while ( $done = curl_multi_info_read ( $multi_handler ) ) {

/* get the info and content returned on the request */
$info = curl_getinfo ( $done[ 'handle' ] ) ;
$output = curl_multi_getcontent ( $done[ 'handle' ] ) ;
var_dump($info);
/* send the return values to the thread waiting to process the data .
$this->work_pool[] = $this->submit ( new PrStacker ( $eachPr[ "name" ] ,
$eachPr[ "id" ] ,
$output ) ) ;

$this->work_pool[ count ( $this->work_pool ) - 1 ]->wait () ;


/* remove the curl handle that just completed */
curl_multi_remove_handle ( $multi_handler ,
$done[ 'handle' ] ) ;


}

/* Block for data in / output; error handling is done by curl_multi_exec */
if ( $running ) {
curl_multi_select ( $multi_handler ,
30 ) ;
}
} while ( $running ) ;


/* write the current index to the file */
file_put_contents ( $symbols_index_file ,
$index ) ;

$sleep_interval = rand ( 5 ,
10 ) ;

$this->log ( " Sleeping Now For " . $sleep_interval . " seconds" ) ;

sleep ( $sleep_interval ) ;

$index ++ ;
}
curl_multi_close ( $multi_handler ) ;

所以在这里,我使用 while ( $eachPr = $prList->fetch () ) 循环遍历 11K 产品的列表。然后一次服用 5 个产品,我正在初始化我添加到 curl 多句柄的 curl 句柄。

句柄在 do while 循环中执行。选择刚刚使用 $done = curl_multi_info_read ( $multi_handler ) 完成的请求后,问题来了。每个响应都传递给另一个处理其他任务的线程。每个线程都需要产品名称、产品 ID 和原始 html 响应。这是每个堆垛机的初始化方式

$this->work_pool[] = $this->submit ( new PrStacker ( $eachPr[ "name" ] ,
$eachPr[ "id" ] ,
$output ) ) ;

但是在完成每个 curl 请求后,我无法找到一种方法来发送与已完成请求相对应的正确产品名称和 ID。在上面的代码中,当我将名称、ID 和输出传递给 PrStacker 线程时,我意识到它不是与完成的请求相对应的正确产品。它是传递给线程的不同且错误的产品。

那么有什么方法可以让我在执行每个 curl 句柄/请求之前包含产品名称和 ID,以便程序可以识别哪个响应对应于哪个产品。我希望我的解释能被理解。

如果有任何方法可以做到这一点,请告诉我。

最佳答案

将私有(private)数据存储在 cURL easy handle 中,例如产品编号:

curl_setopt($curl_handle, CURLOPT_PRIVATE, $this->getId());
// then later
$id = curl_getinfo($done['handle'], CURLINFO_PRIVATE);

此“私有(private)数据”功能直到 2015 年初才记录在 PHP 手册中。它已在 PHP 5.2.4 中引入。它允许您在 cURL 句柄中存储和检索您选择的字符串。将其用作唯一标识产品的 key /ID,您可以使用它在自己的数据结构中查找产品。

参见:curl_getinfocurl's Predefined Constants .

关于php - 如何将额外数据存储到多 curl 信息处理程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24267397/

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