gpt4 book ai didi

php 单 curl 有效但多 curl 不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:30 30 4
gpt4 key购买 nike

所以我在使用 ampps,然后切换到 z-wamp,认为它可以解决问题,但事实并非如此。

我在我的本地主机(localhost/site1 和 localhost/site2)中有单独的“站点”,我试图向其发送多 curl 请求,但由于某些奇怪的原因,它什么也没做!它仅在我对一个站点进行一次 curl 时才有效。这有效:

$ch = curl_init('http://localhost/site1/');
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => array('data' => $data)
));
$res = curl_exec($ch);
//yay!

另一方面,这不起作用:

...
//add a bunch of curl sessions
//to $this->sessions
...
$window = 15;
if (count($this->sessions) < $window)
$window = count($this->sessions);

$mh = curl_multi_init();

$site_map = array();

for ($i = 0; $i < $window; ++$i) {
curl_multi_add_handle($mh, $this->sessions[$i]);
$site_map[(string) $this->sessions[$i]] = $i;
}

$data_results = array();
$running = null;

do {
$execrun = curl_multi_exec($mh, $running);
} while ($execrun === CURLM_CALL_MULTI_PERFORM);

while ($running && $execrun === CURLM_OK) {

//the loop just keeps going forever from here

if (curl_multi_select($mh) !== -1) {
do {
$execrun = curl_multi_exec($mh, $running);
} while ($execrun === CURLM_CALL_MULTI_PERFORM);
}

if ($execrun !== CURLM_OK)
break;

//to here and never enters the loop below

while ($done = curl_multi_info_read($mh)) {

$output = curl_multi_getcontent($done['handle']);

if ($output)
$data_results[$site_map[(string) $done['handle']]] = $output;
else
$data_results[$site_map[(string) $done['handle']]] = null;

if (isset($this->sessions[$i]) && $i < count($this->sessions)) {
curl_multi_add_handle($mh, $this->sessions[$i]);
$site_map[(string) $this->sessions[$i]] = $i;
++$i;
}

unset($site_map[(string) $done['handle']]);
curl_multi_remove_handle($mh, $done['handle']);
curl_close($done['handle']);
}
}
curl_multi_close($mh);
return $data_results;

所以在上面的 multi curl 代码中,它开始运行,将句柄添加到 $mh,一旦执行,它将继续循环,永远不会进入 $done = curl_multi_info_read($mh) while 循环。同时它仍然运行良好并且 $running 始终等于 2。此外,curl_multi_info_read 将返回 false。所以它会一直循环下去。

我的 curl 扩展已启用(显然,如果单个 curl 有效),以下是来自 PHP Info 的详细信息:

cURL support    enabled
cURL Information 7.24.0
Age 3
Features
AsynchDNS Yes
Debug No
GSS-Negotiate No
IDN No
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host i386-pc-win32
SSL Version OpenSSL/1.0.0g
ZLib Version 1.2.5
libSSH Version libssh2/1.3.0

这到底是怎么回事?它可能与我的 PHP 配置有关吗? Apache 配置?我再次使用 z-wamp。

PHP 版本 5.3.10 Apache 版本 2.4.1赢 7 64 位将 PHP 目录添加到 PATH

编辑事实证明,这一定是某种我根本无法发现的 Apache/PHP 配置类型问题,因为我取消了 z-wamp 并安装了 wampserver,这次它起作用了。

最佳答案

我刚刚回答了另一个关于多个 curl 调用的问题。

这就是我为运行请求所做的全部工作。

do {
$status = curl_multi_exec($mh, $running);
} while ($status === CURLM_CALL_MULTI_PERFORM || $running);

然后我通过遍历我的 curl 处理程序数组来获取我需要的信息。

$returned = array();
foreach ($requests as $identifier => $request) {
$returned[$identifier] = curl_multi_getcontent($request);
curl_multi_remove_handle($mh, $request);
curl_close($request);
}

上述方法对我有用,但您似乎只想向 curl 多处理程序添加一定数量的 session 。我们或许可以将上面的 do-while 循环更改为以下内容:

do {
$status = curl_multi_exec($mh, $running);
if ($running < $window) {
for ($x = 0; $x < $window - $running; $x++) {
$index = count($site_map) + $x -1;
curl_multi_add_handle($mh, $this->sessions[$index]);
$site_map[(string) $this->sessions[$index]] = $index;
}
}
} while ($status === CURLM_CALL_MULTI_PERFORM || $running);

之后我们可以修改数据获取并将整个 while ($running && $execrun === CURLM_OK){} 部分替换为以下内容,因为它只会运行一次所有 curl 调用已处理:

$returned = array();
foreach ($this->sessions as $identifier => $request) {
$returned[$identifier] = curl_multi_getcontent($request);
curl_multi_remove_handle($mh, $request);
curl_close($request);
}

关于php 单 curl 有效但多 curl 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840688/

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