Every time I upgrade the PHP and related extensions, I always run into the same problem with some PHP-PECL modules. Recently with the new release of PHP 5.3.7, there is no exception for the trouble. So what kind of trouble I have today? The Tokyo Tyrant (The middleman between my program and Tokyo Cabinet).
#php -v PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20090626/tokyo_tyrant.so' - /usr/local/lib/php/20090626/tokyo_tyrant.so: Undefined symbol "ps_globals" in Unknown on line 0
This problem was caused by a version mis-match. PHP is running at a later version, which the Tokyo Tyrant extension is running at an earlier version. To solve this computer problem, all you need is to re-install the PHP-Tokyo-Tyrant extension, i.e.,
cd /usr/ports/databases/pecl-tokyo_tyrant suod make deinstall clean sudo make install
And later, you may or may not get the following error message:
... cc -shared .libs/tokyo_tyrant.o .libs/tokyo_tyrant_funcs.o .libs/connection.o .libs/session_funcs.o .libs/server_pool.o .libs/failover.o .libs/session.o -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib -L/usr/local/lib -ltokyotyrant -llua -ltokyocabinet /usr/local/lib/liblzo2.so -llzma -lbz2 -lz -lrt -lm -Wl,-soname -Wl,tokyo_tyrant.so -o ./.libs/tokyo_tyrant.so /usr/bin/ld: cannot find -llua *** Error code 1 Stop in /usr/ports/databases/pecl-tokyo_tyrant/work/tokyo_tyrant-0.6.0. *** Error code 1 Stop in /usr/ports/databases/pecl-tokyo_tyrant.
The problem is related to Lua. By default, the extension enable the Lua option, which I have a hard time to make it run properly on FreeBSD box. Since my website does not use the Lua with Tokyo Cabinet, I simply disable it:
sudo nano /usr/ports/databases/pecl-tokyo_tyrant/work/tokyo_tyrant-0.6.0/Make
Look for the keyword: lua
And you will find something like the following:
TOKYO_TYRANT_SHARED_LIBADD = -R/usr/local/lib -L/usr/local/lib -R/usr/local/lib -L/usr/local/lib -ltokyotyrant -llua -ltokyocabinet -lbz2 -lz -lrt -lm -ltokyocabinet -llzo2 -llzma -lbz2 -lz -lrt -lm
Delete the option: “-llua”, i.e.,
TOKYO_TYRANT_SHARED_LIBADD = -R/usr/local/lib -L/usr/local/lib -R/usr/local/lib -L/usr/local/lib -ltokyotyrant -ltokyocabinet -lbz2 -lz -lrt -lm -ltokyocabinet -llzo2 -llzma -lbz2 -lz -lrt -lm
and re-start the installation:
cd /usr/ports/databases/pecl-tokyo_tyrant sudo make install clean
Now re-run the php, and you may see the following error:
#php -v PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20090626/tokyo_tyrant.so' - /usr/local/lib/php/20090626/tokyo_tyrant.so: Undefined symbol "ps_globals" in Unknown on line 0 Segmentation fault: 11
That’s because the Tokyo Tyrant module is placed at a wrong position in the PHP extension file. Edit the file:
sudo nano /usr/local/etc/php/extensions.ini
and move the following code to the END of the file (Yes, order does matter):
And re-check your php:
#php -v PHP 5.3.7 with Suhosin-Patch (cli) (built: Aug 23 2011 10:33:12) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
Now everything is all set.
Unfortunately, you pretty much need to do the same thing every time when upgrading your PHP on FreeBSD box.