Вход на сайт
РНР.Вопрос
1879 просмотров
Перейти к просмотру всей ветки
в ответ alex445 13.11.24 23:06, Последний раз изменено 14.11.24 17:31 (AlexNek)
Для теста спросил знакомых пацанов
mistral:Да, в PHP есть несколько способов определить, кто вызвал скрипт — браузер клиента или cronjob на сервере. Один из наиболее распространенных способов — это проверка заголовков HTTP-запроса и переменных окружения. ### Проверка заголовков HTTP-запроса Когда скрипт вызывается через браузер, он обычно содержит заголовки, которые отсутствуют при вызове через cronjob. Например, можно проверить наличие заголовка `User-Agent`. ```php if (isset($_SERVER['HTTP_USER_AGENT'])) { // Скрипт вызван через браузер echo "Вызван через браузер"; } else { // Скрипт вызван через cronjob echo "Вызван через cronjob"; } ``` ### Проверка переменных окружения Когда скрипт вызывается через cronjob, он может содержать определенные переменные окружения, которые отсутствуют при вызове через браузер. Например, можно проверить наличие переменной `SHELL`. ```php if (isset($_SERVER['SHELL'])) { // Скрипт вызван через cronjob echo "Вызван через cronjob"; } else { // Скрипт вызван через браузер echo "Вызван через браузер"; } ``` ### Проверка метода запроса Еще один способ — это проверка метода запроса. Обычно, когда скрипт вызывается через браузер, используется метод `GET` или `POST`, а при вызове через cronjob метод запроса может быть не установлен. ```php if (isset($_SERVER['REQUEST_METHOD'])) { // Скрипт вызван через браузер echo "Вызван через браузер"; } else { // Скрипт вызван через cronjob echo "Вызван через cronjob"; } ``` ### Пример использования Вот пример, который объединяет несколько методов для более надежного определения: ```php function isCronJob() { return !isset($_SERVER['HTTP_USER_AGENT']) && !isset($_SERVER['REQUEST_METHOD']) && isset($_SERVER['SHELL']); } if (isCronJob()) { echo "Вызван через cronjob"; } else { echo "Вызван через браузер"; } ``` Этот код проверяет наличие заголовка `User-Agent`, метода запроса и переменной окружения `SHELL` для определения, кто вызвал скрипт. ChatGpt:PHP не имеет встроенной функции, которая точно определяла бы, был ли скрипт вызван браузером или из cronjob. Однако, можно различить эти случаи по наличию определённых заголовков и переменных окружения: 1. **Запрос из браузера** обычно содержит заголовок `$_SERVER['HTTP_USER_AGENT']`. Если его нет, скорее всего, это вызов с сервера. 2. **Cronjob** вызовы, как правило, выполняются без `HTTP_USER_AGENT`, так как это чисто серверный запуск. ### Пример кода для определения ```php function isCronJob() { // Если отсутствует заголовок HTTP_USER_AGENT, вероятно, это cronjob return empty($_SERVER['HTTP_USER_AGENT']); } if (isCronJob()) { echo "Скрипт запущен через cronjob."; } else { echo "Скрипт запущен через браузер."; } ``` ### Дополнительные проверки Для большей уверенности также можно проверять переменную `PHP_SAPI`: ```php function isCronJob() { return empty($_SERVER['HTTP_USER_AGENT']) || php_sapi_name() === 'cli'; } ``` Переменная `php_sapi_name()` возвращает `'cli'`, если скрипт запущен командной строкой, что типично для cronjob.