РНР.Вопрос
Есть 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 не работает ... в обоих случаях выдаёт, что вызов скрипта был из браузера
...
попробую с принтами от каждой из проверок ... посмотрим что выдаст
странно. Ну давайте разбираться тогда вместе.
Под рукой у меня PHP под виндой вместе с XAMPP. Будет достаточно запустить php my_script.php для эмуляции cronjob?
На сервере эксперименты не хочется делать.
получилось так
С:\xampp\php82>php.exe alex-test.php _SERVER['HTTP_USER_AGENT']): Вызван через cronjob _SERVER['SHELL']): Вызван через браузер _SERVER['REQUEST_METHOD']): Вызван через cronjob isCronJob(): Вызван через браузер
сорри, моя ошибка ... вызов скриптa в таблице cronjobs был прописан как URL. Указал как PHP. После этого скрипт выдал след. строку: "DEBUG - php_sapi_name() returns [cli]". То есть вызов был как cronjob.
Eщё раз всем спасибо за input
Ну вот реальная помощь от ИИ, а то кто-то постоянно твердит что фуфло
Хотя gemini проигрывает чаще.
Ну вот реальная помощь от ИИ, а то кто-то постоянно твердит что фуфло
Раз в год и палка стреляет.
И какая нафиг помощь, если вы опять сломали разметку и запулили сюда длиннющий код? Вред один! От вас и вашего ИИ.
)))
если вы опять сломали разметку
где? У меня на монике всё нормально
запулили сюда длиннющий код
тому, кому надо, не помешает.
Вред один!
Ну как обычно За это время можно было и что-то новое придумать
Вот поиграйтесь лучше, что можно сделать с 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" }
