Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

РНР.Вопрос

14.11.24 17:30
Re: РНР.Вопрос
 
AlexNek патриот
AlexNek
в ответ 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.
 

Перейти на