Skip to content

Instantly share code, notes, and snippets.

@airlst
Created April 18, 2012 19:27
Show Gist options
  • Save airlst/2415936 to your computer and use it in GitHub Desktop.
Save airlst/2415936 to your computer and use it in GitHub Desktop.
Install PHP-FPM on OSX with Macports
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
# $Id: Portfile 89615 2012-02-04 05:28:00Z ryandesign@macports.org $
PortSystem 1.0
name php5
conflicts php5-devel php52
# Keep version of php5 in sync with bundled php5 extension ports.
# Increment revision of php5-eaccelerator when updating version of php5.
epoch 1
version 5.3.10
set major [lindex [split ${version} .] 0]
set my_name php${major}
dist_subdir ${my_name}
categories lang php www
maintainers ryandesign jwa
platforms darwin freebsd
license PHP-3.01
use_parallel_build yes
description PHP: Hypertext Preprocessor
long_description PHP is a widely-used general-purpose scripting \
language that is especially suited for developing \
web sites, but can also be used for command-line \
scripting.
homepage http://www.php.net/
master_sites php
distname php-${version}
use_bzip2 yes
checksums [suffix ${distname}] \
rmd160 acab30a19b340f21a64e06b524906f2b064dd1c9 \
sha256 339157af2b386534597d287da292f2545e81d9b452e8b3fe525fb2c534ff344a
depends_build port:pkgconfig \
port:autoconf213
depends_lib path:bin/gsed:gsed \
port:libtool \
port:libevent \
port:libxml2 \
port:bzip2 \
port:mhash \
port:pcre \
port:readline \
port:zlib
# Use -p1 to accommodate the Suhosin patch
patch.pre_args -p1
patchfiles patch-configure.in.diff \
patch-scripts-php-config.in.diff
use_autoconf yes
autoconf.cmd ${prefix}/bin/autoconf213
set phpinidir ${prefix}/etc/${my_name}
set extraphpinidir ${prefix}/var/db/${my_name}
destroot.keepdirs ${destroot}${extraphpinidir}
if {${configure.compiler} == "clang"} {
configure.compiler llvm-gcc-4.2
}
configure.args --mandir=${prefix}/share/man \
--infodir=${prefix}/share/info \
--with-config-file-path=${phpinidir} \
--with-config-file-scan-dir=${extraphpinidir} \
--disable-all \
--enable-bcmath \
--enable-ctype \
--enable-dom \
--enable-fileinfo \
--enable-filter \
--enable-hash \
--enable-json \
--enable-libxml \
--enable-pdo \
--enable-phar \
--enable-session \
--enable-simplexml \
--enable-tokenizer \
--enable-xml \
--enable-xmlreader \
--enable-xmlwriter \
--with-bz2=${prefix} \
--with-mhash=${prefix} \
--with-pcre-regex=${prefix} \
--with-readline=${prefix} \
--with-libxml-dir=${prefix} \
--with-zlib=${prefix} \
--without-pear \
--disable-cgi
# php5-mysql +mysqlnd needs mysqlnd support compiled into php
configure.env-append PHP_MYSQLND_ENABLED=yes
configure.universal_args-delete --disable-dependency-tracking
platform darwin 10 {
configure.env-append LIBS=-lresolv
}
variant no_web conflicts apache apache2 fastcgi description {Don't include any web server support} {}
# Build an Apache 1 module. On Mac OS X, it uses Apple's provided Apache 1 server.
# On other platforms, the MacPorts apache port is used. Keep the options here
# in sync with those in the relevant part of the post-destroot phase.
variant apache conflicts apache2 no_web description {Add Apache 1 web server module} {
if { ! [variant_isset macosx] && (![info exists os.subplatform] || ${os.subplatform} != "macosx") } {
depends_lib-append \
port:apache
configure.args-append \
--with-apxs=${prefix}/sbin/apxs
} else {
destroot.violate_mtree yes
configure.args-append \
--with-apxs=/usr/sbin/apxs
}
}
# Build an Apache 2.2 module. Keep the options here in sync with those in the
# relevant part of the post-destroot phase.
variant apache2 conflicts apache no_web description {Add Apache 2.2 web server module} {
pre-configure {
# Checking for mod_cgi.so is a convenient way to verify apache2 is using its
# +preforkmpm variant. (+eventmpm and +workermpm instead provide mod_cgid.so.)
if {![file exists ${prefix}/apache2/modules/mod_cgi.so]} {
ui_error "To use ${name} with the +apache2 variant, apache2 must be installed with the +preforkmpm variant."
return -code error "incompatible apache2 installation"
}
}
destroot.violate_mtree yes
depends_lib-append \
port:apache2
configure.args-append \
--with-apxs2=${prefix}/apache2/bin/apxs
}
# Build a FastCGI binary. Keep the options here in sync with those in the
# relevant part of the post-destroot phase.
variant fastcgi conflicts no_web description {Add FastCGI web server binary} {
if { ![variant_isset apache] && ![variant_isset apache2] } {
configure.args-delete \
--disable-cgi
configure.args-append \
--enable-fpm \
--enable-cgi
}
}
variant ipc description {Add semaphore, shared memory and IPC functions} {
configure.args-append \
--enable-shmop \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg
}
if {![variant_isset apache] && ![variant_isset apache2] && ![variant_isset fastcgi] && ![variant_isset no_web]} {
default_variants +apache2
}
variant pear description {Add PEAR} {
configure.args-delete \
--without-pear
configure.args-append \
--with-pear=${prefix}/lib/php
destroot.target-append \
install-pear
destroot.args-append \
PHP_PEAR_INSTALL_DIR=${prefix}/lib/php
post-destroot {
#nuke pear-stuff in ${destroot}
system -W ${destroot} "rm -rf .channels .depdb .depdblock .filemap .lock"
system "if \[ -f ${prefix}/lib/php/.depdblock \]; then rm -f ${destroot}${prefix}/lib/php/.depdblock; fi"
system "if \[ -f ${prefix}/lib/php/.depdb \]; then rm -f ${destroot}${prefix}/lib/php/.depdb; fi"
system "if \[ -f ${prefix}/lib/php/.filemap \]; then rm -f ${destroot}${prefix}/lib/php/.filemap; fi"
system "if \[ -f ${prefix}/lib/php/.lock \]; then rm -f ${destroot}${prefix}/lib/php/.lock; fi"
system "if \[ -d ${prefix}/lib/php/.channels \]; then rm -rf ${destroot}${prefix}/lib/php/.channels; fi"
}
}
variant suhosin description {Add Suhosin patch} {
pre-fetch {
if {"darwin" == ${os.platform} && ${os.major} < 9} {
ui_error "The suhosin variant requires Mac OS X 10.5 or greater."
return -code error "incompatible Mac OS X version"
}
set suhosin_available 1
if {!${suhosin_available}} {
ui_error "There is no suhosin patch for PHP ${version} yet. Please check back later."
}
if {![file exists ${prefix}/var/db/php5/suhosin.ini]} {
ui_msg "You may also be interested in the suhosin extension, a related but different piece of software. See the php5-suhosin port."
}
if {!${suhosin_available}} {
return -code error "unavailable variant"
}
}
set suhosin_patch_version 5.3.9-0.9.10
set suhosin_patch suhosin-patch-${suhosin_patch_version}.patch.gz
patch_sites-append http://download.suhosin.org/
patchfiles-append ${suhosin_patch}
checksums-append ${suhosin_patch} \
rmd160 ce43921fd9b183b154713ecda98294f6c68d5f22 \
sha256 4438caeab0a10c6c94aee9f7eaa703f5799f97d4e0579f43a947bb7314e38317
}
destroot.args INSTALL_ROOT=${destroot}
destroot.target install-cli install-build install-headers install-programs
post-destroot {
# Copy the Apache 1 module.
if { [variant_isset apache] } {
xinstall -m 755 -d ${destroot}${prefix}/libexec/apache \
${destroot}${prefix}/etc/apache/extra
xinstall -m 755 ${worksrcpath}/libs/libphp5.so ${destroot}${prefix}/libexec/apache/
xinstall -m 755 -c ${filespath}/mod_php.conf ${destroot}$prefix/etc/apache/extra
}
# Copy the Apache 2.2 module.
if { [variant_isset apache2] } {
xinstall -m 755 -d ${destroot}${prefix}/apache2/modules \
${destroot}${prefix}/apache2/conf/extra
xinstall -m 755 ${worksrcpath}/libs/libphp5.so ${destroot}${prefix}/apache2/modules/
xinstall -m 755 -c ${filespath}/mod_php.conf ${destroot}${prefix}/apache2/conf/extra
}
if { [variant_isset fastcgi] } {
# If we've built an Apache module (any version) then the FastCGI binary
# will not have been built, so we need to run through the whole process
# again and build just the FastCGI binary. Keep the options here in sync
# with the options specified in the apache and apache2 variants.
if { [variant_isset apache] } {
if { ![variant_isset macosx] && (![info exists os.subplatform] || ${os.subplatform} != "macosx") } {
configure.args-delete \
--with-apxs=${prefix}/sbin/apxs
} else {
configure.args-delete \
--with-apxs=/usr/sbin/apxs
}
}
if { [variant_isset apache2] } {
configure.args-delete \
--with-apxs2=${prefix}/apache2/bin/apxs
}
# Run the build again to get the FastCGI binary. Keep the options here
# in sync with those in the fastcgi variant.
if { [variant_isset apache] || [variant_isset apache2] } {
configure.args-delete \
--disable-cgi
configure.args-append \
--enable-fpm \
--enable-cgi
ui_msg "$UI_PREFIX Configuring ${name} again for fastcgi"
command_exec configure
ui_msg "$UI_PREFIX Building ${name} again for fastcgi"
command_exec build
ui_msg "$UI_PREFIX Staging ${name} fastcgi into destroot"
}
# Copy the FastCGI binary to the bin dir under a new name so it doesn't
# conflict with the cli version.
if {[file exists ${worksrcpath}/sapi/cgi/php-cgi]} {
xinstall -m 755 ${worksrcpath}/sapi/cgi/php-cgi ${destroot}${prefix}/bin
}
# Copy the default FastCGI config
if {[file exists ${worksrcpath}/sapi/fpm/php-fpm.conf]} {
xinstall -m 644 ${worksrcpath}/sapi/fpm/php-fpm.conf ${destroot}${prefix}/etc/
}
}
#file rename ${destroot}${prefix}/etc/pear.conf ${destroot}${prefix}/etc/pear.conf.sample
# Copy the default php.ini files.
xinstall -m 755 -d ${destroot}${phpinidir}
xinstall -m 644 -W ${worksrcpath} \
php.ini-development \
php.ini-production \
${destroot}${phpinidir}
# Copy mysqlnd headers.
xinstall -d ${destroot}${prefix}/include/php/ext/mysqlnd
eval xinstall -m 644 [glob ${worksrcpath}/ext/mysqlnd/*.h] ${destroot}${prefix}/include/php/ext/mysqlnd
}
pre-activate {
set filepath ${extraphpinidir}/.turd_${name}
if {[file exists ${filepath}]} {
delete ${filepath}
}
}
post-activate {
if {[file exists ${prefix}/etc/php.ini] && ![file exists ${phpinidir}/php.ini]} {
move ${prefix}/etc/php.ini ${phpinidir}
ui_msg "Your ${prefix}/etc/php.ini has been moved to ${phpinidir}/php.ini"
ui_msg ""
}
if {![file exists ${phpinidir}/php.ini]} {
ui_msg "To customize php, copy"
ui_msg "${phpinidir}/php.ini-development (if this is a development server) or"
ui_msg "${phpinidir}/php.ini-production (if this is a production server) to"
ui_msg "${phpinidir}/php.ini and then make changes."
} else {
ui_msg "You may need to update your php.ini for any changes that have been made"
ui_msg "in this version of php. Compare ${phpinidir}/php.ini with"
ui_msg "${phpinidir}/php.ini-development (if this is a development server) or"
ui_msg "${phpinidir}/php.ini-production (if this is a production server)."
}
if {![variant_isset no_web]} {
ui_msg ""
ui_msg "If this is your first install, you need to activate PHP in your web server."
if {![variant_isset fastcgi]} {
if {[variant_isset apache]} {
set moduledir ${prefix}/libexec/modules
set apxs ${prefix}/apache/bin/apxs
}
if {[variant_isset apache2]} {
set moduledir ${prefix}/apache2/modules
set apxs ${prefix}/apache2/bin/apxs
}
ui_msg ""
ui_msg "To enable PHP in Apache, run"
ui_msg " cd ${moduledir}"
ui_msg " ${apxs} -a -e -n \"${my_name}\" lib${my_name}.so"
}
}
#ui_msg "* copy ${prefix}/etc/pear.conf.sample to ${prefix}/etc/pear.conf"
}
variant debug description {Enable debug support (useful to analyze a PHP-related core dump)} {
configure.args-append --enable-debug
}
test.run yes
livecheck.type regex
livecheck.url ${homepage}downloads.php
livecheck.regex get/php-(5\\.\[0-9.\]+)\\.tar
@airlst
Copy link
Author

airlst commented Apr 18, 2012

This Portfile can be used to install PHP-FPM on OSX with Macports.
Here's how to do it:
(1a) Install Macports freshly OR
(1b) Uninstall existing php5 package
sudo port uninstall --follow-dependents php5

(2) Go to Portfile directory
cd $(port dir php5)

(3) Make a backup of existing Portfile
sudo cp Portfile Portfile.orig

(4) Replace Portfile with the content of the GIST above. Use favorite text editor, for example vim
sudo vim Portfile

(5) Install php with macports
sudo port install php5 +fastcgi

(6) If everything worked out, php-fpm should be available here:

/opt/local/sbin/php-fpm

Done.

@airlst
Copy link
Author

airlst commented Apr 18, 2012

And by the way: a short write-up what has been changed:

  • requiring libevent
  • add --enable-fpm on several places
  • added file exist checks on cgi and conf copying (in post-activate)

@holms
Copy link

holms commented Nov 21, 2012

well it fails for me

Undefined symbols for architecture x86_64:
  "_pcre_info", referenced from:
      _pcre_get_compiled_regex_cache in php_pcre.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Undefined symbols for architecture x86_64:
  "_pcre_info", referenced from:
      _pcre_get_compiled_regex_cache in php_pcre.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
make: *** Waiting for unfinished jobs....
make: *** [sapi/fpm/php-fpm] Error 1
make: Leaving directory `/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_php5/php5/work/php-5.3.10'
Command failed:  cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_php5/php5/work/php-5.3.10" && /usr/bin/make -j4 -w all 
Exit code: 2
Error: org.macports.build for port php5 returned: command execution failed
Warning: targets not executed for php5: org.macports.activate org.macports.build org.macports.destroot org.macports.install
Please see the log file for port php5 for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_php5/php5/main.log
To report a bug, follow the instructions in the guide:
    http://guide.macports.org/#project.tickets
Error: Processing of port php5 failed

12.2.0 Darwin Kernel Version 12.2.0: Sat Aug 25 00:48:52 PDT 2012; root:xnu-2050.18.24~1/RELEASE_X86_64 x86_64

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment