php - php 丢失 curl 句柄参考
问题描述
在代码片段的底部,我试图从多手柄中移除卷曲手柄。然而 PHP 报告它是一个无效的 curl 句柄。curl_close 调用报告了同样的事情。我很困惑,因为我没有在那个点以上关闭它。
我会在任何地方丢失它吗?没看懂在哪...
foreach ($urls as $url) {
$request = [];
$request['url'] = $url;
$request['body'] = '';
$request['response_headers'] = [];
$request['curl_handle'] = curl_init();
$url['config'] = json_decode($url['config'], true);
if($url['config']['method'] == 'GET') {
curl_setopt($request['curl_handle'], CURLOPT_HTTPGET, true);
}
curl_setopt($request['curl_handle'], CURLOPT_URL, $url['source_url']);
curl_setopt($request['curl_handle'], CURLOPT_WRITEFUNCTION, function($curl, $body) use (&$request) {
$request['body'] .= $body;
return strlen($body);
});
curl_setopt($request['curl_handle'], CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$request) {
$request['response_headers'][] = $header;
return strlen($header);
});
$followRedirects = boolval($url['config']['follow_redirects']);
curl_setopt($request['curl_handle'], CURLOPT_FOLLOWLOCATION, $followRedirects);
curl_setopt($request['curl_handle'], CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($request['curl_handle'], CURLOPT_TIMEOUT, 120);
curl_setopt($request['curl_handle'], CURLOPT_MAXREDIRS, intval($url['config']['total_redirects']));
curl_setopt($request['curl_handle'], CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($request['curl_handle'], CURLOPT_MAXFILESIZE, intval($url['config']['max_download']));
curl_setopt($request['curl_handle'], CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($request['curl_handle'], CURLOPT_SSL_VERIFYPEER, false);
$requests[] = &$request;
}
$mh = curl_multi_init();
//add the handles
foreach ($requests as &$request) {
curl_multi_add_handle($mh, $request['curl_handle']);
}
$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
print('after exec');
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
$mrc = curl_multi_exec($mh, $active);
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
print('performing again');
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
if ($mrc != CURLM_OK) {
print("Curl multi read error $mrc\n");
}
foreach ($requests as &$request) {
processResponse($request);
curl_multi_remove_handle($mh, $request['curl_handle']);
curl_close($request['curl_handle']);
}
curl_multi_close($mh);
解决方案
可能您需要更改以下几行:
foreach ($requests as &$request) {
processResponse($request);
curl_multi_remove_handle($mh, $request['curl_handle']);
curl_close($request['curl_handle']);
}
至
foreach ($requests as &$request) {
processResponse($request);
curl_close($request['curl_handle']);
curl_multi_remove_handle($mh, $request['curl_handle']);
}
推荐阅读
- python - Python 中函数指针的指针设计模式 (PDP) 是什么?
- python - 不在数据库中保存电子邮件字段
- list - Haskell:函数原型的问题,用于在列表中查找元素的位置
- flutter - 如何使用flutter agora插件截屏?
- r - 防止数据表列宽改变大小闪亮
- javascript - Google Docs 如何在 Google 文档中添加气泡卡/链接预览/展开外部资源?
- javascript - 为什么我不能在 Javascript 中访问此对象的元素?
- javascript - 如何编辑现有链接的元素并打开链接的编辑版本?(不保存在本地)
- java - 在孩子的父母第一个自定义键盘上调用 removeView()
- javascript - JavaScript - 无法取消选择按钮而不导致页面重新加载