我想使用PHP的CURL扩展来创建某种下载管理器,我在想如果CURL允许实现我正在考虑的这两个功能:
1)多个连接或多部分下载,就像普通的桌面应用程序下载管理器一样。
2)不断更新屏幕(文本或图形,无关紧要)下载进度。
PHP的CURL是否允许这样做?如果是这样,请注意提供一些提示吗?
答案 0 :(得分:6)
对于所有“PHP不适合多任务”的批评者:
退一步,如果你处于LAMP环境中,可以考虑使用一个非常棒的多线程框架。使用这个基础架构对您有利 - 即Apache是多线程管理器 - 并且在那个方面非常好。
设置PHP以在此环境中工作非常容易。
- 设置max_execution_time = 0以允许脚本无限期运行
- 设置ignore_user_abort = true以允许脚本在运行后运行 客户已中止
醇>
设计轻量级单任务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_READFUNCTION
和CURLOPT_WRITEFUNCTION
设置的回调函数允许您向客户端发送某种进度数据。
答案 4 :(得分:0)
不,不是这种情况。这是不可能的,因为下载管理器调用处理下载5次的类 - 即PHP类实例。
这是一个示例类调用:
$tr = new teConnections();
$data = $tr->downloadManager(array('http', 'host', path', 'login', 'pass', 'port'), 'file name, compression, streaming);