[失败经验]yosemite折腾mac自带的php环境

这篇日志发布时间已经超过一年,许多内容可能已经失效,请读者酌情参考。

忍不了ubuntu的丑陋,在年底换了一台mbp。作为一个phper,第一时间就是要搭建一个php开发环境,于是便有了这次失败的折腾经历。虽然是一次失败的折腾,不过过程中还是学到了很多有意思的东西,记录以做备忘。

0x01  启用自带环境

yosemite自带了apache2.4.9,不过默认是不启用的,在「系统偏好设置」->「共享」中勾选「互联网共享」,即可开启apache。使用apachectl -v查看服务器的基本信息。

mac版的apache,与ubuntu版有很大的不同(或者说是ubuntu版与其他发行版有很大的不同),没有a2ensite/a2enmod等配置命令可以使用,任何配置修改都得更改配置文件,稍有不便。apache的配置这里不展开,主要折腾php。

php的配置文件是/etc/php.ini,默认不存在,可以复制/etc/php.ini.default来新建一份配置。

默认的phpinfo

如上图,是默认情况的phpinfo。

可以看到编译的参数如下:

'/BinaryCache/apache_mod_php/apache_mod_php-93~55/Objects/php/configure' '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--sysconfdir=/private/etc' '--with-apxs2=/usr/sbin/apxs' '--enable-cli' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/Library/Server/Web/Config/php' '--with-libxml-dir=/usr' '--with-openssl=/usr' '--with-kerberos=/usr' '--with-zlib=/usr' '--enable-bcmath' '--with-bz2=/usr' '--enable-calendar' '--disable-cgi' '--with-curl=/usr' '--enable-dba' '--with-ndbm=/usr' '--enable-exif' '--enable-fpm' '--enable-ftp' '--with-png-dir=no' '--with-gd' '--with-jpeg-dir=/BinaryCache/apache_mod_php/apache_mod_php-93~55/Root/usr/local' '--enable-gd-native-ttf' '--with-icu-dir=/usr' '--with-ldap=/usr' '--with-ldap-sasl=/usr' '--with-libedit=/usr' '--enable-mbstring' '--enable-mbregex' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--without-pear' '--with-pear=no' '--with-pdo-mysql=mysqlnd' '--with-mysql-sock=/var/mysql/mysql.sock' '--with-readline=/usr' '--enable-shmop' '--with-snmp=/usr' '--enable-soap' '--enable-sockets' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--with-tidy' '--enable-wddx' '--with-xmlrpc' '--with-iconv-dir=/usr' '--with-xsl=/usr' '--enable-zend-multibyte' '--enable-zip' '--with-pcre-regex=/usr'

默认开启了很多扩展,但是有很多扩展不存在,比如mcrypt。

0x02  为php增加扩展

因为一些特殊需求,要使用mcrypt扩展,mac版php的扩展存放目录为usr/lib/php/extensions/no-debug-non-zts-20121212,默认只带了opcache和xdebug的so文件。为了增加mcrypt扩展,需要自己编译一个mcrypt.so,并在php.ini中引用。

增加外挂扩展的方式是使用phpize自己编译个对应版本的so文件,参考:

http://www.nowamagic.net/academy/detail/1226610

mcrypt扩展需要libmcrypt库支持,需要先安装本地库文件支持,可以下载libmcrypt自己编译安装,也可以使用brew直接安装一个。自己编译安装还需要处理mhash等依赖,brew直接就解决了依赖关系。

然后下载一个对应版本(5.5.14)的php源码,进入php-5.5.14/ext/mcrypt,使用phpize命令生成编译配置文件。

phpize

可以看到多了./configure等文件。使用如下命令配置和编译安装。

./configure --with-php-config=/usr/bin/php-config
make
make install

现在看看exitension_dir下是否有了mcrypt.so文件?

在php.ini中增加一条extension=mcrypt.so即可启用扩展,重启apache,看看phpinfo是不是多了mcrypt的支持?

phpinfo

0x03  gd扩展与freetype支持

以上折腾都进行的很顺利,直到我发现自带的gd扩展不完整,缺少png和freetype的支持,于是我打算重新编译一个gd扩展。如同mcrypt一样,先编译gd.so,然后在配置中启用。这时候问题来了,启用后并没有任何效果!

使用php -v查看php信息,发现一条错误信息:

PHP Warning:  Module 'gd' already loaded in Unknown on line 0

php -v

提示dg模块在0行就已经加载了。

这下把我难住了,找了半天php.ini也没见到在哪引入了gd扩展,更别说在0行引入了。。。。

正郁闷呢突然想起了phpinfo里面的编译参数,gd扩展已经直接编译到php的二进制文件中了,所以提示已经加载。

实在没辙去问了下鸟哥,鸟哥说这种情况只能重新编译php了。唉,稍稍有点强迫症,总想使用「原装」的东西,于是才在自带的php上折腾来折腾去。不过到这也只好放弃,得推倒重来了。

0x04  总结

此次折腾以失败告终,不过让我又好好了解了下php,熟悉了phpize和php扩展,还是很有意义等一次折腾。



留言交流

没有评论
点击换图