РНР.Вопрос
Есть php-скрипт, кот. можно вызвать как URL в интернет-браузере, а можно автоматически как cronjob.
Есть ли в РНР какая-то функция/глобальная переменная, кот. позволяет узнать кто вызвал скрипт — браузер клиента, или cronjob на сервере?
В PHP нет встроенной функции, которая прямо укажет, был ли скрипт вызван браузером клиента или cronjob’ом на сервере. Однако, можно определить это косвенно, используя некоторые условия:
1. Проверка наличия $_SERVER['HTTP_USER_AGENT']:
• Если скрипт вызван браузером, обычно будет установлена переменная $_SERVER['HTTP_USER_AGENT'], которая содержит информацию о браузере пользователя.
• При запуске через командную строку (например, cronjob) эта переменная обычно не определена.
Пример:
if (php_sapi_name() === 'cli' || empty($_SERVER['HTTP_USER_AGENT'])) {
echo "Скрипт запущен через cronjob или из командной строки\n";
} else {
echo "Скрипт вызван из браузера\n";
}
2. Использование php_sapi_name():
• Функция php_sapi_name() возвращает тип интерфейса, через который запущен скрипт.
• Если скрипт запускается через командную строку или cronjob, php_sapi_name() вернёт 'cli'. Если скрипт вызван через браузер (HTTP-запрос), результат будет отличаться (например, 'apache2handler' или 'cgi-fcgi').
3. Проверка других переменных окружения:
• Переменная $_SERVER['REMOTE_ADDR'] хранит IP-адрес клиента, который делает запрос. Если она пуста, то, скорее всего, скрипт был вызван через командную строку.
Пример:
if (empty($_SERVER['REMOTE_ADDR'])) {
echo "Скрипт запущен через cronjob или командную строку\n";
} else {
echo "Скрипт вызван из браузера\n";
}
Комбинированный пример
Вот пример, который использует сразу несколько проверок:
if (php_sapi_name() === 'cli' || empty($_SERVER['HTTP_USER_AGENT']) || empty($_SERVER['REMOTE_ADDR'])) {
echo "Скрипт запущен через cronjob или командную строку\n";
} else {
echo "Скрипт вызван из браузера\n";
}
Эти проверки помогут вам различить, откуда был вызван скрипт — из браузера или как cronjob.
Для теста спросил знакомых пацанов
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.
спасибо за input ![]()
Комбинированный пример
Вот пример, который использует сразу несколько проверок:if (php_sapi_name() === 'cli' || empty($_SERVER['HTTP_USER_AGENT']) || empty($_SERVER['REMOTE_ADDR'])) {echo "Скрипт запущен через cronjob или командную строку\n";} else {echo "Скрипт вызван из браузера\n";}
увы, но этот вариант для cronjob не работает ... в обоих случаях выдаёт, что вызов скрипта был из браузера
...
попробую с принтами от каждой из проверок ... посмотрим что выдаст
Ну вот реальная помощь от ИИ, а то кто-то постоянно твердит что фуфло
Раз в год и палка стреляет.
И какая нафиг помощь, если вы опять сломали разметку и запулили сюда длиннющий код? Вред один! От вас и вашего ИИ. ![]()
)))
если вы опять сломали разметку
где? У меня на монике всё нормально ![]()
запулили сюда длиннющий код
тому, кому надо, не помешает.
Вред один!
Ну как обычно
За это время можно было и что-то новое придумать
Вот поиграйтесь лучше, что можно сделать с 3..5 секунд голоса
Эти проверки помогут вам различить,
Вообще-то...
В обоих случаях скрипт запускается веб-сервером, получившим соответствующий запрос.
Все что можно получить в РНР - это то, что веб-сервер получил с запросом.
Другой информации - нет и она скриптом никак не получается.
Что именно передавать с запросом - выбор пользователя - можно исключить информацию об браузере/адресе в браузерном запросе, можно добавить в стороннем тооле.
в каких обоих? Автор уже все понял. Дед, не тупи
сорри, моя ошибка ... вызов скриптa в таблице cronjobs был прописан как URL. Указал как PHP. После этого скрипт выдал след. строку: "DEBUG - php_sapi_name() returns [cli]". То есть вызов был как cronjob.
См. https://onedev.net/post/1012
В crontab:
IS_CRON=true
PHP-скрипт:
$isCli = (php_sapi_name() === 'cli');
$isCron = ($isCli && isset($_SERVER['IS_CRON']));
if ($isCron) {
echo "Скрипт запущен по CRON'у\n";
}
Но я бы разделил на два PHP-скрипта, один вызывался бы только в cronjob, а другой только в веб браузере.
Моя ФЛ Он и Онав каких обоих? Автор уже все понял. Дед, не тупи
Дед сам не тупи, если он собирается с пользователями работать, то будет анализировать то, что ему пользователь подсунет, или нет?
https://foren.germany.ru/programmer/f/38830835.html
headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" }
Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.



список