#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](https://github.com/mheiniger) and [me](https://github.com/DaRaFF) started with an installer here:
https://github.com/mheiniger/webdev-setup
#Installation stack
* PHP Environment
* [PHP5](#php)
* [PEAR](#pear)
* [Phing](#phing)
* General Environment
* [git / github](#git)
* [memcache](#memcache)
* [apache2](#apache2)
* [nginx](#nginx)
* [mysql](#mysql)
* [sqlite](#sqlite)
* [gmagick](#gmagick)
* [curl](#curl)
* PHP QA Environment
* [PHP Codesniffer](#php-codesniffer)
* [PHPUnit](#phpunit)
* [PHP CS Fixer](#php-cs-fixer)
* [PHPStorm IDE](#phpstorm)
* Other
* [php.ini settings](#php-ini)
* [How to debug with XDebug and PHPStorm on Firefox and command line](#debugging-with-phpstorm)
* [Apache2 config example](#apache2-config-example)
* [Nginx config example](#nginx-config-example)
#Installation PHP Environment
##PHP5
```shell
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
```shell
sudo pear channel-update PEAR
sudo pear upgrade PEAR
```
##PHING
```shell
sudo pear channel-discover pear.phing.info
sudo pear install phing/phing
```
#Install General Environment
##git
```shell
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
```shell
sudo apt-get install memcached
sudo apt-get install php5-memcache
```
##apache2
```shell
sudo apt-get install apache2
sudo a2enmod rewrite
sudo apt-get install libapache2-mod-php5
```
##nginx
```shell
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
```shell
sudo apt-get install mysql-server
sudo apt-get install php5-mysql
```
##SQLite
```shell
sudo apt-get install sqlite3 php5-sqlite
#comment in /etc/php5/conf.d/sqlite.ini
extension=sqlite.so
```
##gmagick
```shell
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
```shell
sudo apt-get install curl
```
#Installation PHP QA Environment
##CodeSniffer
```shell
sudo pear install PHP_CodeSniffer
```
* README Symfony2 Coding Standard
* [public](https://github.com/opensky/Symfony2-coding-standard)
* [private](https://github.com/nzzdev/Symfony2-coding-standard/blob/master/README.md)
##PHPUnit
```shell
#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
```shell
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
* Download and install PHP Storm - http://www.jetbrains.com/phpstorm/
* Install Sun JDK - http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html
* increase file watching limit (http://confluence.jetbrains.net/display/IDEADEV/Inotify+Watches+Limit)
```shell
#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*
```shell
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
```shell
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
```shell
#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//.bashrc
export XDEBUG_CONFIG="PHPSTORM";
#reload bash settings
source ~/.bashrc
```
* Edit Settings in PHPStorm
* Go to File->Settings->PHP->Debug
* Change XDebug Debug Port to 9002
* Install Easy XDebug Plugin for Firefox
* https://addons.mozilla.org/de/firefox/addon/easy-xdebug/
##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
```shell
#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`
```shell
# Change user/group of Apache2
# edit /etc/apache2/apache2.conf
User
Group
#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)
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
#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`
```shell
# Change user of Nginx
# edit /etc/nginx/nginx.conf
User
# Change user of php5-fpm
# edit /etc/php5/fpm/pool.d/www.conf
user =
group =
#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
```