Яка головна причина, що змусила Facebook використовувати C ++ поруч із PHP? Мені цікаво, якщо я роблю веб-сайт із великою кількістю вісторів, чи потрібно мені також використовувати C ++?
Яка головна причина, що змусила Facebook використовувати C ++ поруч із PHP? Мені цікаво, якщо я роблю веб-сайт із великою кількістю вісторів, чи потрібно мені також використовувати C ++?
Відповіді:
Ось чому: HipHop для PHP: рухатися швидко :
Одне з ключових цінностей у Facebook - це швидко рухатися. За останні шість років нам вдалося досягти багато завдяки швидким темпам розвитку, які пропонує PHP. Як мова програмування, PHP проста. Простий у навчанні, простий у написанні, простий для читання та простий налагодження. Ми можемо отримати нових інженерів, що розгорнулися у Facebook набагато швидше з PHP, ніж з іншими мовами, що дозволяє нам швидше впроваджувати інновації.
Сьогодні я рада поділитися проектом невеликою командою дивовижних людей, над якою працюю останні два роки; HipHop для PHP. За допомогою HipHop ми зменшили використання процесора на наших веб-серверах в середньому приблизно на п’ятдесят відсотків, залежно від сторінки. Менше процесора означає менше серверів, що означає менші витрати. Цей проект справив величезний вплив на Facebook. Ми вважаємо, що Інтернет в цілому може отримати користь від HipHop, тому ми випускаємо його як відкритий вихідний вечір у надії, що він приділяє новий фокус масштабуванню великих складних веб-сайтів за допомогою PHP. Хоча HipHop показав нам неймовірні результати, він, безумовно, не є повним, і вам слід зручно використовувати бета-програмне забезпечення, перш ніж випробувати його.
HipHop для PHP технічно не є компілятором. Це швидше трансформатор вихідного коду. HipHop програмно перетворює ваш вихідний код PHP у високооптимізований C ++, а потім використовує g ++ для його компіляції. HipHop виконує вихідний код семантично еквівалентним чином і жертвує деякими рідко використовуваними функціями - наприклад, eval () - в обмін на покращення продуктивності. HipHop включає трансформатор коду, повторне здійснення системи виконання PHP та перезапис багатьох поширених розширень PHP, щоб скористатися цими оптимізаціями продуктивності.
Масштабування PHP як мови сценаріїв
Коріння PHP - це мови сценаріїв, такі як Perl, Python та Ruby, і всі вони мають великі переваги з точки зору продуктивності програміста та здатності швидко перебирати продукти. Це порівнюється з більш традиційними мовами компіляції, такими як C ++ та інтерпретованими мовами, такими як Java. З іншого боку, відомо, що сценарії мови, як правило, є менш ефективними, коли мова йде про використання процесора та пам'яті. Через це щомісяця складно масштабувати Facebook до 400 мільярдів переглядів сторінок на основі PHP.
Один з поширених способів вирішити ці неефективність - переписати більш складні частини програми PHP безпосередньо в C ++ як PHP розширення. Це значною мірою перетворює PHP в мову клею між вашим HTML на передньому кінці та логікою програми в C ++. З технічної точки зору це працює добре, але різко зменшує кількість інженерів, які можуть працювати над всією вашою програмою. Навчання C ++ - це лише перший крок до написання розширень PHP, другий - розуміння API Zend. Зважаючи на те, що наша інженерна команда порівняно невелика - у кожного інженера є понад мільйон користувачів - ми не можемо дозволити собі зробити частину нашої кодової бази менш доступною, ніж інші.
Масштабування Facebook є особливо складним завданням, оскільки майже кожен перегляд сторінки - це користувач, який увійшов у систему та має індивідуальний досвід. Коли ви переглядаєте свою домашню сторінку, нам потрібно шукати всіх ваших друзів, запитувати їх найрелевантніші оновлення (від спеціальної служби, яку ми створили під назвою Multifeed), фільтрувати результати на основі налаштувань конфіденційності, а потім заповнювати розповіді з коментарями , фотографії, лайки та всі багаті дані, які люблять люди у Facebook. Все це лише за секунду. HipHop дозволяє нам записати логіку, яка робить збірку остаточної сторінки в PHP, і швидко її повторити, покладаючись на користувацькі сервіси бек-енду в C ++, Erlang, Java або Python для обслуговування новин, пошуку, чату та інших основних частин сайту.
Починаючи з 2007 року, ми думали про кілька різних способів вирішення цих проблем і навіть намагалися реалізувати декілька з них. Поширена пропозиція - просто переписати Facebook іншою мовою, але, враховуючи складність та швидкість розробки сайту, це потребує певного часу. Ми переписали аспекти Zend Engine - внутрішніх справ PHP - і внесли ці виправлення в проект PHP, але в кінцевому підсумку не побачили того, яке підвищення продуктивності потрібно. Переваги HipHop майже прозорі для швидкості нашого розвитку.
Злому HipHop
Однієї ночі на Хакатоні кілька років тому (див. Prime Time Hack) я розпочав свій перший фрагмент коду, який перетворював PHP на C ++. Мови синтаксично схожі, і C ++ різко перевершує PHP, коли мова йде про використання процесора та пам'яті. Навіть сам PHP написаний на C. Ми знали, що неможливо успішно переписати цілу базу коду такого розміру вручну, але цікавились, що буде, якщо ми побудуємо систему, щоб це робити програмно.
Пошук нових шляхів підвищення продуктивності PHP не нова концепція. Під час запуску Zend Engine перетворює ваш PHP-джерело в опкоди, які потім запускаються через віртуальну машину Zend. Проекти з відкритим кодом, такі як APC та eAccelerator, кешують цей вихід і використовуються більшістю веб-сайтів, що працюють на PHP. Також є Zend Server, комерційний продукт, який робить PHP швидше за допомогою оптимізації коду та кешування. Натомість ми думали про перетворення PHP-джерела безпосередньо на C ++, яке потім може бути перетворене в нативний машинний код. Навіть компіляція PHP не нова ідея, проекти з відкритим кодом, такі як Roadsend та phc, компілюють PHP на C, Quercus компілює PHP на Java, а Phalanger збирає PHP в .Net.
Потрібно сказати, що це пройшло більше часу, ніж для одного хакатона. Через вісім місяців у мене було достатньо коду, щоб продемонструвати, що дійсно можна швидше запустити компільований код. Ми швидко додали в команду Іена Проктора та Мінгхуя Ян, щоб прискорити темп проекту. Наступні десять місяців ми витратили на завершення кодування та наступні півроку тестування на виробничих серверах. Ми з гордістю можемо сказати, що на даний момент ми обслуговуємо понад 90% нашого веб-трафіку за допомогою HipHop, всього лише шість місяців після розгортання.
Як працює HipHop
Основним завданням проекту було подолання розриву між PHP та C ++. PHP - це сценарій мови з динамічним, слабким набором тексту. C ++ - це компільована мова зі статичним набором тексту. Хоча PHP дозволяє писати магічні динамічні функції, більшість PHP є відносно простими. Більш імовірно, що ви бачите,
if (...) {...} else {..}
ніж це бачитеfunction foo($x) { include $x; }
. Саме тут ми і отримуємо успіх у виконанні. По можливості наш генерований код використовує статичну прив'язку для функцій та змінних. Ми також використовуємо умовивід типу, щоб вибрати найбільш конкретний тип для наших змінних і таким чином зберегти пам'ять.Процес трансформації включає три основні етапи:
- Статичний аналіз, де ми збираємо інформацію про те, хто декларує що і залежності,
- Введіть умовивід, коли ми обираємо найбільш конкретний тип між C ++ скалярами, String, Array, класами, Object та Variant, і
- Генерація коду, яка здебільшого є прямим листуванням із заяв та виразів PHP на C ++ операторами та виразами.
Ми також розробили HPHPi, який є експериментальним перекладачем, розробленим для розробки. Під час використання HPHPi вам не потрібно збирати вихідний код PHP перед його запуском. Це допомогло нам зафіксувати помилки в самому HipHop та надає інженерам спосіб використовувати HipHop, не змінюючи, як вони пишуть PHP.
Загалом HipHop дозволяє нам зберігати найкращі аспекти PHP, використовуючи при цьому переваги продуктивності C ++. Загалом ми написали понад 300 000 рядків коду та понад 5000 одиниць тестів.
Коротка відповідь - ні, вам не потрібен C ++.
Я вважаю, ви маєте на увазі HipHop . Якщо ви читаєте про вдосконалення, які вона дає, це приблизно 50%. Це дуже важливо, якщо ви Facebook, який має тисячі серверів інтерфейсу. Скорочення навантаження на них означає економію мільйонів у дата-центрі. У випадку компанії, яка має 10-100 прифронтових серверів, вартість розробки значно перевищує можливу економію. У будь-якому разі, найважча обробка проводиться в бек-енді, як правило, це рішення RDBMS або NoSQL, розроблені як високооптимізований код C / C ++.
Звичайно, можна було досягти значно більшої економії, просто скинувши PHP повністю. Але це не те, що можна зробити з величезною базою коду, як у випадку з Facebook.
Тепер, для іншої частини питання: якщо ви дійсно хочете знати, як боротися з величезними навантаженнями, прочитайте блог із високою масштабованістю , особливо частину архітектури реальної життєдіяльності.
Це можливо з PHP, але, безумовно, це не мій вибір. Якщо ви хочете динамічної мови, Python, Ruby або, можливо, Lua були б набагато кращим вибором.
Приємна річ у підході ФБ - це те, що їм не довелося приймати рішення відразу. Ви повинні зробити те саме. Виберіть мову, яка робить вас найбільш продуктивними, але будьте впевнені, що вона легко поєднується з C / C ++.
Коли у вас мільйони користувачів і вам потрібно поголити мілісекунди поза часом відгуку, ви можете оптимізувати критичні шляхи, використовуючи C / C ++.
Елементом C ++, який використовується Facebook, є HHVM.
Це віртуальна машина HIPHOP. Хоча написаний на C ++, він по суті є "кращим інтерпретатором PHP".
Код php компілюється в байт-код, який потім інтерпретується HHVM під час виконання та підлягає оптимізації "Just In Time" під час його запуску.
Розробники в face book все ще пишуть здебільшого на PHP, і те, що ви бачите у своєму браузері, майже напевно виводить програмою PHP - все, на що було складено та інтерпретовано програмою HHVM.
Фактичний HHVM є вільно доступним відкритим кодом. Тож якщо вам потрібно обслуговувати один мільйон милих кошенят на годину, тоді ви можете завантажити HHVM і прискорити ваш сервер з мінімальними змінами на ваш PHP.