dharma017
10/23/2013 - 4:31 AM

ubuntu-php-development-environment.md

#Introduction If you're a php developer on ubuntu, there comes the time where you have to install/reinstall your system. I did it already a few times and i decided to write down the steps for a typical web developer stack with php. This is for a developer machine and not for a live environment!

I hope it helps you too!

fyi @mheiniger and me started with an installer here: https://github.com/mheiniger/webdev-setup

#Installation stack

#Installation PHP Environment ##PHP5

sudo apt-get install php5-cli php5-common php-apc php-pear php5-xdebug php5-curl php5 php5-dev
sudo apt-get install php5-xsl
sudo apt-get install php5-intl

##PEAR

sudo pear channel-update PEAR
sudo pear upgrade PEAR

##PHING

sudo pear channel-discover pear.phing.info
sudo pear install phing/phing

#Install General Environment ##git

sudo apt-get install git
git config --global color.branch auto
git config --global color.diff auto
git config --global color.status auto

#Manual on how to install ssh keys on github http://help.github.com/linux-set-up-git/

##memcache

sudo apt-get install memcached
sudo apt-get install php5-memcache

##apache2

sudo apt-get install apache2
sudo a2enmod rewrite
sudo apt-get install libapache2-mod-php5

##nginx

sudo apt-get install nginx php5-fpm

#edit listen port in /etc/php5/fpm/pool.d/www.conf
listen = 127.0.0.1:9009

sudo /etc/init.d/php5-fpm restart
sudo service nginx restart

##mysql

sudo apt-get install mysql-server
sudo apt-get install php5-mysql

##SQLite

sudo apt-get install sqlite3 php5-sqlite

#comment in /etc/php5/conf.d/sqlite.ini
extension=sqlite.so

##gmagick

sudo apt-get install graphicsmagick libgraphicsmagick1-dev
sudo pecl install gmagick-beta

#Create file /etc/php5/conf.d/gmagick.ini and add a line 
extension=gmagick.so

##curl

sudo apt-get install curl

#Installation PHP QA Environment ##CodeSniffer

sudo pear install PHP_CodeSniffer

##PHPUnit

#necessary if you already have installed phpunit via apt-get
sudo apt-get remove phpunit

#install newest version of phpunit
sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover pear.symfony-project.com
sudo pear channel-discover components.ez.no
sudo pear update-channels
sudo pear upgrade-all
sudo pear install --alldeps phpunit/PHPUnit
sudo pear install --force --alldeps phpunit/PHPUnit

#phpunit Skeleton Generator
sudo pear config-set auto_discover 1
sudo pear install pear.phpunit.de/PHPUnit_SkeletonGenerator

##php-cs-fixer

sudo wget http://cs.sensiolabs.org/get/php-cs-fixer.phar -O /usr/local/bin/php-cs-fixer
sudo chmod a+x /usr/local/bin/php-cs-fixer

##PHP Storm IDE

#add line to /etc/sysctl.conf
fs.inotify.max_user_watches = 524288

#apply changes
sudo sysctl -p

#Configuration

##PHP

  • Change this settings in /etc/php5/cli/php.ini for for all webservers
  • Change this settings in /etc/php5/apache2/php.ini if you have installed apache2
  • Change this settings in /etc/php5/fpm/php.ini if you have installed nginx and fpm
memory_limit = 512m
display_errors = On
html_errors = On
post_max_size = 32m
upload_max_filesize = 32m
default_charset = utf8
  • Edit /etc/php5/cli/conf.d/xdebug.ini
xdebug.max_nesting_level = 1000

#Debugging with XDebug on Browser and Command line

The example is made for PHPStorm IDE with Apache2 webserver. But other IDE's or webservers should work in a similar way. ##Configuration

#Edit /etc/php5/cli/conf.d/xdebug.ini
xdebug.remote_enable=On
xdebug.remote_host=localhost
xdebug.remote_port=9002
xdebug.remote_handler=dbgp
xdebug.profiler_append=Off
xdebug.profiler_enable=Off
xdebug.profiler_enable_trigger=Off
xdebug.profiler_output_dir="/tmp/kcachegrind"

sudo service apache2 restart

#Add to /home/<your_username>/.bashrc
export XDEBUG_CONFIG="PHPSTORM";

#reload bash settings
source ~/.bashrc

##Debugging via Firefox

  • Firefox: Click on ‘StartXDebug Session’ Symbol on bottom right
  • PHPStorm: Click on Run->Start Listen PHP Debug Connections
  • PHPStorm: Set a breakpoint and do call via firefox browser

##Debugging via Console

  • PHPStorm: Click on Run->Start Listen PHP Debug Connections
  • Set a breakpoint and run a console command

##PHPStorm Config

#for PHPUnit Code Completion add PHPUnit path under file->settings->directories
#Usually it’s stored in 
/usr/share/php/PHPUnit

#for PHPUnit Skeleton Generator add phpunit-skelgen under file->settings->ProjectSettings->PHP->PHPUnit->SkeletonGenerator
#Usually it's stored in
/usr/bin/phpunit-skelgen

/usr/bin/phpunit-skelgen

#Apache2 config example (with Symfony2 framework) Assume you want to have your project in /home/username/my_webside

# Change user/group of Apache2
# edit /etc/apache2/apache2.conf
User <username>
Group <usergroup>

#Add entry to /etc/hosts
127.0.0.1 www.my_webside.lo

#Create file 
/etc/apache2/sites-available/www.my_webside.lo

#edit file (with example config)
<VirtualHost *:80>
    ServerName  www.my_webside.lo
    DocumentRoot /home/username/my_webside/web
    ErrorLog ${APACHE_LOG_DIR}/www.my_webside.lo.error.log
    CustomLog ${APACHE_LOG_DIR}/www.my_webside.lo.access.log common
</VirtualHost>

#create symbolic link to enable a site
sudo ln -s /etc/apache2/sites-available/www.my_webside.lo /etc/apache2/sites-enabled/www.my_webside.lo

#restart apache
sudo /etc/init.d/apache2 restart

#Nginx config example (with Symfony2 framework) Assume you want to have your project in /home/username/my_webside

# Change user of Nginx
# edit /etc/nginx/nginx.conf
User <username>

# Change user of php5-fpm
# edit /etc/php5/fpm/pool.d/www.conf
user = <username>
group = <group of user>

#Add entry to /etc/hosts
127.0.0.1 www.my_webside.lo

#Create file 
/etc/nginx/sites-available/www.my_webside.lo

#edit file (with example config)
#www.my_webside.lo
server {
    listen 80;
    server_name www.my_webside.lo;

    access_log  /var/log/nginx/www.my_webside.lo.log;

    location / {
        root /home/username/my_webside/web;
        index  index.html index.htm index.php app_dev.php;
        if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
                rewrite ^(.*) /app.php$1 last;
        }
    }


 location ~ \.php($|/) {
    set  $script     $uri;
    set  $path_info  "";

    if ($uri ~ "^(.+\.php)(/.+)") {
      set  $script     $1;
      set  $path_info  $2;
    }

    fastcgi_pass   127.0.0.1:9009;

    include fastcgi_params;
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param  SCRIPT_FILENAME  /home/username/my_webside/web$script;
    fastcgi_param  PATH_INFO        $path_info;
  }

}

#create symbolic link to enable a site
sudo ln -s /etc/nginx/sites-available/www.my_webside.lo /etc/nginx/sites-enabled/www.my_webside.lo

#restart nginx
sudo /etc/init.d/nginx restart
sudo /etc/init.d/php5-fpm restart