在php中使用多卷曲来上传文件需要帮助

时间:2014-09-17 02:53:14

标签: php curl

我目前上传照片的脚本如下:

foreach($files as $file) {
    $data = base64_encode(file_get_contents($file));

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
}

我最多可以有1000个文件上传到远程服务器,curl处理所有内容可能需要很长时间。解决方案似乎是多卷曲,但有一个独特的方面:

我需要多卷曲来将响应保存到像$upload_results[] = array($file, 'response')

这样的数组中

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:0)

基本上,这可以通过在文件名为键的数组中创建句柄,然后将结果读入另一个具有相同键的数组来完成。

function uploadLotsOfFiles($files) {
    $mh = curl_multi_init();
    $handles = array();
    $results = array();

    foreach ($files as $file) {
        $handles[$file] = curl_init();
        curl_setopt($handles[$file], CURLOPT_RETURNTRANSFER, true);

        //File reading code and other options from your question go here

        curl_multi_add_handle($mh, $handles[$file]);
    }

    $running = 0;
    do {
        curl_multi_exec($mh, $running);
        curl_multi_select($mh); //Prevent eating CPU
    } while($running > 0);
    foreach($handles as $file => $handle) {
        $results[$file] = curl_multi_getcontent($handle);
        curl_multi_remove_handle($mh, $handle);
    }
    return $results;
}

如果你真的需要的结果是你指定的格式(我不建议这样做,因为它不如使用文件作为键那么优雅):

$results[] = array($file, curl_multi_getcontent($handle));

可用于代替$results[$file] = curl_multi_getcontent($handle);