curl_multi_exec 显示不同的运行

2023-12-25

我只使用curl_multi_exec() 来处理5 个url。 现在我有这个奇怪的问题。当我在 xampp 上运行我的代码时,它运行完美。我可以看到 $running 值初始化为 5,然后不断减少。 。 但是,当我在其他本地主机(在arm架构上)上尝试它时,$running被初始化为0。 所以我的curl_multi_exec()永远不会返回任何响应。

这是代码片段:

do {
curl_multi_exec($master,$running);
echo "<pre>";
var_dump($running );
echo "</pre>";
} while($running > 0);

这是我的整个代码:

    $nodes = array( 'https://www.example.com',
            'https://www.example2.com',
            'https://www.example3.com',
            'https://www.example4.com',
            'https://www.example5.com'
            );
    $node_count = count($nodes);

    $curl_arr = array();
    $master = curl_multi_init();
    for($i = 0; $i < $node_count; $i++)
    {
    $url =$nodes[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);  
    }

    do {
   curl_multi_exec($master,$running);
   echo "<pre>";
   var_dump($running );
   echo "</pre>";
   } while($running > 0);


   for($i = 0; $i < $node_count; $i++)
   {
    $results = curl_multi_getcontent($curl_arr[$i]);
    var_dump($results);
    }

我用谷歌搜索了一些东西,并了解到curl ssl可能是一个问题。因此,我安装了另一个本地主机(在 ARM 上),并启用了 openssl 和curl ssl。 现在我有两个启用了 SSL 的不同本地主机(均适用于 ARM),此代码片段在一个本地主机上工作正常,但在另一个本地主机上不起作用。

不知怎的,我需要“另一个”,因为它有更多的功能。

有人请指导这个 $running 初始化可能存在什么问题吗?

如有任何帮助,我们将不胜感激:)

也尝试过这个,但没有成功

                                    <?php

            // echo "<meta http-equiv='refresh' content='3'/>" ;

                include_once ("simple_html_dom.php");
                libxml_use_internal_errors(true);

            function get_string_between($string, $start, $end){
                $string = ' ' . $string;
                $ini = strpos($string, $start);
                if ($ini == 0) return '';
                $ini += strlen($start);
                $len = strpos($string, $end, $ini) - $ini;
                return substr($string, $ini, $len);
            }

            function multi_thread_curl($url_array, $number_threads) {
             $curl_array = array_chunk($url_array, $number_threads, $preserve_keys = true);
            //Iterate through each batch of urls.
            foreach($curl_array as $threads) {
                //Create your cURL resources.
                foreach($threads as $key=>$value) {
                ${'ch' . $key} = curl_init();
                curl_setopt(${'ch' . $key}, CURLOPT_URL, $value);
                curl_setopt(${'ch' . $key}, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt(${'ch' . $key}, CURLOPT_RETURNTRANSFER, true);
                curl_setopt(${'ch' . $key}, CURLOPT_TIMEOUT, 10);

                }
                //Create the multiple cURL handler.
                $mh = curl_multi_init();

                //Add the handles.
                foreach($threads as $key=>$value) {

                curl_multi_add_handle($mh, ${'ch' . $key});

                }

                $active = null;

                //execute the handles.
                do {

                $mrc = curl_multi_exec($mh, $active);

                } while ($mrc == CURLM_CALL_MULTI_PERFORM);

                while ($active && $mrc == CURLM_OK) {
                    echo $active;

                    if (curl_multi_select($mh) != -1) {
                        do {

                            $mrc = curl_multi_exec($mh, $active);

                        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                    }
                }
                //Get your data and close the handles.
                foreach($threads as $key=>$value) {
                $results[$key] = curl_multi_getcontent(${'ch' . $key});
                curl_multi_remove_handle($mh, ${'ch' . $key});
                }
                //Close the multi handle exec.
                curl_multi_close($mh);
            }
            return $results;
            }
            $nodes = array( 'https://www.example1.com',
                            'https://www.example2.com',
                            'https://www.example3.com',
                            'https://www.example4.com',
                            'https://www.example5.com',
                            );
            $node_count = count($nodes);
            echo "results: ";
            $number_threads = 5;
            $results = multi_thread_curl($nodes, $number_threads);
            print_r($results);
            echo 'done';


            ?>

这里的问题是:$active is always 5。永远循环:(


这是我使用 PHP.net 中的示例组合而成的多线程卷曲函数。我已经使用这个函数来获取大量的 URL。它确实能够加快速度。我在这方面取得了巨大的成功。

您甚至可以对其进行扩展并为您的curl 选项添加参数。

function multi_thread_curl($url_array, $number_threads) {


$curl_array = array_chunk($url_array, $number_threads, $preserve_keys = true);

    //Iterate through each batch of urls.
    foreach($curl_array as $threads) {

        //Create your cURL resources.
        foreach($threads as $key=>$value) {

        ${'ch' . $key} = curl_init();

        curl_setopt(${'ch' . $key}, CURLOPT_URL, $value);
        curl_setopt(${'ch' . $key}, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt(${'ch' . $key}, CURLOPT_RETURNTRANSFER, true);
        curl_setopt(${'ch' . $key}, CURLOPT_TIMEOUT, 10);

        }


        //Create the multiple cURL handler.
        $mh = curl_multi_init();

        //Add the handles.
        foreach($threads as $key=>$value) {

        curl_multi_add_handle($mh, ${'ch' . $key});

        }

        $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);
            }

        }

        //Get your data and close the handles.
        foreach($threads as $key=>$value) {

        $results[$key] = curl_multi_getcontent(${'ch' . $key});

        curl_multi_remove_handle($mh, ${'ch' . $key});

        }

        //Close the multi handle exec.
        curl_multi_close($mh);

    //Limits to one group of threads.
    //break;

    }


    return $results;



}

$urls = array(

  'https://en.wikipedia.org/wiki/Wiki'

);


$results = multi_thread_curl($urls, 1);

print_r($results);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

curl_multi_exec 显示不同的运行 的相关文章

  • 如何用javascript正确读取php cookies

    考虑这个 php 和 javascript 代码 然后我在控制台中看到的是 utma 111872281 291759993 1444771465 1445374822 1445436904 4 utmz 111872281 1444771
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 在Windows 7上安装curl后缺少libcurl-4.dll

    按照这个人的安装curl后指示 https stackoverflow com a 28757477 1186038 除了第 2 步 已安装Win64 OpenSSL v1 0 1u 轻型相反 因为下载页面中缺少版本 k http slpr
  • 如何从字符串中删除所有数字?

    我想删除字符串 0 9 中的所有数字 我写了这段有效的代码 words preg replace 0 words remove numbers words preg replace 1 words remove numbers words
  • php下拉菜单人口

    我正在尝试编写一个 php 脚本 该脚本将根据主下拉菜单的选择填充第二个下拉菜单 我想使用 jquery 来完成所有非页面刷新的事情 但我发现现有的所有东西都很难理解和修改 你知道有什么写得很好且易于理解的东西吗 或者可能是现有的教程 下面
  • 检查文件权限

    我怎样才能检查file permissions 无需通过运行操作系统特定命令passthru or exec Use 文件权限 http php net fileperms功能 clearstatcache echo substr spri
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • 来自本地 XML 的模拟 SoapClient 响应

    我想用文件中的 XML 来模拟 SoapClient 的响应 我如何创建一个 stdClass 对象 就像 SoapClient 从文件返回一样 客户端已经包装了 SoapClient 因此可以轻松模拟响应 我的模拟是这样的 soapCli
  • jquery上传完成后重定向到新页面

    我正在尝试让这个 jquery 工具与我的网站一起使用以进行文件上传 https github com blueimp jQuery File Upload https github com blueimp jQuery File Uplo
  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • 创建 Facebook 测试用户时访问令牌出现问题

    我正在尝试为我的 Facebook 应用程序创建测试用户 他们在 11 月份的博客文章 http developers facebook com blog post 429 中宣布了此功能 并在此处记录了该功能 http developer
  • 删除 woocommerce 店面主页标题 php

    我正在使用 woocommerce 的店面主题 我需要用 php 删除主页标题 h1 我知道 css 解决方案 但我不想使用它 因为我想将 h1 添加到该页面的其他位置 并且在一个页面中包含 2 个 h1 对 seo 不利页 我也知道删除页
  • jruby 的路边(卷曲)?

    我正在尝试将curl 与jruby 结合使用来获得网页 文件的一些响应时间 通常在 ruby 中这不会是一个问题 我可以安装 gem gem install junction 一切都很好 遏制似乎与 jruby 不兼容 那么有没有一种替代方
  • 具有更改用户代理上下文的 file_get_contents 不起作用

    我正在尝试获取页面的阅读数和点赞数 网址是 https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg 您必
  • 如何在 Twitter Card 中传递动态图像路径?

    我在用
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • 合并 url 中的 2 个输入值

    我有这样的形式
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f

随机推荐