我必须废弃一个网站,我需要获取多个URL,然后逐个处理它们.目前的过程有点像这样.

我从此页面获取基本URL并获取所有辅助URL,然后为每个辅助URL我获取该URL,处理找到的页面,下载一些照片(这需要相当长的时间)并将此数据存储到数据库,然后获取下一个URL并重复这个过程.

在这个过程中,我认为我在每次迭代开始时浪费一些时间来获取辅助URL.所以我试图在处理第一次迭代时并行获取下一个URL.

我想到的解决方案是,从主进程调用PHP脚本,比如下载器,它将下载所有URL(使用curl_multi或wget)并将它们存储在某个数据库中.

我的问题是

>如何异步调用这样的downloder,我不希望我的主脚本等到downloder完成.
>存储下载数据的任何位置,例如共享内存.当然,除了数据库.
>存储和检索时数据是否有可能被破坏,如何避免这种情况?
>另外,如果有人有更好的计划,请指导我.

当我听到有人使用curl_multi_exec时,通常会发现他们只是用100个网址加载它,然后在完成后等待,然后全部处理它们,然后用接下来的100个网址重新开始…怪我,我是这样做,但后来我发现有可能在某些事情仍在进行时删除/添加curl_multi的句柄,并且它确实节省了大量时间,特别是如果你重用已经打开的连接.我写了一个小型库来处理带回调的请求队列;我当然不是在这里发布完整版本(“小”仍然是相当多的代码),但这里有一个简化版本,主要给你一般的想法:
public function launch() {
    $channels = $freeChannels = array_fill(0,$this->maxConnections,NULL);
    $activeJobs = array();
    $running = 0;
    do {
        // pick jobs for free channels:
        while ( !(empty($freeChannels) || empty($this->jobQueue)) ) {
            // take free channel,(re)init curl handle and let
            // queued object set options
            $chId = key($freeChannels);
            if (empty($channels[$chId])) {
                $channels[$chId] = curl_init();
            }
            $job = array_pop($this->jobQueue);
            $job->init($channels[$chId]);
            curl_multi_add_handle($this->master,$channels[$chId]);
            $activeJobs[$chId] = $job;
            unset($freeChannels[$chId]);
        }
        $pending = count($activeJobs);

        // launch them:
        if ($pending > 0) {
            while(($mrc = curl_multi_exec($this->master,$running)) == CURLM_CALL_MULTI_PERFORM);
                // poke it while it wants
            curl_multi_select($this->master);
                // wait for some activity,don't eat cpu
            while ($running < $pending && ($info = curl_multi_info_read($this->master))) {
                // some connection(s) finished,locate that job and run response handler:
                $pending--;
                $chId = array_search($info['handle'],$channels);
                $content = curl_multi_getcontent($channels[$chId]);
                curl_multi_remove_handle($this->master,$channels[$chId]);
                $freeChannels[$chId] = NULL;
                    // free up this channel
                if ( !array_key_exists($chId,$activeJobs) ) {
                    // impossible,but...
                    continue;
                }
                $activeJobs[$chId]->onComplete($content);
                unset($activeJobs[$chId]);
            }
        }
    } while ( ($running > 0 && $mrc == CURLM_OK) || !empty($this->jobQueue) );
}

在我的版本中,$jobs实际上是单独的类,而不是控制器或模型的实例.他们只处理设置cURL选项,解析响应并调用给定的回调onComplete.
使用此结构,只要池中的某些内容完成,新请求就会立即启动.

当然,如果不只是检索需要时间而且处理也不会真正拯救你……而且它并不是真正的并行处理.但我仍然希望它有所帮助.

总结

以上是DEVMAX为你收集整理的使用PHP并行下载页面全部内容。

如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

使用PHP并行下载页面的更多相关文章

  1. ios – 如何处理退款/取消应用内购买

    我正在尝试处理iOS的退款应用内购买.但我找不到明确的指导方针来做到这一点.所以我有一个会员类型的应用程序内购买功能,其中用户凭据不一定与itunes帐户绑定.当有人进行购买时,我可以参考哪种标识符,并且当他们通过苹果申请退款时具有相同的标识符?我需要立即取消会员资格.谢谢!解决方法我最终存储了收据字符串并运行cron来完成事务并查找取消字段.

  2. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  3. 简析Swift和C的交互

    之前好像简单说过Swift和Objective-C的交互问题。其实我们也可以用Swift调用纯C代码或者基于C的第三方库。)Swift官方文档中,以及那本已经被迅速翻译为中文的ibooks书中,都提到了Swift调用Objective-C和C是有很好支持的。本内容包括Swift调用C和相应的C调用Swift,项目混编。对于C来说,最头疼的莫过于指针,而Swift是一门没有指针的语言。这些标准库函数表示为Darwin.C.HEADER.name。实际上由于Swift模块结构是平坦的,他们均位于Darwin中

  4. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  5. swift接口的使用

    swiftAPI的使用最近楼主要使用swift的API接口,楼主有一个习惯,不管开发需要用到什么知识,都喜欢看官方文档,虽然大部分是英文,但是用起来还是感觉可靠,不过对于openstack给的swiftAPI接口,可叫我吃了不少苦,所以写下这篇文章希望给有同样困惑的朋友帮助。获得的结果如下:%Total%Received%XferdAverageSpeedTimeTimeTimeCurrentDloadUploadTotalSpentLeftSpeed10013771001282100959382695-

  6. 尝试使用swift mailer,gmail smtp,php发送邮件

    这里是我的代码:在运行时出现此错误…

  7. swift – 如果存在管道,则通过NSTask终止cURL

    我试图在Swift中为一个简单的命令行批处理脚本同步读取URL的内容.为了简单起见,我使用cURL–我知道如果必须的话,我可以使用NSURLSession.我也在使用OSX上的Swift开源版本进行swift构建.问题是,在某些URL上,如果stdout已重定向到管道,则NSTask永远不会终止.但是,如果删除管道或更改URL,则任务成功.使用来自终端的curl直接运行任何示例都会成功,因此在从特

  8. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  9. jQuery的Cookie封装,与PHP交互的简单实现

    下面小编就为大家带来一篇jQuery的Cookie封装,与PHP交互的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部