Facebook LinkedIn SourceForge Twitter RSS LastFM
logologo

Réimplémenter 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 même sur ubuntu
Luc Paul
19/03/2020 14:18Posté par Luc Paul
Un concept assez unique comme blog, bravo pour ce détail
marinaclaire
18/03/2020 14:10Posté par marinaclaire
Cela fait un moment que vous n'avez plus publié de nouveaux billets. Espérant votre retour, amicalement !
Clea Marie
11/03/2020 13:05Posté par Clea Marie
Grâce à tes astuces, j'ai pu accélérer mon travail aujourd'hui
Leo Fevre
26/02/2020 08:27Posté par Leo Fevre
Même aujourd'hui, j'utilise encore cette fonctionnalité.
Ezio Lafrange
24/02/2020 13:25Posté par Ezio Lafrange
Ce truc m'est encore utile, jusqu'à présent
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, même si ça date, c'est toujours utile.
Kev
17/02/2020 15:29Posté par Kev
Même si cela date, cette fonctionnalité demeure un incontournable, même de nos jour.

Réagir à cet article

*


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


(Lien en dur et dofollow)

zend framework