Top Banner
PHP + Erlang ускоряем checkout
12

PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Dec 26, 2015

Download

Documents

Marjorie West
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

PHP + Erlangускоряем checkout

Page 2: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Checkout – оформление заказа

Screenshot

Onepage checkout

server

Ajax request

Next step HTML

Database

Page 3: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Erlang – язык программирования

• Функциональный

• Старый (1987 год), но до сих пор активно развивающийся (последний релиз – апрель 2012)

• Создавать много легковесных процессов

• Транслируется в байт-код и запускается виртуальной машиной

Page 4: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Многопоточность

• PHP и так для каждого HTTP запроса создает новый поток

• Чрезмерная многопоточность усложняет программу

• Хотя, кое где многопоточность нужна

Page 5: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Демонизация PHP

load

save

Request 1

Response 1

load

save

Request 2

Response 2

load

save

Request 3

Response 3

Process #1

Process #2

Process #3

Web (PHP) application

load

save

Request 1

Request 2

Request 3

Response 1

Response 2

Response 3

Process #1

Daemon

Page 6: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Инфраструктура

Front script

Erlang manager

PHP node

PHP node

PHP node

PHP node

PHP node

1. Упаковывает Request2. Отсылает его в Erlang Manager3. Получает и распаковывает

Response

Создает новый или передает управление в существующий процесс

Неподходящие запросы выполняются как обычно

1. Распаковывает Request2. Обрабатывает его3. Упаковывает и отсылает

обратно Response

Magento

user 1 user 2 user 3 user 4 user 5

user 1 user 2 user 3 user 4 user 5

Page 7: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Пример кода front script

<?php if (isCheckoutRequest()) { runParallel();} else { runMagento();}

function runParallel() { $parallel = new Mage_Parallel( array('host' => '127.0.0.1', 'port' => '7000', 'secret_cookie' => 'Secret‘) );

$env = array('server' => $_SERVER, 'get' => $_GET, 'post' => $_POST, ‘cookie' => $_COOKIE); $result = unserialize($parallel->call('runApp', array($env), $_COOKIE[‘frontend’])); $response = new Zend_Controller_Response_Http(); $response->setBody($result['body'])->setHttpResponseCode($result['responseCode']); foreach ($result['headers'] as $header) { $response->setHeader($header['name'], $header['value'], $header['replace']); }

$response->sendResponse();}

Page 8: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Пример кода PHP node

<?phpinclude_once '../../../../../../app/Mage.php';$isMageRun = false;

function runApp($env) { $_SERVER = $env['server']; $_GET = $env['get']; $_POST = $env['post']; $_COOKIE = $env['cookie']; ob_start(); if (!$isMageRun) { Mage::run(); $isMageRun = true; } else { preapreApp(); /* clean some singletons and objects*/ Mage::app()->setRequest(new Mage_Core_Controller_Request_Http()); Mage::registry('controller')->dispatch(); } ob_get_clean();

return serialize(array( 'body' => Mage::app()->getResponse()->getBody(), 'headers' => Mage::app()->getResponse()->getHeaders(), 'responseCode' => Mage::app()->getResponse()->getHttpResponseCode() ));}

Page 9: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Как работает checkout

• load Quote• collect totals• save Quote

• load Quote• collect totals• save Quote

• load Quote• collect totals• save Quote

• load Quote• collect totals• save Quote• create and save order

MySQLdatabase

Checkout steps Quote process

step 1

step 2

step 3

step 4

Page 10: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

• load Quote• collect totals• save Quote

• load Quote• collect totals• save Quote

• load Quote• collect totals• save Quote

• load Quote• collect totals• save Quote• create and save order

MySQLdatabase

Quote processCheckout steps

step 1

step 2

step 3

step 4

Как работает checkout

Page 11: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Ресурсы

PHP eval сервер для erlang - https://github.com/skeltoac/php_app

PHP расширение для запуска Php, как erlang cnode - https://code.google.com/p/mypeb

Page 12: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.

Q&AРуслан Грабовой[email protected]

Саша Кусакин [email protected]