脚本宝典收集整理的这篇文章主要介绍了使用PHP并行下载页面,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我从此页面获取基本URL并获取所有辅助URL,然后为每个辅助URL我获取该URL,处理找到的页面,下载一些照片(这需要相当长的时间)并将此数据存储到数据库,然后获取下一个URL并重复这个过程.
在这个过程中,我认为我在每次迭代开始时浪费一些时间来获取辅助URL.所以我试图在处理第一次迭代时并行获取下一个URL.
我想到的解决方案是,从主进程调用PHP脚本,比如下载器,它将下载所有URL(使用curl_multi或wget)并将它们存储在某个数据库中.
我的问题是
>如何异步调用这样的downloder,我不希望我的主脚本等到downloder完成.
>存储下载数据的任何位置,例如共享内存.当然,除了数据库.
>存储和检索时数据是否有可能被破坏,如何避免这种情况?
>另外,如果有人有更好的计划,请指导我.
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.
使用此结构,只要池中的某些内容完成,新请求就会立即启动.
当然,如果不只是检索需要时间而且处理也不会真正拯救你……而且它并不是真正的并行处理.但我仍然希望它有所帮助.
以上是脚本宝典为你收集整理的使用PHP并行下载页面全部内容,希望文章能够帮你解决使用PHP并行下载页面所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。