дмитрий суслов 2013.04.19, бус, ускоряем работу интернет-магазина
PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot...
-
Upload
marjorie-west -
Category
Documents
-
view
243 -
download
0
Transcript of PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot...
![Page 1: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/1.jpg)
PHP + Erlangускоряем checkout
![Page 2: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/2.jpg)
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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/3.jpg)
Erlang – язык программирования
• Функциональный
• Старый (1987 год), но до сих пор активно развивающийся (последний релиз – апрель 2012)
• Создавать много легковесных процессов
• Транслируется в байт-код и запускается виртуальной машиной
![Page 4: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/4.jpg)
Многопоточность
• PHP и так для каждого HTTP запроса создает новый поток
• Чрезмерная многопоточность усложняет программу
• Хотя, кое где многопоточность нужна
![Page 5: PHP + Erlang ускоряем checkout. Checkout – оформление заказа Screenshot Onepage checkout server Ajax request Next step HTML Database.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/5.jpg)
Демонизация 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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/6.jpg)
Инфраструктура
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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/7.jpg)
Пример кода 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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/8.jpg)
Пример кода 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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/9.jpg)
Как работает 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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/10.jpg)
• 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.](https://reader035.fdocuments.net/reader035/viewer/2022062308/56649e265503460f94b15737/html5/thumbnails/11.jpg)
Ресурсы
PHP eval сервер для erlang - https://github.com/skeltoac/php_app
PHP расширение для запуска Php, как erlang cnode - https://code.google.com/p/mypeb