Facebook LinkedIn SourceForge Twitter RSS LastFM
logologo

Rimplmenter la fonction file_put_contents() en PHP

Geoffray Warnants|26/08/2013|63 commentaires

J'en convient, l'idée de vouloir faire pareille chose peut paraître farfelue. Et pourtant ! Quelle ne fût pas ma surprise, lorsque lors d'une intervention sur une application dont on m'avait innocemment caché les caractéristiques de l'hébergement, je me suis rapidement retrouvé face à l'erreur :

Fatal error: Call to undefined function: file_put_contents()

Et pareil constat avec sa consoeur :

Fatal error: Call to undefined function: file_get_contents()

Je crus d'abord à une farce. Puis à une restriction volontaire de l'hébergeur via la directive disable_functions, ne cessant néanmoins de me demander quelle obscure raison pouvait motiver cet acte de pur sadisme. Mais un rapide phpinfo() me révéla bien vite la triste réalité de la situation : j'étais là sur un antédiluvien serveur PHP 4.2, et ces fonctions aujourd'hui ô combien familières n'existaient tout simplement pas encore dans cette antique version du langage parue en 2002 !

Même si les statistiques mondiales collectées par w3techs.com (août 2013) permettent d'estimer qu'aujourd'hui moins de 3% des hébergements PHP fonctionnent encore en PHP 4 et que ce chiffre tend lentement vers 0 dans une longue agonie, voici malgré tout un patch permettant de rendre vie à ce couple de fonctions bien utiles. Bien conscient du peu d'intérêt qu'il pourra susciter, je le dédie spécialement au prochain Marty McFly du web qui se retrouvera tout comme moi propulsé dans une lointaine époque.

if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $data, $flags=0, $context=null) {
        $fopen_args = array(
            $filename,
            (($flags&FILE_APPEND) == FILE_APPEND) ? 'a' : 'w',
            (($flags&FILE_USE_INCLUDE_PATH) == FILE_USE_INCLUDE_PATH)
        );
        if (is_resource($context)) {
            $fopen_args[] = $context;
        }
        if (($fd = call_user_func_array('fopen', $fopen_args)) !== false) {
            if (($flags&LOCK_EX) == LOCK_EX && !flock($fd, LOCK_EX)) {
                fclose($fd);
                return false;
            }
            for ($written=0, $l=strlen($data); $written < $l; $written += $nb) {
                if (($nb = fwrite($fd, substr($data, $written))) === false) {
                    if (($flags&LOCK_EX) == LOCK_EX) {
                        flock($fd, LOCK_UN);
                    }
                    fclose($fd);
                    return false;
                }
            }
            if (($flags&LOCK_EX) == LOCK_EX) {
                flock($fd, LOCK_UN);
            }
            fclose($fd);
            return $written;
        }
        return false;
    }
}

if (!function_exists('file_get_contents')) {
    function file_get_contents($filename, $use_include_path=false, $context=null, $offset=-1, $maxlen=-1) {
        $fopen_args = array($filename, 'r', $use_include_path);
        if (is_resource($context)) {
            $fopen_args[] = $context;
        }
        if (($fd = call_user_func_array('fopen', $fopen_args)) !== false) {
            if ($offset > 0) {
                fseek($fd, $offset);
            }
            $buffer = '';
            while (!feof($fd) && ($maxlen < 0 || ($r=$maxlen-strlen($buffer)) > 0)) {
                if (($data = fread($fd, ($maxlen < 0 || $r > 8192) ? 8192 : $r%8192)) === false) {
                    fclose($fd);
                    return false;
                }
                $buffer .= $data;
            }
            fclose($fd);
            return $buffer;
        }
        return false;
    }
}

<<< Retour vers le futur

Vos commentaires

13 commentaires postés

jean marc
30/04/2020 17:15Posté par jean marc
salut, on est aujourd'hui la version 7 ou plus je crois de PHP, ce serait bien que vous ventiez d'autres infos et astuces pratiques sur ce qu'on peut et peut pas faire de nos jours
Marie
10/04/2020 10:12Posté par Marie
Merci mec pour le partage de ces astuces
Jade Live
25/03/2020 15:11Posté par Jade Live
Merci pour cette astuce incroyable
Jules Rim
25/03/2020 12:42Posté par Jules Rim
Moi j'utilise tout le temps firefox mme sur ubuntu
Luc Paul
19/03/2020 14:18Posté par Luc Paul
Un concept assez unique comme blog, bravo pour ce dtail
marinaclaire
18/03/2020 14:10Posté par marinaclaire
Cela fait un moment que vous n'avez plus publi de nouveaux billets. Esprant votre retour, amicalement !
Clea Marie
11/03/2020 13:05Posté par Clea Marie
Grce tes astuces, j'ai pu acclrer mon travail aujourd'hui
Leo Fevre
26/02/2020 08:27Posté par Leo Fevre
Mme aujourd'hui, j'utilise encore cette fonctionnalit.
Ezio Lafrange
24/02/2020 13:25Posté par Ezio Lafrange
Ce truc m'est encore utile, jusqu' prsent
Joe Satin
24/02/2020 08:59Posté par Joe Satin
Encore merci pour ces informations monsieur.
Paul David
18/02/2020 16:40Posté par Paul David
C'est l que je me rend compte que je suis encore nul en codes, merci pour le partage.
Hugo Delle
18/02/2020 13:27Posté par Hugo Delle
merci pour ces indications, mme si a date, c'est toujours utile.
Kev
17/02/2020 15:29Posté par Kev
Mme si cela date, cette fonctionnalit demeure un incontournable, mme de nos jour.

Réagir à cet article

*


(Ne sera pas publiée, servira uniquement à afficher votre gravatar)


(Lien en dur et dofollow)

zend framework