SERVER SIDE BREAKOUT
                             php




Wednesday, November 2, 11
5 YEARS AGO (2006)


                                 PHP version 5.2.0
                                native JSON support




Wednesday, November 2, 11
MODERN USAGE



                               77% of all websites




Wednesday, November 2, 11
MODERN USAGE



                                Middleware




Wednesday, November 2, 11
INTERFACES


                                 REST
                               Ext.Direct




Wednesday, November 2, 11
REST

                                 Great for APIs
                                 Cross-domain
                             Status code messages
                            One setup for all purposes

                                   echo $json




Wednesday, November 2, 11
REST



                            proxy: {
                                       type: 'rest',
                                       url: 'api/users'
                                   }




Wednesday, November 2, 11
REST


                            Extra server setup may be needed
                             Difficult concurrency (buffering)
                              Requires access to php://input




Wednesday, November 2, 11
EXT.DIRECT

                                         OOB buffering
                                         Effortless setup
                                      API integration (RPC)
                            Easier RPC role-based method distribution

                                          return $array




Wednesday, November 2, 11
EXT.DIRECT

                            Ext.ns("Ext.app");
                            Ext.app.REMOTING_API = {
                               "url":"php/router.php",
                               "type":"remoting",
                               "actions":{
                                  "TestAction":[
                                    {"name":"doEcho","len":1}
                                  ]
                                }
                            };




Wednesday, November 2, 11
EXT.DIRECT


                            proxy: {
                                       type: 'direct',
                                       directFn: doEcho
                                   }




Wednesday, November 2, 11
EXT.DIRECT

                            proxy: {
                                       type: 'direct',
                                        api: {
                                            create : Rpc.users.Add,
                                            read   : Rpc.users.List,
                                            update : Rpc.users.Update,
                                            delete : Rpc.users.Delete
                                   }




Wednesday, November 2, 11
EXT.DIRECT


                            Not cross-domain friendly
                            Needs a router (s-s stack)
                                No file uploading
                            Exception stops execution




Wednesday, November 2, 11
SAMPLE USAGE
                            RESTFUL INTERFACE




Wednesday, November 2, 11
EXT.DIRECT




Wednesday, November 2, 11
JSON VS. JSONP


            {                                 Ext.util.JSONP.callback1({
                ‘name’ : ‘John’,                   ‘name’ : ‘John’,
                ‘email’ : ‘john@smith.com',        ‘email’ : ‘john@smith.com',
                ‘dob‘ : 19781213,                  ‘dob‘ : 19781213,
                ‘kids‘ : [‘Sarah’, ‘Norah’]        ‘kids‘ : [‘Sarah’, ‘Norah’]
            }                                 })




Wednesday, November 2, 11
JSON VS. JSONP

                            $callback = $_REQUEST[“callback”];

                            $select = $db->select()->from('products');
                            $stmt = $select->query();
                            $result = $stmt->fetchAll();
                            $output = json_encode($result);

                            if ($callback) {
                              header('Content-Type: text/javascript');
                              echo $callback . '(' . $output . ');';
                            } else {
                              header('Content-Type: application/x-json');
                              echo $output;
                            }




Wednesday, November 2, 11
BIG APPS



                              Big apps




Wednesday, November 2, 11
BIG APPS


                                      MVC
                            Fat model - thin controller




Wednesday, November 2, 11
BIG APPS



                             Abstracting




Wednesday, November 2, 11
LOADING APP COMPONENTS


                                       Ext.Loader
                            Sencha command / jsbuilder on the fly




Wednesday, November 2, 11
ENVIRONMENT



                                Apache




Wednesday, November 2, 11
ENVIRONMENT


                                    Apache
                                       +
                              Nginx reverse proxy




Wednesday, November 2, 11
ENVIRONMENT


                            SetEnv APP_ENV "development"

                               $_SERVER['APP_ENV'])




Wednesday, November 2, 11
ENVIRONMENT


                                     MIME handling

                            JSONP : application/javascript
                            JSON     : application/json
                            appcache : text/cache-manifest




Wednesday, November 2, 11
ENVIRONMENT



                               File structure




Wednesday, November 2, 11
Wednesday, November 2, 11
ENVIRONMENT



                               DB layout




Wednesday, November 2, 11
TRADITIONAL RELATIONAL
                    MODEL




Wednesday, November 2, 11
CENTRALIZED RELATIONAL
                    MODEL




Wednesday, November 2, 11
Wednesday, November 2, 11
FIREPHP


                            $logger = new Zend_Log();
                            $writer = new Zend_Log_Writer_Firebug();
                            $logger->addWriter($writer);
                            Zend_Registry::set('logger',$logger);




Wednesday, November 2, 11
FIREPHP

             $select = $ssoDb->select() ->from('products');

             $logger->log($select->__toString(), Zend_Log::INFO);
             $logger->log($data, Zend_Log::INFO);




Wednesday, November 2, 11
BAD IDEAS

                          Enclose entire class in a single try/catch block
                        Use sleep to wait for another task/thread to finish
                           Setting global vars to return multiple values
                                     Altering framework files
                          Performing DB aggregate operations in PHP
                                    Keeping connections open




Wednesday, November 2, 11
BAD IDEAS

                        Using self-made cyphers for encryption
              Clear text passwords, CC info, personal details (inc names)
                 Not checking for user credentials on every request
                          Trusting client-side input validation
                   Constructing sql queries by using concatenation
                    Not using DB transactions on multiple changes
                          Direct access to files for download



Wednesday, November 2, 11
Grgur Grisogono
                                @ggrgur




Wednesday, November 2, 11

PHP Server-side Breakout

  • 1.
    SERVER SIDE BREAKOUT php Wednesday, November 2, 11
  • 2.
    5 YEARS AGO(2006) PHP version 5.2.0 native JSON support Wednesday, November 2, 11
  • 3.
    MODERN USAGE 77% of all websites Wednesday, November 2, 11
  • 4.
    MODERN USAGE Middleware Wednesday, November 2, 11
  • 5.
    INTERFACES REST Ext.Direct Wednesday, November 2, 11
  • 6.
    REST Great for APIs Cross-domain Status code messages One setup for all purposes echo $json Wednesday, November 2, 11
  • 7.
    REST proxy: { type: 'rest', url: 'api/users' } Wednesday, November 2, 11
  • 8.
    REST Extra server setup may be needed Difficult concurrency (buffering) Requires access to php://input Wednesday, November 2, 11
  • 9.
    EXT.DIRECT OOB buffering Effortless setup API integration (RPC) Easier RPC role-based method distribution return $array Wednesday, November 2, 11
  • 10.
    EXT.DIRECT Ext.ns("Ext.app"); Ext.app.REMOTING_API = { "url":"php/router.php", "type":"remoting", "actions":{ "TestAction":[ {"name":"doEcho","len":1} ] } }; Wednesday, November 2, 11
  • 11.
    EXT.DIRECT proxy: { type: 'direct', directFn: doEcho } Wednesday, November 2, 11
  • 12.
    EXT.DIRECT proxy: { type: 'direct', api: { create : Rpc.users.Add, read : Rpc.users.List, update : Rpc.users.Update, delete : Rpc.users.Delete } Wednesday, November 2, 11
  • 13.
    EXT.DIRECT Not cross-domain friendly Needs a router (s-s stack) No file uploading Exception stops execution Wednesday, November 2, 11
  • 14.
    SAMPLE USAGE RESTFUL INTERFACE Wednesday, November 2, 11
  • 15.
  • 16.
    JSON VS. JSONP { Ext.util.JSONP.callback1({ ‘name’ : ‘John’, ‘name’ : ‘John’, ‘email’ : ‘john@smith.com', ‘email’ : ‘john@smith.com', ‘dob‘ : 19781213, ‘dob‘ : 19781213, ‘kids‘ : [‘Sarah’, ‘Norah’] ‘kids‘ : [‘Sarah’, ‘Norah’] } }) Wednesday, November 2, 11
  • 17.
    JSON VS. JSONP $callback = $_REQUEST[“callback”]; $select = $db->select()->from('products'); $stmt = $select->query(); $result = $stmt->fetchAll(); $output = json_encode($result); if ($callback) { header('Content-Type: text/javascript'); echo $callback . '(' . $output . ');'; } else { header('Content-Type: application/x-json'); echo $output; } Wednesday, November 2, 11
  • 18.
    BIG APPS Big apps Wednesday, November 2, 11
  • 19.
    BIG APPS MVC Fat model - thin controller Wednesday, November 2, 11
  • 20.
    BIG APPS Abstracting Wednesday, November 2, 11
  • 21.
    LOADING APP COMPONENTS Ext.Loader Sencha command / jsbuilder on the fly Wednesday, November 2, 11
  • 22.
    ENVIRONMENT Apache Wednesday, November 2, 11
  • 23.
    ENVIRONMENT Apache + Nginx reverse proxy Wednesday, November 2, 11
  • 24.
    ENVIRONMENT SetEnv APP_ENV "development" $_SERVER['APP_ENV']) Wednesday, November 2, 11
  • 25.
    ENVIRONMENT MIME handling JSONP : application/javascript JSON : application/json appcache : text/cache-manifest Wednesday, November 2, 11
  • 26.
    ENVIRONMENT File structure Wednesday, November 2, 11
  • 27.
  • 28.
    ENVIRONMENT DB layout Wednesday, November 2, 11
  • 29.
    TRADITIONAL RELATIONAL MODEL Wednesday, November 2, 11
  • 30.
    CENTRALIZED RELATIONAL MODEL Wednesday, November 2, 11
  • 31.
  • 32.
    FIREPHP $logger = new Zend_Log(); $writer = new Zend_Log_Writer_Firebug(); $logger->addWriter($writer); Zend_Registry::set('logger',$logger); Wednesday, November 2, 11
  • 33.
    FIREPHP $select = $ssoDb->select() ->from('products'); $logger->log($select->__toString(), Zend_Log::INFO); $logger->log($data, Zend_Log::INFO); Wednesday, November 2, 11
  • 34.
    BAD IDEAS Enclose entire class in a single try/catch block Use sleep to wait for another task/thread to finish Setting global vars to return multiple values Altering framework files Performing DB aggregate operations in PHP Keeping connections open Wednesday, November 2, 11
  • 35.
    BAD IDEAS Using self-made cyphers for encryption Clear text passwords, CC info, personal details (inc names) Not checking for user credentials on every request Trusting client-side input validation Constructing sql queries by using concatenation Not using DB transactions on multiple changes Direct access to files for download Wednesday, November 2, 11
  • 36.
    Grgur Grisogono @ggrgur Wednesday, November 2, 11