Разделение больших файлов с помощью PHP - PullRequest
10 голосов
/ 22 марта 2011

Я хочу разделить огромные файлы (точнее, файлы tar.gz) на несколько частей из кода php.Основной причиной для этого является ограничение php в 2 ГБ в 32-битной системе.

ТАК Я хочу разделить большие файлы на несколько частей и обрабатывать каждую часть отдельно.

Возможно ли это?Если да, то как?

Ответы [ 9 ]

9 голосов
/ 22 марта 2011

За мой комментарий проголосовали дважды, так что, возможно, мое предположение было на что-то: P

Если в среде Unix, попробуйте это ...

exec('split -d -b 2048m file.tar.gz pieces');

Раскол

Ваши штуки должны быть pieces1, pieces2 и т. Д.

Вы можете легко получить число полученных кусков, используя stat() в PHP, чтобы получить размер файла, а затем выполнить простую математическую операцию (int) ($stat['size'] / 2048*1024*1024) (я думаю).

8 голосов
/ 22 марта 2011

Простой метод (если используется сервер на базе Linux) - использовать команду exec и выполнить команду split:

exec('split Large.tar.gz -b 4096k SmallParts'); // 4MB parts
/*    |     |            |      | |
      |     |            |______| |
      App   |                 |   |_____________
            The source file   |                 |
                              The split size    Out Filename
*/

Подробнее см. Здесь: http://www.computerhope.com/unix/usplit.htm

Или вы можете использовать: http://www.computerhope.com/unix/ucsplit.htm

exec('csplit -k -s -f part_ -n 3 LargeFile.tar.gz');

PHP работает в одном потоке, и единственный способ увеличить количество потоков - создать дочерний процесс с помощью команд fork.

Это не дружественный ресурс. Я бы посоветовал взглянуть на язык, который может сделать это быстро и эффективно. Я бы предложил использовать node.js.

Просто установите узел на сервере, а затем создайте небольшой скрипт, например, под названием node_split, который может выполнить работу самостоятельно.

Но я настоятельно советую вам не использовать PHP для этой работы, а использовать exec, чтобы позволить операционной системе хоста сделать это.

3 голосов
/ 22 марта 2011
1 голос
/ 13 июля 2015
$handle = fopen('source/file/path','r'); 
        $f = 1; //new file number
        while(!feof($handle))
        {
            $newfile = fopen('newfile/path/'.$f.'.txt','w'); //create new file to write to with file number
            for($i = 1; $i <= 5000; $i++) //for 5000 lines
            {
                $import = fgets($handle);
                //print_r($import);
                fwrite($newfile,$import);
                if(feof($handle))
                {break;} //If file ends, break loop
            }
            fclose($newfile);
            $f++; //Increment newfile number
        }
        fclose($handle);
1 голос
/ 28 февраля 2013
function split_file($source, $targetpath='/split/', $lines=1000){

    $i=0;
    $j=1;
    $date = date("m-d-y");
    $buffer='';

    $handle = fopen ($_SERVER['DOCUMENT_ROOT'].$source, "r");

    while (!feof ($handle)) {
        $buffer .= fgets($handle, 4096);
        $i++;
        if ($i >= $lines) {
            $fname = $_SERVER['DOCUMENT_ROOT'].$targetpath."part_".$date.$j.".txt";

                 $fhandle = fopen($fname, "w") or die($php_errormsg);

            if (!$fhandle) {
                echo "Cannot open file ($fname)";
                //exit;
            }


            if (!fwrite($fhandle, $buffer)) {
                echo "Cannot write to file ($fname)";
                //exit;
            }
            fclose($fhandle);
            $j++;
            $buffer='';
            $i=0;
            $line+=10; // add 10 to $lines after each iteration. Modify this line as required
        }
    }
    fclose ($handle);
}
1 голос
/ 22 марта 2011

PHP сам по себе не может быть в состоянии ... Если вы можете понять, как это сделать из командной строки вашего компьютера, Затем вы сможете выполнить эти команды, используя exec();

0 голосов
/ 01 сентября 2017

Разделения именуются как filename.part0 filename.part1 ...

<?php
function fsplit($file,$buffer=1024){
    //open file to read
    $file_handle = fopen($file,'r');
    //get file size
    $file_size = filesize($file);
    //no of parts to split
    $parts = $file_size / $buffer;

    //store all the file names
    $file_parts = array();

    //path to write the final files
    $store_path = "splits/";

    //name of input file
    $file_name = basename($file);

    for($i=0;$i<$parts;$i++){
        //read buffer sized amount from file
        $file_part = fread($file_handle, $buffer);
        //the filename of the part
        $file_part_path = $store_path.$file_name.".part$i";
        //open the new file [create it] to write
        $file_new = fopen($file_part_path,'w+');
        //write the part of file
        fwrite($file_new, $file_part);
        //add the name of the file to part list [optional]
        array_push($file_parts, $file_part_path);
        //close the part file handle
        fclose($file_new);
    }    
    //close the main file handle

    fclose($file_handle);
    return $file_parts;
}
?>
0 голосов
/ 22 марта 2011

Это, вероятно, было бы возможно в php, но php был создан для веб-разработки, и попытка выполнения всей этой операции в одном запросе приведет к тайм-ауту запроса.

Однако вы можете использовать другой язык, например java илиc # и создайте фоновый процесс, о котором вы можете уведомить php для выполнения операции.Или даже запустить из php, в зависимости от настроек безопасности на хосте.

0 голосов
/ 22 марта 2011
  • Если вы хотите разделить файлы, которые уже находятся на сервере, вы можете сделать это (просто используйте функции файла fread, fopen, fwrite, fseek для чтения / записи части файла).
  • Если вы хотите разбить файлы, загруженные с клиента, боюсь, вы не сможете.
...