12
votes

Split gros fichiers en utilisant php

Je veux diviser énormes fichiers (pour être spécifique, tar.gz fichiers) dans plusieurs parties du code PHP. Raison principale de faire cela est que la limite de 2 Go de PHP sur le système 32bit.

Donc, je veux diviser les gros fichiers en plusieurs parties et traiter chaque partie séparément.

est-ce possible? Si oui, comment?


3 commentaires

C'est pas une tâche pour PHP. Quel système d'exploitation êtes-vous sur?


SPLIT -B -B 2048 m File.TAR.GZ Morceaux Utilisation EXEC () ?


@alex très intéressant ....


9 Réponses :


0
votes
  • Si vous voulez diviser des fichiers qui sont déjà sur le serveur, vous pouvez le faire (utilisez simplement les fonctions de fichier Fread, fopen, fwrite, fsek à lire / écrire partie du fichier).
  • si vous voulez fichiers divisés qui sont téléchargés de Le client, je crains que vous ne puissiez pas.

0 commentaires

1
votes

php elle-même pourrait ne pas être capable de ... Si vous pouvez déterminer comment procéder à la ligne de commande de votre ordinateur, Vous devriez être capable d'exécuter ces commandes à l'aide de exécuté ();


1 commentaires

EXEC pourrait être désactivé pour de nombreux hôtes partagés afin de ne pas fonctionner pour moi



0
votes

Ceci serait probablement possible dans PHP, mais PHP a été construit pour le développement Web et qui tente de toute cette opération dans une demande entraînera le délai de demande.

Vous pouvez cependant utiliser une autre langue comme Java ou C # et créer un processus d'arrière-plan que vous pouvez notifier à partir de PHP pour effectuer l'opération. Ou même exécuter de PHP, en fonction de vos paramètres de sécurité sur l'hôte.


0 commentaires

3
votes

1 commentaires

Je pense que cela ne fonctionnera pas comme PHP sur le système 32bits ne peut même pas fopen des fichiers de plus de 2 Go.



10
votes

Mon commentaire a été voté à deux reprises, alors je suppose que ma suppose était sur quelque chose: p

Si sur un environnement UNIX, essayez-le ... p>

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


1 commentaires

Très intéressant .. Vaut certainement la peine d'être plus intéressante ... +1 pour le concept



9
votes

Une méthode simple (si vous utilisez le serveur basé sur Linux) consiste à utiliser la commande exécutée code> et à exécuter la commande scindinal code>: xxx pré>

Voir ici pour plus de détails: http://www.computerhope.com/unix/usplit.htm p>

ou vous pouvez utiliser: http: //www.computerhope. COM / UNIX / UCSPLIT.HTM P>

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


2 commentaires

EXEC pourrait être désactivé pour de nombreux hôtes partagés afin de ne pas fonctionner pour moi


C'était mon hypothèse que s'il était sur l'hébergement partagé, il n'aurait pas un si gros fichier sur le serveur.



1
votes
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);
}

0 commentaires

1
votes
$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);

0 commentaires

0
votes

Les scissions sont nommées comme nom_file.part0 fichier.part1 ... xxx


0 commentaires