10

我已经在 Windows 7 中安装了 memcached 二进制文件并将其作为服务器启动。

当我输入 wmic process get description, exetuablepath | findstr memcached.exe 我得到响应:memcached.exe c:\memcached\memcached.exe 在命令行上。

当我尝试在 php.net 上运行示例代码时,我进入了我的浏览器:

致命错误:在第 3 行的 C:\DocumentRoot\Framework\index.php 中找不到类 'Memcache' 调用堆栈:0.0010 335928 1. {main}() C:\DocumentRoot\Framework\index.php:0

那么,我做错了什么?我正在使用 memcache.dll,因为我相信 Windows 不存在 memcached.dll?

4

4 回答 4

15

给在 Windows 上运行 memcached 时遇到问题的任何人的说明。

  • 对于初学者,请确保您拥有正确版本的 memcached dll 并且它是可访问的。在http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/上有很多选择,而且很容易选择错误的 memcached 版本!.
  • 如果您运行的是 PHP 5.5,您还需要 php5.dll。你可以在这里得到这个
  • 您可能需要编辑您的环境 PATH 设置,以便可以找到此 dll。转到我的电脑->属性->高级,然后单击环境变量以查看/编辑路径。如果您编辑它,您需要重新启动计算机。
  • 确保已安装 memcached 服务器。Ctrl + Alt + Del 并检查 memcached 是否存在于您的服务列表中
  • 如果不是,您需要*从 Cmd 提示符安装它以管理员身份运行(从开始菜单,选择附件,单击命令提示符并选择以管理员身份运行) c:\pathtomemcached\memcached.exe -d install
  • 在此之后使用c:\pathtomemcached\memcached.exe -d start或 net start “memcached Server”。在我的安装中,前者不起作用
  • 同样,我无法从任务管理器的“服务”选项卡启动 memcached
  • 能够在低级别使用 memcached 非常方便,因此如果需要,启用 telnet并从命令提示符键入 telnet。现在打开端口 11211 并尝试使用 memcached
  • 能够密切关注 memcached 中发生的事情也很有用。phpMemCacheAdmin是迄今为止最好的工具
于 2014-04-27T06:27:36.200 回答
3

根据评论,我假设您尚未下载并安装 memcached,但已成功安装了 PHP 的 memcached 模块。基本上,你已经拿到了车钥匙,但没有车。

memcached 是为 Linux 构建的,但已被其他人移植到 Windows。本教程很旧,但它可能是您正在寻找的:http: //www.codeforest.net/how-to-install-memcached-on-windows-machine

于 2013-02-08T17:33:08.210 回答
3

这是给未来的游客的!

  1. 检查 phpinfo() 并查看它是否已列出。
  2. 如果没有,请检查是否在 php.ini 中启用了扩展,然后检查 apache 错误日志中的错误消息!dll 应该使用与 php 相同的编译器。(VC9 或 VC6)顺便说一句,memcache.dll 很好

您可以在此处获取 php 扩展名“memcache”以在 Windows 上将 memcached 与 php 一起使用http://downloads.php.net/pierre/

Memcached 是服务器守护进程,您可以在此处为 Windows 获取它http://splinedancer.com/memcached-win32/

于 2013-02-09T03:47:15.613 回答
1

composer.json应该已经ext-memcached在其中列出,但它不会安装,如果它丢失它只会抛出一个错误。以下是获得它的各种方法:

Windows 二进制路由

截至 2018 年,AFAIK 没有适用于 PHP 7 的 JUST Memcached 的二进制 Windows 端口,但在LaragonWinginx中有一个预打包的版本 在此处输入图像描述

Windows DLL 路由

少数人在 github 上提供已编译的 DLL(64 位,并提供线程安全)

Linux 路由的 Windows 子系统

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

如果使用它,请重新启动 php fpmsudo service php7.2-fpm restart

从源路由编译

您可以编译 php 绑定,但memcached 的 windows 包已损坏 4 年(截至 2018 年)

仅本地缓存文件 Polyfill 路由

这是一个名为 StaticCache 的 Memcached 脏包装器,您可以在紧要关头使用它从磁盘读取/写入值。它显然比 memcached 慢得多,所以它只是作为 Windows 开发的一个鞋垫。如果您喜欢,可以将其定义为同名的 polyfill

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;
}
于 2018-09-21T23:03:34.467 回答