русский
Germany.ruForen → Архив Досок→ Programmierung

РНР.Вопрос

1879  1 2 alle
a1b3c5 постоялец13.11.24 22:09
a1b3c5
NEW 13.11.24 22:09 

Есть php-скрипт, кот. можно вызвать как URL в интернет-браузере, а можно автоматически как cronjob.

Есть ли в РНР какая-то функция/глобальная переменная, кот. позволяет узнать кто вызвал скрипт — браузер клиента, или cronjob на сервере?

#1 
Срыв покровов патриот13.11.24 22:24
NEW 13.11.24 22:24 
in Antwort a1b3c5 13.11.24 22:09

В 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.


#2 
alex445 патриот13.11.24 23:06
NEW 13.11.24 23:06 
in Antwort Срыв покровов 13.11.24 22:24

Фигасе вы умный! О_о

Я бы столько не запомнил.

#3 
gendy Dinosaur13.11.24 23:23
gendy
NEW 13.11.24 23:23 
in Antwort alex445 13.11.24 23:06

У коли память хорошая. Главное уметь правильно спросить

Фашизм будет разбит


Человека карают только те боги, в которых он верит

#4 
AlexNek патриот14.11.24 17:30
AlexNek
14.11.24 17:30 
in Antwort alex445 13.11.24 23:06, Zuletzt geändert 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.
#5 
a1b3c5 постоялец15.11.24 15:45
a1b3c5
NEW 15.11.24 15:45 
in Antwort Срыв покровов 13.11.24 22:24, Zuletzt geändert 15.11.24 15:46 (a1b3c5)

спасибо за input up


Комбинированный пример
Вот пример, который использует сразу несколько проверок:if (php_sapi_name() === 'cli' || empty($_SERVER['HTTP_USER_AGENT']) || empty($_SERVER['REMOTE_ADDR'])) {echo "Скрипт запущен через cronjob или командную строку\n";} else {echo "Скрипт вызван из браузера\n";}

увы, но этот вариант для cronjob не работает ... в обоих случаях выдаёт, что вызов скрипта был из браузера

...

попробую с принтами от каждой из проверок ... посмотрим что выдаст

#6 
a1b3c5 постоялец15.11.24 17:23
a1b3c5
15.11.24 17:23 
in Antwort AlexNek 14.11.24 17:30, Zuletzt geändert 15.11.24 17:23 (a1b3c5)

спасибо за input up

...

тоже самое что и выше ... вызов как cronjob не распознаёт

#7 
NightWatch коренной житель15.11.24 17:33
NightWatch
NEW 15.11.24 17:33 
in Antwort a1b3c5 15.11.24 17:23

Как ты вызываешь php-скрипт из cronjob'a?

#8 
AlexNek патриот15.11.24 18:00
AlexNek
NEW 15.11.24 18:00 
in Antwort a1b3c5 15.11.24 17:23

странно. Ну давайте разбираться тогда вместе.

Под рукой у меня PHP под виндой вместе с XAMPP. Будет достаточно запустить php my_script.php для эмуляции cronjob?

На сервере эксперименты не хочется делать.

#9 
AlexNek патриот15.11.24 18:47
AlexNek
NEW 15.11.24 18:47 
in Antwort AlexNek 15.11.24 18:00

получилось так

С:\xampp\php82>php.exe alex-test.php
_SERVER['HTTP_USER_AGENT']):    Вызван через cronjob 
_SERVER['SHELL']):              Вызван через браузер
_SERVER['REQUEST_METHOD']):     Вызван через cronjob
isCronJob():                    Вызван через браузер
#10 
a1b3c5 постоялец15.11.24 23:19
a1b3c5
NEW 15.11.24 23:19 
in Antwort a1b3c5 13.11.24 22:09

сорри, моя ошибка ... вызов скриптa в таблице cronjobs был прописан как URL. Указал как PHP. После этого скрипт выдал след. строку: "DEBUG - php_sapi_name() returns [cli]". То есть вызов был как cronjob.


Eщё раз всем спасибо за input glass

#11 
Срыв покровов патриот15.11.24 23:43
NEW 15.11.24 23:43 
in Antwort a1b3c5 15.11.24 23:19

мне не за что

Я только скопировал ответ чатГПТ.

#12 
AlexNek патриот16.11.24 12:03
AlexNek
NEW 16.11.24 12:03 
in Antwort Срыв покровов 15.11.24 23:43

Ну вот реальная помощь от ИИ, а то кто-то постоянно твердит что фуфло спок

Хотя gemini проигрывает чаще.

#13 
alex445 патриот16.11.24 12:23
NEW 16.11.24 12:23 
in Antwort AlexNek 16.11.24 12:03, Zuletzt geändert 16.11.24 12:24 (alex445)
Ну вот реальная помощь от ИИ, а то кто-то постоянно твердит что фуфло

Раз в год и палка стреляет.


И какая нафиг помощь, если вы опять сломали разметку и запулили сюда длиннющий код? Вред один! От вас и вашего ИИ. зло


)))

#14 
AlexNek патриот16.11.24 12:55
AlexNek
NEW 16.11.24 12:55 
in Antwort alex445 16.11.24 12:23, Zuletzt geändert 16.11.24 12:59 (AlexNek)
если вы опять сломали разметку

где? У меня на монике всё нормально смущ


запулили сюда длиннющий код

тому, кому надо, не помешает.


Вред один!

Ну как обычно спок За это время можно было и что-то новое придумать


Вот поиграйтесь лучше, что можно сделать с 3..5 секунд голоса

https://maskgct.github.io/

#15 
Murr патриот18.11.24 03:40
Murr
NEW 18.11.24 03:40 
in Antwort Срыв покровов 13.11.24 22:24
Эти проверки помогут вам различить,


Вообще-то...

В обоих случаях скрипт запускается веб-сервером, получившим соответствующий запрос.

Все что можно получить в РНР - это то, что веб-сервер получил с запросом.

Другой информации - нет и она скриптом никак не получается.

Что именно передавать с запросом - выбор пользователя - можно исключить информацию об браузере/адресе в браузерном запросе, можно добавить в стороннем тооле.

#16 
Murr патриот18.11.24 03:41
Murr
NEW 18.11.24 03:41 
in Antwort alex445 13.11.24 23:06

да, тяжко тебе...хммм

#17 
Срыв покровов патриот18.11.24 06:48
NEW 18.11.24 06:48 
in Antwort Murr 18.11.24 03:40

в каких обоих? Автор уже все понял. Дед, не тупи

сорри, моя ошибка ... вызов скриптa в таблице cronjobs был прописан как URL. Указал как PHP. После этого скрипт выдал след. строку: "DEBUG - php_sapi_name() returns [cli]". То есть вызов был как cronjob.


#18 
uscheswoi_82 коренной житель18.11.24 20:48
NEW 18.11.24 20:48 
in Antwort a1b3c5 13.11.24 22:09

См. 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, а другой только в веб браузере.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#19 
7495 коренной житель20.11.24 08:25
7495
NEW 20.11.24 08:25 
in Antwort Срыв покровов 18.11.24 06:48
в каких обоих? Автор уже все понял. Дед, не тупи


Дед сам не тупи, если он собирается с пользователями работать, то будет анализировать то, что ему пользователь подсунет, или нет?


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" }
Fragen und Antworten - Программируем калькулятор пособий для беженцев вместе.
#20 
1 2 alle