背景:安裝完redis之後,需要安裝phpredis擴充套件,才能讓php操作redis;本機有多個php版本,安裝過程中遇到的坑分享一下。
一 下載
git上下載redis的擴充套件包
git clone https://github.com/nicolasff/phpredis
二 掛載和configure
在shell中輸入 phpize 【注意:多個php版本的時候需要指定】
./configure
【phpize是用來擴充套件php擴充套件模組的,通過phpize可以建立php的外掛模組】
注意:(phpize 如果包含多個php,必須指定位置)
cuihuan:phpredis cuixiaohuan$ ../php/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
報錯的話需要安裝:brew install autoconf [phpize 報錯] 否則沒有phpize
[work@cuixiaozhuai phpredis]$ ../php/bin/phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
[work@cuixiaozhuai phpredis]$ ./configure --with-php-config=/home/work/thirdparty/php5/bin/php-config
當存在多個版本的php的時候,需要指定配置檔案
./configure --with-php-config=/home/work/thirdparty/php5/bin/php-config
三 編譯和安裝
make 之後最好make test
make install
cuihuan:phpredis cuixiaohuan$ make
。。。
Build complete.
Don`t forget to run `make test`.
cuihuan:phpredis cuixiaohuan$ make test
cuihuan:phpredis cuixiaohuan$ make install
四 問題修復
【已修復,但是原因可能不太準確】
make編譯報錯
.libs/redis_cluster.o(.data.rel.local+0x0): In function `ht_free_seed`:
/home/work/thirdparty/php5/php5/phpredis/redis_cluster.c:226: multiple definition of `arginfo_scan`
.libs/redis.o(.data.rel.local+0xe0):/home/work/thirdparty/php5/php5/p hpredis/redis.c:452: first defined here
/usr/bin/ld: Warning: size of symbol `arginfo_scan` changed from 160 in .libs/redis.o to 200 in .libs/redis_cluster.o
.libs/redis_cluster.o(.data.rel.local+0xe0): In function `create_cluster_context`:
/home/work/thirdparty/php5/php5/phpredis/redis_cluster.c:276: multiple definition of `arginfo_kscan`
.libs/redis.o(.data.rel.local+0x0):/home/work/thirdparty/php5/php5/phpredis/redis.c:364: first defined here
collect2: ld returned 1 exit status
make: *** [redis.la] Error 1
最初以為是php多個版本生成install問題,採用./configure 指定php版本,指定php位置。
但是效果還是有問題。
最終通過修改redis_cluester.c 中,註釋掉了這兩個重複的
40
41 /* Argument info for HSCAN, SSCAN, HSCAN */
42 /*ZEND_BEGIN_ARG_INFO_EX(arginfo_kscan, 0, 0, 2)
43 ZEND_ARG_INFO(0, str_key)
44 ZEND_ARG_INFO(1, i_iterator)
45 ZEND_ARG_INFO(0, str_pattern)
46 ZEND_ARG_INFO(0, i_count)
47 ZEND_END_ARG_INFO();
48 */
49
50 /* Argument infor for SCAN */
51 /*
52 ZEND_BEGIN_ARG_INFO_EX(arginfo_scan, 0, 0, 2)
53 ZEND_ARG_INFO(1, i_iterator)
54 ZEND_ARG_INFO(0, str_node)
55 ZEND_ARG_INFO(0, str_pattern)
56 ZEND_ARG_INFO(0, i_count)
57 ZEND_END_ARG_INFO();
58 */
五 簡單測試
<?php
$redis = new Redis();
$conn = $redis->connect(`127.0.0.1`,6379);
echo "redis pass and status show</br>";
var_dump($redis->ping());
$redis->set(`test_key`,`test_value`);
echo "test set val=".$redis->get(`test_key`)."</br>";
$redis->setnx(`unique_key`,"unique_val");
$redis->setnx(`unique_key`,"unique_val_2");
echo $redis->get("unique_key");
sleep(60);
echo `is exist`.$redis->exists(`test_60s`);
echo `not has value`.$redis->get(`test_60s`);
$redis->delete(`test_key`,`test_60s`);