我想使用PHP的CURL扩展来创建某种下载管理器,我想如果CURL允许实现我正在考虑的这两个功能:
1)多个连接或多部分下载,就像普通的桌面应用程序下载管理器一样.
2)不断更新屏幕(文本或图形,无关紧要)下载进度.
CURL for PHP是否允许这样做?如果是这样,请注意提供一些提示?
对于所有"PHP不适合多任务处理"的评论家:
退一步,如果你处于LAMP环境中,可以考虑使用一个非常棒的多线程框架.使用这个基础架构对您有利 - 即Apache是多线程管理器 - 而且该死的很好.
设置PHP以在此环境中工作非常容易.
- 设置max_execution_time = 0以允许脚本无限期运行
- 设置ignore_user_abort = true以允许脚本在客户端中止后运行
设计轻量级单任务REST Web服务.以这样的方式设计它们,使得它们在返回时不关心,例如在队列类型系统中.写入队列是线程安全的,如果使用某些基本操作系统级别的互斥锁,则从队列中删除是线程安全的.
"分叉"Web服务就像打开文件一样简单:
fclose(fopen("http://somewebservice....php?a1=v1&a2=v2&....")); // Launch a web service and continue...
这种方法不仅是多线程的,而且它本身也是分布式的.Web服务可以位于本地或位于世界各地.PHP肯定不关心.
对于基本系统来说,唯一可以阻止你的是apache允许的线程数.否则,您的代码已准备好利用负载平衡以及高级Apache实现所提供的所有其他巧妙技巧.
很多时候,当开发人员认为"多线程"他们认为"OMG我必须处理分叉和执行,等待和PID".如果你以这种方式设计你的系统 - 你是对的,它会很快变得非常复杂.退后一步,使用给出的内容.你有权访问目录吗?繁荣 - 你有队列.你可以发出网络电话?繁荣 - 你有一个多线程(分布式)应用程序.现在只需在您的应用程序指示时将这些概念合并在一起.
curl_multi_xyz() 函数curl_multi_exec()允许您同时处理多个请求。另请注意CURLOPT_RANGE您是否想并行下载同一文件的多个片段。您可以设置回调函数,CURLOPT_READFUNCTION并CURLOPT_WRITEFUNCTION允许您向客户端发送某种进度数据。