Fileinfo

About Fileinfo
The functions in this module try to guess the content type and encoding of a file by looking for certain magic byte sequences at specific positions within the file. While this is not a bullet proof approach the heuristics used do a very good job. '''--Taken directly from php.net. Needs re-wording'''

Installing Fileinfo
Please Note: This installation method (including the script) is currently *NOT* complete and verification as to whether or not the Fileinfo extension even works using the installation script below is not certain. Please use the Discussion Page to help further develop this guide and the script below. This article will remain a stub until a fully functional method to install and get the Fileinfo extension working is discovered.

UPDATE

New instructions for installing FileInfo, just follow the steps outlined in the PHP.ini section to set your domain up on PHP 5.3, then create a phprc file with the following line:

extension="fileinfo.so"

The installation of Fileinfo no longer requires Installing_PHP5 or Installing_PHP4.

If you are unable to do so, then you may not be able to use Fileinfo on your DreamHost account.

Below is the old non-working install script for the Fileinfo PHP module.

Please make sure to run 'dos2unix fileinfo_ext.sh' from the shell if you use a Windows-based editor to create this file.

fileinfo_ext.sh
set -e
 * 1) !/bin/sh


 * 1) Version 0.3, 2007-07-13
 * 2) - Initial Release
 * 1) - Initial Release

SRCDIR=${HOME}/source DISTDIR=${HOME}/dist DISTDEL="No" INSTALLDIR=${HOME}/php5 NICE=19
 * 1) User Configuration Options
 * 2) Temporary source directory
 * 1) Download temporary DIST files to which directory?
 * 1) Delete contents of DISTDIR after installation? (Default: No)
 * 1) Install Suhosin to which directory?
 * 2) Note: This *MUST* be set to your PHP5 installation directory!
 * 1) Nice Level for Processes. (Depreciated)
 * 2) Higher is nicer, lower is less nice and could get your install process killed!

AUTOCONF="autoconf-2.61" AUTOMAKE="automake-1.10" FINFO="Fileinfo-1.0.4" FINFOFEATURES="--prefix=${INSTALLDIR}"
 * 1) Program Version Configuration
 * 2) Don't touch unless you know what you're doing!
 * 1) What features do you want enabled?


 * 1) END User Configuration Options

sleep 1s
 * 1) DO NOT MODIFY BELOW ##########

MAGIC="file_4.21.orig"
 * 1) DO NOT MODIFY THIS LINE OR IT *WILL* BREAK YOUR INSTALL

export PATH=${INSTALLDIR}/bin:$PATH
 * 1) Push the install dir's bin directory into the path

if [ -d ${SRCDIR} ]; then echo "Source directory already exists! Cleaning it..." rm -rf $SRCDIR/* else echo "Creating source directory..." mkdir -p ${SRCDIR} fi if [ -d ${DISTDIR} ]; then echo ""; echo "Distribution directory already exists!"; echo "Clean it?" if [ ${DISTDEL} == "Yes" ] then echo ""; echo "Yes!"; echo "Cleaning now..."; echo "" rm -rf $DISTDIR/* else echo ""; echo "No!"; echo "Leaving the distribution directory intact."; echo "" fi else echo "Creating distribution directory..." mkdir -p ${DISTDIR} fi if [ -d ${INSTALLDIR}/lib/php/extensions ]; then echo "lib/php/extensions folder already exists! Doing nothing..." else mkdir -p ${INSTALLDIR}/lib/php/extensions fi
 * 1) Clear and/or create the source directory.
 * 1) Create the dist files directory if it doesn't exist
 * 2) optionally cleaning it if it does exist already.
 * 1) Make sure the extensions directory exists.

cores=2  # the number of cores/procs to use when building if [ $cores -a $cores -gt 1 ]; then j="-j$cores " fi OS=`uname -s` if [ "Darwin" = $OS ]; then sed=gnused makefile=makefile.macosx else makefile=makefile.linux_x86_ppc_alpha sed=sed fi
 * 1) Detect how many processors the system has (for more optimal compliation).

for i in $sed wget; do		 $i --version >/dev/null 2>&1 done

cd ${DISTDIR} set +e WGETOPT="-t1 -T10 -w5 -q -c"
 * 1) Check if packages already exist and get packages the ones that don't.
 * 1) Do not abort on errors.
 * 1) Wget options

if [ -a ${DISTDIR}/${AUTOCONF}.tar.gz ]; then echo "Skipping wget of ${AUTOCONF}.tar.gz" else wget $WGETOPT ftp://ftp.ucsb.edu/pub/mirrors/linux/gentoo/distfiles/${AUTOCONF}.tar.gz # If primary mirror fails, use the alternative mirror. if [ -a ${DISTDIR}/${AUTOCONF}.tar.gz ]; then echo "Got ${AUTOCONF}.tar.gz" else wget $WGETOPT ftp://ftp.gnu.org/gnu/autoconf/${AUTOCONF}.tar.gz # Check to make sure the alternative mirror worked. if [ -a ${DISTDIR}/${AUTOCONF}.tar.gz ]; then echo "Got ${AUTOCONF}.tar.gz" else echo "Failed to get ${AUTOCONF}.tar.gz. Aborting install!" exit 0 fi fi fi if [ -a ${DISTDIR}/${AUTOMAKE}.tar.bz2 ]; then echo Skipping wget of ${AUTOMAKE}.tar.bz2 else wget $WGETOPT ftp://ftp.ucsb.edu/pub/mirrors/linux/gentoo/distfiles/${AUTOMAKE}.tar.bz2 # If primary mirror fails, use the alternative mirror. if [ -a ${DISTDIR}/${AUTOMAKE}.tar.bz2 ]; then echo "Got ${AUTOMAKE}.tar.bz2" else wget $WGETOPT ftp://ftp.gnu.org/gnu/automake/${AUTOMAKE}.tar.bz2 # Check to make sure the alternative mirror worked. if [ -a ${DISTDIR}/${AUTOMAKE}.tar.bz2 ]; then echo "Got ${AUTOMAKE}.tar.bz2" else echo "Failed to get ${AUTOMAKE}.tar.bz2. Aborting install!" exit 0 fi fi fi if [ -a ${DISTDIR}/${MAGIC}.tar.gz ]; then echo "Skipping wget of ${MAGIC}.tar.gz" else wget $WGETOPT http://ftp.debian.org/debian/pool/main/f/file/${MAGIC}.tar.gz # If primary mirror fails, use the alternative mirror. if [ -a ${DISTDIR}/${MAGIC}.tar.gz ]; then echo "Got ${MAGIC}.tar.gz" else wget $WGETOPT http://debian.cruisix.net/debian/pool/main/f/file/${MAGIC}.tar.gz				wget $WGETOPT http://ftp.linux.org.tr/ubuntu/pool/main/f/file/${MAGIC}.tar.gz # Check to make sure the alternative mirror worked. if [ -a ${DISTDIR}/${MAGIC}.tar.gz ]; then echo "Got ${MAGIC}.tar.gz" else echo "Failed to get ${MAGIC}.tar.gz. Aborting install!" exit 0 fi fi fi if [ -a ${DISTDIR}/${FINFO}.tgz ]; then echo "Skipping wget of ${FINFO}.tgz" else wget $WGETOPT ftp://ftp.ucsb.edu/pub/mirrors/linux/gentoo/distfiles/${FINFO}.tgz # If primary mirror fails, use the alternative mirror. if [ -a ${DISTDIR}/${FINFO}.tgz ]; then echo "Got ${FINFO}.tgz" else wget $WGETOPT http://pecl.php.net/get/${FINFO}.tgz # Check to make sure the alternative mirror worked. if [ -a ${DISTDIR}/${FINFO}.tgz ]; then echo "Got ${FINFO}.tgz" else echo "Failed to get ${FINFO}.tgz. Aborting install!" exit 0 fi fi fi set -e
 * 1) Do some of our own error checking here too.

cd ${SRCDIR} echo "Extracting ${AUTOCONF}..." tar xzf ${DISTDIR}/${AUTOCONF}.tar.gz > /dev/null echo "Done." echo "Extracting ${AUTOMAKE}..." tar xjf ${DISTDIR}/${AUTOMAKE}.tar.bz2 > /dev/null echo "Done." echo "Extracting ${MAGIC}..." tar xzf ${DISTDIR}/${MAGIC}.tar.gz > /dev/null echo "Done." echo "Extracting ${FINFO}..." tar xzf ${DISTDIR}/${FINFO}.tgz > /dev/null echo "Done."
 * 1) Extract the source files into the source directory.

if [ -a ${DISTDIR}/finfo/config.m4 ]; then echo "Skipping copying and patching of config.m4" else if [ -d ${DISTDIR}/finfo ]; then echo "finfo directory exists! Skipping." else echo "Creating ${DISTDIR}/finfo directory..." mkdir -p ${DISTDIR}/finfo fi		 cd ${DISTDIR}/finfo cp ${SRCDIR}/${FINFO}/config.m4. sed "s/SEARCH_PATH=\"/SEARCH_PATH=\"\$HOME\/source\/file /g" config.m4 > config.m4		 sed "s/MAGIC_MIME_DIRS=\"/MAGIC_MIME_DIRS=\"\$HOME\/source\/file /g" config.m4 > config.m4		  # No secondary mirror currently exists, nor should there be one once # this script is properly setup. if [ -a ${DISTDIR}/finfo/config.m4 ]; then echo "Got config.m4 patched ok!" else echo "Failed to copy config.m4. Aborting install!" exit 0 fi fi
 * 1) This part is ugly, as the modifiction done here is *not* official nor should it be supported.
 * 2) Documentation on creating this file should be made and this method removed in future builds.

export PATH=${SRCDIR}/bin:$PATH export PHP_PREFIX=${INSTALLDIR}/bin
 * 1) Required exports

cd ${SRCDIR}/${AUTOCONF} ./configure --prefix=${SRCDIR} nice -n ${NICE} make make install
 * 1) Compile deps and install FileInfo
 * 2) AUTOCONF
 * 1) make clean

cd ${SRCDIR}/${AUTOMAKE} ./configure --prefix=${SRCDIR} nice -n ${NICE} make make install
 * 1) AUTOMAKE
 * 1) make clean

cd ${SRCDIR}/file-4.21 ./configure --prefix=${SRCDIR}/file nice -n ${NICE} make make install
 * 1) MAGIC
 * 1) make clean

cd ${SRCDIR}/${FINFO} cp ${DISTDIR}/finfo/config.m4 ${SRCDIR}/${FINFO}/config.m4 $PHP_PREFIX/phpize ./configure ${FINFOFEATURES} nice -n ${NICE} make
 * 1) FILEINFO
 * 1) make clean

cp modules/fileinfo.so ${INSTALLDIR}/lib/php/extensions/fileinfo.so
 * 1) Install Fileinfo now by copying the lib file over to the PHP extension dir.

if [ ${DISTDEL} == "Yes" ]; then rm -rf $DISTDIR elif [ ${DISTDEL} == "No" ]; then echo "Your DISTDIR will not be cleaned." else echo "Unknown DISTDEL option! Cleaning your DISTDIR by default." fi
 * 1) Post install clean-up.
 * 2) rm -rf $SRCDIR

echo "Installation completed!" `date +%r` echo "" echo "Please note that your SOURCE directory has NOT been cleaned during this beta installation for debugging purposes." echo "You will need to clean it manually if you wish to re-install this extension."
 * 1) End of Install


 * EOF

php.ini modifications
Locate the following line(s) in your php.ini file: extension_dir = "./" Modify the extension_dir line to look like this: extension_dir = "~/php5/lib/php/extensions"
 * Directory in which the loadable extensions (modules) reside.
 * Directory in which the loadable extensions (modules) reside.

Now add the following near the very end of your current php.ini file.

[fileinfo] extension="fileinfo.so"

Config.m4 Modifications
Some further information about why this file needs to be modified should be added here. The config.m4 file, located in the Fileinfo-1.0.4.tgz package, needs to be modified in order to point to a local (user's directory) install of the 'libmagic' libraries (which would be had from the file_4.21.orig.tar.gz package, once installed). A modified config.m4 file is currently provided by the Fileinfo install script; however, it truly should be created, or rather modified, by the user themselves.

Below is a differential of the changes between the original config.m4 file and what a modified config.m4 file should look like. line 8 -  SEARCH_PATH="/usr/local /usr /usr/share/file" +  SEARCH_PATH="$HOME/source/file"

line 50 -  MAGIC_MIME_DIRS="/usr/local/share/file /usr/share/file /usr/share/misc/file /etc /usr/share/misc" +  MAGIC_MIME_DIRS="$HOME/source/file"

Workarounds
So far the best (assumed) method to get the Fileinfo script to work properly, would be to ask DreamHost Support to install the 'libmagic-dev' debian package on your server. Then follow the normal instructions for installing Fileinfo, rather than use the above install script.

Alternatively, using PHP, you can just use the PHP exec or similar functions to execute any Windows or Unix file utility that at least gets similar results. The following example gets the mime type of your file using Unix's 'file' utility:

exec("/usr/bin/file -i -b $path_to_your_file");

See: exec PHP function

See: Unix 'file' utility