web-dev-qa-db-fra.com

Comment installer et utiliser memcached dans Windows pour PHP?

J'ai installé le fichier binaire memcached dans Windows 7 et l'ai démarré en tant que serveur.

Lorsque je tape wmic process, obtenez une description, exetuablepath | findstr memcached.exe J'obtiens la réponse suivante: memcached.exe c:\memcached\memcached.exe en ligne de commande.

Lorsque j'essaie d'exécuter l'exemple de code sur php.net, j'obtiens sur mon navigateur:

Erreur fatale: La classe 'Memcache' ne figure pas dans C:\DocumentRoot\Framework\index.php à la ligne 3 Pile d'appels: 0.0010 335928 1. {main} () C:\DocumentRoot\Framework\index.php: 0

Alors, qu'est-ce que je fais mal? J'utilise memcache.dll puisque memcached.dll n'existe pas pour Windows, je crois?

9
Koray Tugay

Ceci est pour les futurs visiteurs!

  1. vérifiez phpinfo () et voyez s'il est répertorié.
  2. Si ce n'est pas le cas, vérifiez si l'extension est activée dans le fichier php.ini, puis vérifiez le journal des erreurs Apache pour le message d'erreur ! dll devrait être respecté avec le même compilateur que le php . (VC9 ou VC6) btw, memcache.dll va bien

Vous pouvez obtenir l'extension php "memcache" pour utiliser memcached avec php sur windows ici http://downloads.php.net/pierre/

Memcached est le démon du serveur et vous pouvez l’obtenir pour Windows ici http://splinedancer.com/memcached-win32/

3
Venu

Une note pour tous ceux qui rencontrent des problèmes pour faire fonctionner Memcached sous Windows.

  • Pour commencer, assurez-vous que vous avez la bonne version de la DLL memcached et qu’elle est accessible. Une large sélection est disponible sur http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/ et il est trop facile de choisir la mauvaise version de memcached! .
  • Si vous utilisez PHP 5.5, vous aurez également besoin de php5.dll. Vous pouvez obtenir ceci ici
  • Vous devrez peut-être modifier les paramètres PATH de votre environnement afin de pouvoir trouver cette dll. Allez à Poste de travail-> Propriétés-> avancé et cliquez sur Variables d'environnement pour afficher/modifier le chemin. Vous devez redémarrer l'ordinateur si vous modifiez cela.
  • Assurez-vous que le serveur memcached est installé . Ctrl + Alt + Suppr et vérifiez que memcached est présent dans votre liste de services
  • Sinon, vous devez * l'installer à partir de l'invite Cmd exécuter en tant qu'administrateur (dans le menu Démarrer, choisissez Accessoires, cliquez sur Invite de commande et choisissez de l'exécuter en tant qu'administrateur) C:\pathtomemcached\memcached.exe -d install
  • suivez ceci avecc:\pathtomemcached\memcached.exe -d startou net start «memcached Server». Sur mon installation, le premier ne fonctionne pas
  • De même, je ne parviens pas à démarrer memcached à partir de l'onglet Services du gestionnaire de tâches.
  • Il est pratique de pouvoir jouer avec memcached à un niveau bas pour que active telnet , si nécessaire, et à partir de la commande Invite, tapez telnet. Maintenant, ouvrez le port 11211 et essayez d'utiliser memcached
  • Il est également utile de pouvoir garder un œil sur ce qui se passe dans memcached. phpMemCacheAdmin est de loin le meilleur outil pour ce travail
12
DroidOS

Sur la base des commentaires, je suppose que vous n’avez pas téléchargé ni installé memcached, mais que vous avez correctement installé le module memcached pour PHP. En gros, vous avez les clés de la voiture, mais vous n’avez pas la voiture.

memcached est construit pour Linux, mais il a été porté par d'autres personnes sous Windows. Ce tutoriel est ancien, mais il pourrait correspondre à ce que vous recherchez: http://www.codeforest.net/how-to-install-memcached-on-windows-machine

3
Michael Marr

Votre composer.json devrait contenir ext-memcached, mais il ne sera pas installé, il y aura simplement une erreur s'il est manquant. Voici différentes façons de l'obtenir:

Route binaire Windows

Si je comprends bien, à compter de 2018, il n’existe pas de port Windows binaire de JUST Memcached pour PHP 7 . Il existe toutefois une version pré-packagée dans Laragon ou alternativement Winginxenter image description here

Windows DLL Route

Il y a une poignée personnes proposant DLL compilées sur github (64 bits, et thread-safe offert)

Sous-système Windows pour route Linux

ubuntu
Sudo add-apt-repository ppa:ondrej/php
Sudo apt-get update
Sudo apt install php-memcached

Redémarrez php fpm si vous l'utilisez Sudo service php7.2-fpm restart

Compiler à partir de la route source

Vous pouvez compiler les liaisons php mais le paquet Windows de memcached a été cassé pour 4 ans (à partir de 2018)

Route Polyfill des fichiers de cache uniquement locaux

Voici un wrapper sale autour de Memcached appelé StaticCache, que vous pouvez utiliser en pincement pour lire/écrire des valeurs à partir du disque. De toute évidence, il est bien plus lent que memcached, il est donc censé être un complément au développement Windows. Si vous en avez envie, vous pouvez le définir comme un polyfill du même nom.

function StaticCacheClear()
{
    foreach (scandir(sys_get_temp_dir()) as $file) {
        if (StringBeginsWith($file, "staticcache"))
        {
            $path = sys_get_temp_dir() ."/". $file;
            unlink($path);
        }
    }
    global $Memcache;
    if ($Memcache) $Memcache->flush();
}

// REMOVE if you don't want a global way to clear cache
if (isset($_GET['clear_static_cache'])) {
    StaticCacheClear();
}

function MemcacheGet($key)
{
    global $Memcache;
    $value = $Memcache ? $Memcache->get($key) : (file_exists($key)?file_get_contents($key):null);

    return !$Memcache? $value : (Memcached::RES_NOTFOUND === $Memcache->getResultCode() ? null : $value);
}


function StaticCacheKey($key)
{
    global $Memcache;
    $cacheVersion = "MY_APP_VERSION_HERE";
    $uniqueKey = "staticcache_{$key}_"  . date("Ymd") . "$cacheVersion.cache";
    $filename = sanitize_file_name($uniqueKey);
    $filename = sys_get_temp_dir() . '/' . $filename;
    return $Memcache ? $uniqueKey : $filename;
}

function StaticCacheWrite($key, $value)
{
    global $Memcache;
    if (isset($_GET['disable-cache'])) return null;
    if ($Memcache)
        $Memcache->set(StaticCacheKey($key), serialize($value));
    else
        file_put_contents(StaticCacheKey($key), serialize($value));
}

function StaticCacheRead($key)
{
    global $Memcache;
    $key = StaticCacheKey($key);
    $value = MemcacheGet($key);
    return $value !== null ? unserialize($value) : null;
}
0
Jonathan