安装PECL Memcached时出现错误

12

我安装pecl memcached包遇到了很大的问题。使用任何yum或pear/pecl安装命令都没有成功。我查看了这个问题Install PECL Memcached Error并开始尝试手动配置/编译

我正在使用pecl下载最新版本(memcached-2.2.0),然后解压,运行phpize......

如果我使用--disable-memcached-sasl进行配置,则配置完成,但是make失败。出现了类似语法错误的情况

In file included from /root/memcached-2.2.0/php_memcached_private.h:28,
                 from /root/memcached-2.2.0/php_memcached.c:26:
/root/memcached-2.2.0/php_libmemcached_compat.h:56: error: expected ‘=’, ‘,’, ‘;’, ‘asm’     or ‘__attribute__’ before ‘php_memcached_instance_st’
/root/memcached-2.2.0/php_memcached.c:328: error: expected declaration specifiers or ‘...’ before ‘php_memcached_instance_st’
/root/memcached-2.2.0/php_memcached.c:329: error: expected declaration specifiers or     ‘...’ before ‘php_memcached_instance_st’
/root/memcached-2.2.0/php_memcached.c:330: error: expected declaration specifiers or ‘...’ before ‘php_memcached_instance_st’
/root/memcached-2.2.0/php_memcached.c: In function ‘php_memc_get_impl’:
/root/memcached-2.2.0/php_memcached.c:594: warning: passing argument 4 of     ‘memcached_mget_by_key’ from incompatible pointer type
/usr/include/libmemcached/memcached_get.h:38: note: expected ‘char **’ but argument is of type ‘const char **’
/root/memcached-2.2.0/php_memcached.c: In function ‘php_memc_getMulti_impl’:

有更多相关内容,但希望这已经是足够有用的指示了。

如果我使用 --with-libmemcached-dir=/usr/include/libmemcached,我会得到:

checking for libmemcached location... configure: error: Unable to find memcached.h under /usr/include/libmemcached

但那就是 memcached.h 文件所在的地方

如果我使用 --with-libmemcached-dir=no,configure 将会给出

configure: error: no, libmemcached sasl support is not enabled. Run configure with --disable-memcached-sasl to disable this check

如果我添加了--disable-memcached-sasl选项,它就会配置完成,但是make仍然失败并出现语法错误。

感觉自己陷入了循环。

这不是我第一次从头开始设置服务器使用memcached(虽然我猜已经有一段时间了),我记得以前没有遇到任何问题。

请问有任何想法吗?

这看起来像是一个好的线索

http://blusmurf.net/2012/08/27/pecl-memcache-build-error/

但还是没有成功。

我也从php-memcached的github页面调查了这个问题

https://github.com/php-memcached-dev/php-memcached/issues/69

我现在已经尝试了2.1和2.2,修改文件以尝试使make构建。但仍然没有运气...


1
我在使用libmemcached和memcached.h时遇到了完全相同的问题。我正在深入研究并会在找到解决方案后进行更新。如果您找到了解决方案,请也进行更新。 - flyankur
我尝试安装1.0.16版本的libmemcached来与php-memcached-2.1一起使用,但在构建libmemcached时出现了错误 ;-)我仍在谷歌和摆弄中,等我有结果后再告诉你。或者我会使用redis :-D - joevallender
1
虽然我已经成功安装了Memcached(在构建libmemcached时出现了什么错误?),但是我还是选择了Redis - 因为在我的用例中,我想要缓存对象、会话存储,并且这些将在不同的应用程序之间共享。Memcached不能用于会话存储(至少没有一个扭曲的方法),因此我选择了Redis \m/ - flyankur
7个回答

20
如果您不需要SASL,请回答如下:

libmemcached目录[否]:否 -disable-memcached-sasl


这个做法很妙,没有绕过任何漏洞或者需要从源代码下载和编译特定的软件包或版本。 - JohnRDOrazio

14
使用以下组合解决了该问题:
  1. libmemcached 1.0.16发布版 - 从源代码安装
  2. php-memcached 2.1.0发布版 - 从源代码安装并将memcached.so添加到php.in文件中
希望这可以帮助您。

我没有尝试过这个,但如果有人发现这是正确的,我会相信你的话。根据我所读的一切,它应该是正确的。只是我的特定问题在构建libmemcached时阻止了我进行测试。 - joevallender
是的,它有效。如果对于您而言无法正常工作,请检查您是否安装了 libmemcached 1.0.16+ 而非 libmemcached 1.1.16+。 - matt

9

步骤1 - 安装SASL:

yum install cyrus-sasl-devel

第二步 - 使用安装了SASL的方式编译libmemcached:

cd ~
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure
make && make install

第三步 - 安装 PHP Memcached:

pecl install memcached

(请勿指定libmemcached-dir

2
如果您不需要SASL支持,这里有一个安装2.2.X的简单方法:
pecl_memcached_ver="2.2.0"
pecl download memcached-${pecl_memcached_ver}
tar xzvf memcached-${pecl_memcached_ver}.tgz
cd memcached-${pecl_memcached_ver}/
phpize
./configure --disable-memcached-sasl
make
make install
cd ..
rm -r memcached-${pecl_memcached_ver}
echo "extension=memcached.so" > /etc/php5/fpm/conf.d/20-memcached.ini

然后运行php5 -i来测试是否正确安装了2.2.x版本


1
步骤:
  1. sudo apt-get install libmemcached libmemcached-dev
  2. sudo mkdir -p /usr/lib/x86_64-linux-gnu/include/libmemcached && sudo ln -s /usr/include/libmemcached/memcached.h /usr/lib/x86_64-linux-gnu/include/libmemcached/memcached.h
  3. echo "/usr/lib/x86_64-linux-gnu --disable-memcached-sasl" | sudo /opt/phpfarm/inst/php-5.4.40/bin/pecl -C /opt/phpfarm/inst/php-5.4.40/etc/pear.conf install memcached
设置: Ubuntu 14.04.x LTS x64 (trusty tahr) phpfarm (最新版本)与pecl PHP 5.4.40 memcached 2.2.0
注意: 显然,您必须根据您的系统替换路径

0

在已安装libmemcached-devel版本1.0.16的CentOS 7.2上,您应该使用/usr来回答该问题:

libmemcached目录[否]:/usr


0

@rynop 的过程非常好,一切都很棒!

现在,如果您想要打包部署呢?我的目标部署运行在 Ubuntu 14.04 LTS 上,我希望它可以替换上游的 php5-memcached 包,成为一个简单的 .deb 文件。

为此,请看一下 fpm,它代表“Freaking Package Manager”(译者注:意为“该死的包管理器”)。它可以将几乎任何东西打包成软件包。

在 @rynop 的过程之后,这是我所做的:

// Rest of @rynop procedure, modulo this configure options
./configure --enable-memcached-igbinary --disable-memcached-sasl

安装jordansissel/fpm

apt-get install -y pkg-config ruby-dev gcc
gem install fpm

接下来,检查您想要替换的软件包内容,并为我们自己的目的进行复制。

dpkg --list | grep php5-memcached
find /var/cache/apt -type f -name '*php5-memcached*'
dpkg -c /var/cache/apt/archives/php5-memcached_2.1.0-6build1_amd64.deb

我在输出中发现我只需要几个文件夹,所以我创建了它们。
mkdir -p etc/php5/mods-available/
// Adjust memcached.ini to suit your tastes, then prepare it for packaging
cp memcached.ini etc/php5/mods-available/
// Make sure the usr/lib/php5/foo path matches in 
// the result of `dpkg -c` you issued
mkdir -p usr/lib/php5/20121212/
cp modules/memcached.so usr/lib/php5/20121212/

魔法即将发生

fpm -s dir -t deb -n php5-memcached -v 2.2.0-wpd -m '<your@email.org>' --description 'PHP 5.5 PECL igbinary + memcached support' -d libmemcached10 etc/ usr/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接