Перейти к содержимому

Исчерпывающее руководство по функции mysqli_thread_safe в PHP

При работе с базами данных MySQL в PHP расширение mysqli предоставляет множество функций для выполнения операций с базой данных. Часто разработчики спрашивают, как проверить, является ли расширение mysqli потокобезопасным.

В этом руководстве мы разъясним, как работает потокобезопасность в MySQLi, объясним, почему это конфигурация времени компиляции, а не функция времени выполнения, и покажем, как проверить это в вашей среде.

Что такое функция mysqli_thread_safe?

Функции mysqli_thread_safe() в PHP не существует. Потокобезопасность расширения mysqli определяется на этапе компиляции, а не во время выполнения. В PHP нет встроенной функции для динамической проверки этого статуса.

Вместо этого потокобезопасность зависит от того, была ли PHP скомпилирована с включённым модулем Zend Thread Safety (ZTS). Когда ZTS активен, PHP может безопасно обрабатывать несколько потоков в рамках одного процесса, что необходимо для многопоточных веб-серверов (например, Apache с MPM worker или event) или CLI-скриптов, выполняющих параллельные задачи. Если ZTS отключён, PHP предполагает однопоточную среду, и использование mysqli в многопоточном контексте может привести к состояниям гонки или сбоям.

Особенности функции mysqli_thread_safe

Поскольку потокобезопасность является конфигурацией сборки, а не функцией времени выполнения, «возможности» MySQLi в многопоточных средах полностью зависят от того, как была скомпилирована PHP:

1. Конфигурация времени компиляции

Потокобезопасность устанавливается при сборке PHP. Вы можете проверить это, изучив конфигурацию сборки PHP или запустив php -i | grep "Thread Safety". Если возвращается enabled, ZTS активен, и mysqli будет работать безопасно в этом контексте.

2. Работа в многопоточной среде

В многопоточных конфигурациях каждому потоку требуется собственное подключение к базе данных. Использование одного экземпляра mysqli несколькими потоками небезопасно и приведёт к непредсказуемому поведению. Всегда создавайте новое подключение для каждого потока.

Как использовать функцию mysqli_thread_safe

Поскольку потокобезопасность нельзя проверить с помощью функции времени выполнения, используйте один из следующих методов для проверки вашей среды:

1. Использование phpinfo()

Создайте простой PHP-файл и запустите его в браузере или CLI:

php
<?php
phpinfo();

Найдите раздел Zend Engine. Если Thread Safety указан как enabled, ваша установка PHP поддерживает многопоточное выполнение, и mysqli будет работать безопасно в этом контексте.

2. Проверка через командную строку

Вы также можете проверить это напрямую из терминала:

bash
php -i | grep "Thread Safety"

Это выведет Thread Safety => enabled или Thread Safety => disabled.

Заключение

Потокобезопасность расширения mysqli — это настройка времени компиляции, управляемая модулем Zend Thread Safety (ZTS), а не функция времени выполнения. Проверяя конфигурацию сборки PHP с помощью phpinfo() или инструментов командной строки, вы можете убедиться, что ваша среда правильно настроена для многопоточных операций с базой данных. Всегда создавайте отдельные подключения mysqli для каждого потока, чтобы поддерживать целостность данных и предотвращать состояния гонки.

Практика

Что означает, что PHP является потокобезопасным?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.