Що безпечно для потоків чи не для потоків у PHP?


773

Я бачив різні файли бінарних файлів для PHP, як, наприклад, безпека без потоку чи потоку?

Що це означає?

Яка різниця між цими пакетами?


18
Про безпеку теми ви можете прочитати на en.wikipedia.org/wiki/Thread_safety щодо PHP: Чи безпечний PHP для потоків, не вірите брехні: PHP не є безпечним для потоків, але різниця між безпечним потоком PHP та безпечним binarie там доступно багато ресурсів. Шукайте тут на сайті Stackoverflow або Google.
TigerTiger

Відповіді:


668

Необхідний фон для паралельних підходів:

Різні веб-сервери реалізують різні методи паралельної обробки вхідних HTTP-запитів. Досить популярною технікою є використання потоків - тобто веб-сервер створить / присвятить один потік для кожного вхідного запиту. Веб-сервер Apache HTTP підтримує декілька моделей для обробки запитів, в одній з яких (званий робочим MPM) використовуються потоки. Але він підтримує іншу модель одночасності під назвою prefork MPM, яка використовує процеси - тобто веб-сервер створить / виділить один процес для кожного запиту.

Існують також інші абсолютно різні моделі одночасності (з використанням асинхронних розеток та вводу / виводу), а також ті, що поєднують дві або навіть три моделі разом. Для того, щоб відповісти на це запитання, ми торкаємося лише двох вищезазначених моделей і беремо HTTP-сервер Apache як приклад.

Необхідна інформація про те, як PHP "інтегрується" з веб-серверами:

Сам PHP не відповідає на фактичні запити HTTP - це завдання веб-сервера. Тож ми налаштовуємо веб-сервер для переадресації запитів на PHP для обробки, потім отримуємо результат і відправляємо його назад користувачеві. Існує кілька способів зв’язувати веб-сервер із PHP. Для HTTP-сервера Apache найпопулярнішим є "mod_php". Цей модуль насправді є самим PHP, але складений як модуль для веб-сервера, і тому він завантажується прямо всередині нього.

Існують і інші методи зв’язування PHP з Apache та іншими веб-серверами, але mod_php є найпопулярнішим і також служить для відповіді на ваше запитання.

Можливо, вам не знадобилося раніше розуміти ці деталі, тому що хостинг компаній та дистрибутивів GNU / Linux постачаються з усім, що нам підготовлено.

Тепер, на ваше запитання!

Оскільки з mod_php PHP завантажується прямо в Apache, якщо Apache збирається обробляти паралельність за допомогою свого Worker MPM (тобто, використовуючи Threads), PHP повинен мати можливість працювати в цьому ж багатопотоковому середовищі - тобто PHP повинен будьте безпечні для ниток, щоб мати можливість грати в м'яч правильно з Apache!

У цей момент вам слід подумати "ОК, тому якщо я використовую багатопотоковий веб-сервер і збираюся вставити PHP прямо в нього, то я повинен використовувати безпечну для потоків версію PHP". І це було б правильне мислення. Однак, як це буває, безпека потоків PHP дуже суперечлива . Це полегшення, якщо ти справді справді знаєш, що ти робиш.

Підсумкові ноти

У випадку, якщо вам цікаво, моя особиста порада буде не використовувати PHP у багатопотоковому середовищі, якщо у вас є вибір!

Говорячи лише про середовищі на базі Unix, я б сказав, що, на щастя, ви повинні думати про це лише в тому випадку, якщо ви збираєтеся використовувати PHP з веб-сервером Apache, і в цьому випадку вам рекомендується перейти з форфором MPM Apache (який не використовує потоки, тому безпека потоків PHP не має значення) і всі дистрибутиви GNU / Linux, про які я знаю, приймуть це рішення за вас, коли ви встановлюєте Apache + PHP через їх пакетну систему, навіть не вимагаючи від вас для вибору. Якщо ви збираєтеся використовувати інші веб-сервери, такі як nginx або lighttpd , у вас все одно не буде можливості вставляти PHP. Ви будете дивитись на використання FastCGI або щось рівнозначне, що працює в іншій моделі, де PHP абсолютно позавеб-сервера з декількома процесами PHP, які використовуються для відповіді на запити, наприклад, через FastCGI. У таких випадках безпека ниток також не має значення. Щоб побачити, яку версію використовує ваш веб-сайт, поставте файл, що містить <?php phpinfo(); ?>ваш сайт, і шукайте Server APIзапис. Це може сказати щось на кшталт CGI/FastCGIабо Apache 2.0 Handler.

Якщо ви також дивитесь на версію PHP командного рядка - безпека теми не має значення.

Нарешті, якщо безпека нитки не має значення, то яку версію ви повинні використовувати - безпечну для потоку чи безпечну для потоку? Чесно кажучи, у мене немає наукової відповіді! Але я б здогадався, що версія, яка не є безпечною для потоків, є швидшою та / або меншою помилкою, інакше вони б просто запропонували безпечну для потоків версію і не потурбувались дати нам вибір!


2
Так PHP-FPM не є потоком? Це вирішує проблему, оскільки Fast CGI використовується на серверах nginx.
Xeoncross

41
Дивовижна деталь, я програмував PHP протягом багатьох років і ніколи цього не знав.
Патрік

1
@Xeoncross: Взагалі це правильно, і на практиці це одна з чудових причин керувати процесами PHP поза Apache. Я переходжу цей аспект у своїй відповіді.
Дж. М. Бекер

Єдина проблема тут полягає в тому, що PHP-FPM недоступний під Windows. По крайней мере, як рідне тіло.
Денис V

9
Чи безпека потоку PHP все ще залишається "дуже оскарженою" (у 2015 році та у версії 7)?
Altiano Gerung

261

Для мене я завжди вибираю безпечну версію, що не стосується потоків, оскільки я завжди використовую nginx або запускаю PHP з командного рядка.

Бездротова безпечна версія повинна використовуватися, якщо ви встановлюєте PHP як бінарний CGI, інтерфейс командного рядка або інше середовище, де використовується лише один потік.

Безпечна версія для потоків повинна використовуватися, якщо ви встановлюєте PHP як модуль Apache в робочому MPM (мультиобробна модель) або в іншому середовищі, де одночасно працюють кілька потоків PHP.


1
greg ваша відповідь повинна була бути: "Thread Safe версія повинна використовуватися, якщо ви хочете встановити PHP як модуль Apache, де працівник є MPM"
wlf

9
так PHP, що приходить з Xampp на Windows NTS або TS?
Абудая

1
Що робити, якщо ви використовуєте вбудований веб-сервер PHP? Який варіант PHP використовувати для досягнення оптимальної продуктивності?
Аріод

1
@Dario Я думаю, що це лише Windows.
Грег

1
@ChristopherShaw чувак, відповідь містить ТОЛЬКУ думку. Чому немає джерела чи причини ЧОМУ використовувати ZTS у поєднанні з модулем Apache. Це неправдива відповідь. Навіть 217 ppl може бути неправильним m8.
Даніель В.

30

Apache MPM prefork з modphp використовується тому, що його легко налаштувати / встановити. Виконання продуктивності - це досить неефективно. Мій кращий спосіб зробити стек, FastCGI / PHP-FPM. Таким чином ви можете використовувати набагато швидший MPM Worker. Весь PHP залишається без потоку, але Apache подається з потоком (як слід).

Так в основному, знизу вгору

Linux

Apache + MPM Worker + ModFastCGI (НЕ FCGI) | (або) | Черокі | (або) | Nginx

PHP-FPM + APC

ModFCGI неправильно підтримує PHP-FPM або будь-які зовнішні програми FastCGI. Він підтримує лише сценарії FastCGI, що не управляються процесом. PHP-FPM - це менеджер процесів PHP FastCGI.


21

Відповідно до документації PHP ,

Що означає безпека потоку під час завантаження PHP?

Безпека потоку означає, що двійковий файл може працювати в багатопотоковому контексті веб-сервера, наприклад Apache 2 в Windows. Безпека потоку працює, створюючи локальну копію пам’яті у кожному потоці, щоб дані не стикалися з іншим потоком.

Отже, що я вибираю? Якщо ви вирішите запустити PHP як двійковий файл CGI, тоді вам не знадобиться безпека потоку, оскільки двійковий файл викликається при кожному запиті. Для багатопотокових веб-серверів, таких як IIS5 та IIS6, слід використовувати потокову версію PHP.

Наступні бібліотеки не є безпечними для потоків. Вони не рекомендуються для використання в багатопотокових середовищах.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.