CURL作为下载管理器,在PHP中显示多个连接和进度

时间:2009-10-23 14:41:24

标签: php curl download

我想使用PHP的CURL扩展来创建某种下载管理器,我在想如果CURL允许实现我正在考虑的这两个功能:

1)多个连接或多部分下载,就像普通的桌面应用程序下载管理器一样。

2)不断更新屏幕(文本或图形,无关紧要)下载进度。

PHP的CURL是否允许这样做?如果是这样,请注意提供一些提示吗?

5 个答案:

答案 0 :(得分:6)

对于所有“PHP不适合多任务”的批评者:

退一步,如果你处于LAMP环境中,可以考虑使用一个非常棒的多线程框架。使用这个基础架构对您有利 - 即Apache是​​多线程管理器 - 并且在那个方面非常好。

设置PHP以在此环境中工作非常容易。

  
      
  1. 设置max_execution_time = 0以允许脚本无限期运行
  2.   
  3. 设置ignore_user_abort = true以允许脚本在运行后运行   客户已中止
  4.   

设计轻量级单任务REST Web服务。以这样的方式设计它们,使得它们在返回时不关心,例如在队列类型系统中。写入队列是线程安全的,如果使用某些基本的OS级别的互斥锁,则从队列中删除是线程安全的。

“分叉”Web服务就像打开文件一样简单:

fclose(fopen("http://somewebservice....php?a1=v1&a2=v2&....")); // Launch a web service and continue...

这种方法不仅是多线程的,而且它本身也是分布式的。 Web服务可以位于本地或位于世界各地。 PHP肯定不关心。

对于一个基本系统,唯一可以阻止你的是apache允许的线程数。否则,您的代码已准备好利用负载平衡以及高级Apache实现所提供的所有其他巧妙技巧。

当开发人员认为“多线程”他们认为“OMG我必须处理分叉和执行,等待和PID”时,很多时候。如果你以这种方式设计你的系统 - 你是对的,它会很快变得非常复杂。退后一步,使用给出的内容。你有权访问目录吗?繁荣 - 你有队列。你可以发出网络电话?繁荣 - 你有一个多线程(分布式)应用程序。现在,只需将这些概念合并到您的应用程序中即可。

答案 1 :(得分:1)

PHP不是多线程的,如果你试图通过多个文件调用或分叉来强制它,结果通常是次优的。我建议不要这样做,但是,有可能用js,php(虽然可能不是curl但是自定义的php file stream)和long polling

混合使用这样的东西。

答案 2 :(得分:0)

有可能,请看一下curl_multi_init();

答案 3 :(得分:0)

curl_multi_xyz()函数与curl_multi_exec()一样,允许您同时处理多个请求。如果要并行下载同一文件的多个部分,还可以查看CURLOPT_RANGE。 您可以使用CURLOPT_READFUNCTIONCURLOPT_WRITEFUNCTION设置的回调函数允许您向客户端发送某种进度数据。

答案 4 :(得分:0)

不,不是这种情况。这是不可能的,因为下载管理器调用处理下载5次的类 - 即PHP类实例。

这是一个示例类调用:

$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming);