打开数以千计的cURL句柄而不会遇到问题? (PHP)

时间:2010-11-27 05:54:07

标签: php curl libcurl

我需要在PHP中使用cURL来向API发出数千的cURL请求。我目前的计划是与curl_multi_()函数并行执行这些操作。基本上可以同时并行执行所有数千个cURL请求。

我听说你可能会遇到打开太多句柄的内存问题,这可能会导致致命的错误。如何避免这种情况并尽可能快地提出我的URL请求?

如果我需要一次限制cURL请求的数量,那么将限制设置为什么是好的?

背景:我现在与Godaddy共享托管,这对cURL请求没问题,但我没有用数千个并行请求测试它。将来,我将会使用Rackspace Cloud Site来处理适度负载。

这大量的cURL请求是每年一次的事情,而不是每日网站运营的一部分。

4 个答案:

答案 0 :(得分:5)

这听起来像是一个建筑问题。为什么你需要同时发出数千个请求?那种parellism会不会有任何好处,或者你是不是偶然会遇到DOS(拒绝服务)一些可疑的Web服务/ API?

假设您没有敲击单个远程服务器,您仍需要担心本地盒可以处理多少个连接。只有很多端口你可以使用传出,它们的测量成本低至数万。如果你疯狂地打开连接,就不难达到这个限制。任何使用apachebench过度负载测试的人都知道这一点。

PHP对于这种事情来说不是一个很好的工具 - 我是一个90%PHP的人。没有线程,而且内存密集。如果你想并行1000个PHP进程,那么你将需要多台机器。你的典型PHP进程将消耗大约10-20兆内存,除非你调整它的地狱(可能在编译时。)

你说这种情况每年发生一次。这让我觉得可能没有必要那个parellel。如果您只有24或36个并行进程怎么办?

那就是说,我可能会这样做。 PHP可能会正常工作,如果你遇到内存效率低下的问题,你可以换掉一个部分。您需要两个或多或少的异步队列,以及一对可以处理它们的进程:

  • “获取队列” - 需要进行的HTTP请求的工作队列。他们执行请求并将数据粘贴到处理队列中(参见下一个项目符号)。

  • “处理队列”工作队列,通过HTTP响应包含的任何内容。在处理队列时,它可以将新项目添加到“获取队列”

  • 在获取队列上并行运行的某个进程(或几十个)。并行性在这里很不错,因为由于网络而导致延迟太多。

  • 一些咀嚼“处理队列”的过程 - 并不清楚并行性会对此有所帮助。所有这些处理都在本地进行,可能是一个简单的循环。

答案 1 :(得分:1)

结帐Rolling Curl。我用它从多个网页页面中提取链接和网页内容。我不知道这将如何在服务器上工作,因为我只在本地机器上体验。

答案 2 :(得分:1)

timdev建议的所有内容都包含在Zebra cURL https://github.com/stefangabos/Zebra_cURL中。你可以传递一个URL数组,它会并行排队一些(默认值为10),然后调用它们并将结果对象传递给回调。来自github文档:

    <?php
        function callback($result) {
            // remember, the "body" property of $result is run through
            // "htmlentities()", so you may need to "html_entity_decode" it
            // show everything
            print_r('<pre>');
            print_r($result->info);
        }
        require 'path/to/Zebra_cURL.php';
        // instantiate the Zebra_cURL class
        $curl = new Zebra_cURL();
        // cache results 60 seconds
        $curl->cache('cache', 60);
        // get RSS feeds of some popular tech websites
        $curl->get(array(
            'http://rss1.smashingmagazine.com/feed/',
            'http://allthingsd.com/feed/',
            'http://feeds.feedburner.com/nettuts',
            'http://www.webmonkey.com/feed/',
            'http://feeds.feedburner.com/alistapart/main',
        ), 'callback');
    ?>

内存使用非常快速和甜蜜

答案 3 :(得分:0)

确实没有足够的信息。每个连接将使用多少带宽?除非有几个字节,否则你会扼杀多数连接,同时打开那么多套接字。即使你的帐户有上限,你的1000插槽的想法也会瓶颈并且变得毫无意义。为什么你不能打开100个套接字并完成循环。这是非常快的