какой http ответ пришлет скрипт завершенный через die
Коды ответа HTTP
Код ответа (состояния) HTTP показывает, был ли успешно выполнен определённый HTTP запрос. Коды сгруппированы в 5 классов:
Если вы получили код ответа (состояния), которого нет в данном списке, в таком случае он является не стандартизированным кодом ответа (состояния), вероятней всего он кастомный сервера.
Следующая таблица содержит список всех кодов и их значения:
Этот ответ отсылается, когда веб сервер после выполнения server-driven content negotiation, не нашёл контента, отвечающего критериям, полученным из user agent.
Этот ответ отсылается, когда запрос конфликтует с текущим состоянием сервера.
Этот ответ отсылается, когда запрашиваемый контент удалён с сервера.
Размер запроса превышает лимит, объявленный сервером. Сервер может закрыть соединение, вернув заголовок Retry-After
[php] Реализация разрыва http соединения до окончания работы скрипта
Добрый день!
Есть скрипт, который принимает POST, проверяет данные и, если они валидны, на этом месте можно закрывать HTTP соединение с сообщением об успешном приёме данных (если не валидны, то тоже закрывать, но с сообщением об ошибке), после чего начать длительную и нудную обработку.
а просто die уже некошерно?
а для разных кодов возврата юзать 200 / 403 например.
exit — Output a message and terminate the current script. die — Equivalent to exit().
А точно nginx при этом разорвёт http-соединение?
а при terminate current script у тебя сеанс с юзером не закрывается? o_O
а при terminate current script у тебя сеанс с юзером не закрывается? o_O
хз, хедер close по идее должен говорить клиенту что типа надо-бы и разорвать коннект.
HTTP/1.1 defines the «close» connection option for the sender to signal that the connection will be closed after completion of the response. For example,
in either the request or the response header fields indicates that the connection SHOULD NOT be considered `persistent’ (section 8.1) after the current request/response is complete.
меня тут смущает что «that the connection will be closed after completion of the response».
о, еще мысль пришла. можно же засылать данные не через обычную post форму, а посредством ajax, и на стороне сервера их процессить, не перезагружая страницу.
Ну да, мне и пришла такая мысль. И сделать это через shared memory. Но хотелось бы простого решения 🙂
о, еще мысль пришла. можно же засылать данные не через обычную post форму, а посредством ajax, и на стороне сервера их процессить, не перезагружая страницу.
Ну значит буду пробовать заголовки слать. Спасибо за идею 🙂
Как проследить всю цепочку вызовов в скрипте РНР?
Допустим, у Вас на сервере есть масса скриптов PHP, установлен некий фреймворк, а то и не один. Зачастую, на сайтах, использующих фреймворки, запрос от клиента (например, из браузера) передается к файлу index.php. А вот из него уже – как говорится, во многие веси. И кто же его знает, в какой последовательности и какие конкретно файлы РНР используются при этом. Как это узнать? Рассмотрим несколько способов.
1. Вручную
Самый примитивный способ – это, да, вручную. Открываем каждый файл, смотрим, где там директивы типа include, require, затем открываем файлы, указанные в этих директивах и т.д. Однако, в современных фреймворках таких файлов бывает множество. Часть из них являются исполняемыми, а часть – содержат разные настройки, устанавливают параметры, задают классы и др. И если вручную перебирать их все – на это может быть затрачен не один рабочий день. Т.е. ручной способ можно применять, разве что, для очень небольших проектов.
2. Смотреть логи фреймворков
Многие (если не все) современные фреймрворки позволяют вести логи, т.е. записывают информацию о происходящих процессах в специальные файлы. По умолчанию, туда обычно пишется информация об ошибках, сбоях при работе скриптов РНР. Но, если установить самый подробный уровень логирования (info), то тогда в лог будет сохраняться вся основная информация, происходящая с момента получения клиентского запроса сервером и до момента отправки последнего сообщения сервера клиенту.
Однако, даже при подробном уровне логирования в логи все-таки не включается информация о ВСЕХ подключаемых в процессе обработки клиентского вызова файлах со скриптами РНР. Т.е. логи фреймворков хороши для получения общей информации об обработке вызова (по крайней мере, так обстоит дело с фреймворком laravel). А для детализации все же необходима более подробная информация.
3. Добавить небольшой код в index.php
Теперь рассмотрим, похоже, универсальный способ, который позволяет выяснить, какие файлы со скриптами PHP (с указанием полных путей, естественно) подключались в процессе обработки клиентского вызова.
Для наглядности, сразу рассмотрим практический пример. Пусть есть следующие четыре файла: test.php, t1.php, t2.php, t3.php
Что же, попробуем запустить на выполнение файл test.php. Набрав в браузере что-то типа http://site.ru/test.php (если этот файл расположен в корневом каталоге). И вот что получится:
Обратите внимание, что выведены именно полные пути к файлам, а не их URL.
Что будет, если какой-нибудь из промежуточных подключенных файлов завершит работу?
Можно немного разнообразить ситуацию. Например, добавим условие:
Да, как и ожидалось: раз t3.php не подключался, то, соответственно, он и не присутствует в перечне подключенных файлов при работе РНР-скрипта.
Выводы
Таким образом, добавление небольшой конструкции в самый первый РНР-файл, которым сервер начинает обрабатывать запрос клиента, позволяет проследить всю цепочку подключенных файлов, причем, в их «хронологическом» порядке. Т.е. именно в том порядке, в каком они подключались фактически и, соответственно, выполнялись.
Это позволит облегчить анализ работы сложного скрипта РНР, например, в условиях работы какого-нибудь незнакомого фреймворка.
Также обратим внимание, что при этом вообще не использовалось никаких отладчиков (типа Xdebug), соответственно, не требовалась их установка на сервер.
Как вывести перечень названий всех функций в РНР-скриптах?
Современные сайты, выполненные на языке РНР, представляют собой достаточно сложные, объемные решения. Отчасти это вызвано все усложняющимся функционалом сайтов, а отчасти – и тем, что они, как правило, выполняются в составе той или иной среды – фреймворка. Могут также подключаться дополнительные библиотеки, функции. И иногда, при отладке работы сайта, требуется выяснить – какие функции и в каком порядке выполняются; какие классы реализованы. Посмотрим, как вывести на экран перечень всех функций, реализованных в выполняющихся скриптах РНР.
Вот короткий программный код, который можно вставить, по сути, в любое место выполняющихся скриптов. Проще всего вставить в файл типа index.php (в любое место):
Здесь используется функция get_defined_functions, которая выводит создает массив из имен ВСЕХ функций, которые используются в выполняющихся PHP-скриптах. В том числе – и пользовательских, т.е. которые сформированы программистом – разработчиком сайта. Это – ассоциативный массив массивов, имеющий два индекса:
Индекс ‘user’ содержит только пользовательские функции. Если же вывести массив без индексов вообще, то выведутся и системные (внутренние) функции тоже. Причем, к сожалению, выводятся они НЕ в порядке алфавита. Их количество довольно велико. Так, например, в Denwer (PHP 5.3.29) вывелось 1387 названий внутренних функций. Понятно, что в РНР7/8 их будет еще больше.
Тогда как по индексу ‘user’ будут выведены только те функции, которые написаны программистами и, самое главное, которые использовались в процессе выполнения скрипта. Так, например, если в скрипте будет конструкция типа
то функция f1 отображена не будет. Так как она не будет выполняться.
А как насчет классов?
В рамках ООП (объектно-ориентированное программирование) использование классов, в том числе многоуровневых, типичная практика. Чтобы вывести перечень классов (по аналогии с перечнем функций), можно применять следующий код:
Название классов будут выводиться, в том числе, и для внутренних, т.е. встроенных. Например, в Denwer их вывелось 136.
Константы
Перечень используемых в скриптах констант тоже можно вывести, используя функцию
Которая задает ассоциативный массив, содержащий все константы, в том числе, и пользовательские (т.е. введенные программистами).
Переменные
Чтобы вывести перечень всех переменных, применяющихся в скриптах, можно воспользоваться функцией
Таким образом, зная информацию о функциях, классах, переменных, константах, можно, по сути, составить, своего рода, «карту» выполняющегося скрипта. Впрочем, для этой цели есть и готовые отладчики, тот же Xdebug.
Завершение скрипта Python
Мне известна команда die() в PHP, которая останавливает сценарий на ранней стадии.
Как я могу сделать это в Python?
10 ответов
Выход из Python. Это реализуется путем повышения SystemExit исключение, поэтому выполняйте действия по очистке указано в пунктах наконец try соблюдаются, и можно перехватить попытка выхода на внешнем уровне.
С exit() в конечном итоге «только» вызывает исключение, оно будет только выход процесс при вызове из основного потока, и исключением не является перехваченное.
Обратите внимание, что это «хороший» способ выхода. @ glyphtwistedmatrix ниже указывает на то, что если вы хотите «жесткий выход», вы можете использовать os._exit ( errorcode ), хотя он, вероятно, в некоторой степени специфичен для ОС (например, он может не принимать код ошибки в Windows) и определенно менее дружественен, поскольку не позволяет переводчик делает любую очистку, прежде чем процесс умирает.
Я новичок, но, конечно, это чище и более контролируемо
Программа завершила трассировку (последний вызов был последним): файл «Z: \ Directory \ testdieprogram.py», строка 12, в main () Файл «Z: \ Directory \ testdieprogram.py», строка 8, в main sys.exit () SystemExit
Я только что узнал, что при написании многопоточного приложения raise SystemExit и sys.exit() оба убивают только работающий поток. С другой стороны, os._exit() завершает весь процесс. Это обсуждалось здесь.
Пример ниже имеет 2 потока. Кенни и Картман. Картман должен жить вечно, но Кенни вызывается рекурсивно и должен умереть через 3 секунды. (рекурсивный вызов не лучший способ, но у меня были другие причины)
Есть несколько стандартных способов сделать это:
Это явно не рекомендуется.
В Python 3.5 я пытался включить подобный код без использования модулей (например, sys, Biopy), кроме встроенных, чтобы остановить скрипт и вывести сообщение об ошибке моим пользователям. Вот мой пример:
Позже я обнаружил, что более кратким является просто выдать ошибку:
В качестве параметра вы можете передать код выхода, который будет возвращен в ОС. По умолчанию 0.
Использование ‘or die ()’ для остановки ошибок в PHP
часто в PHP, я вижу:
исходя из python, я знаю, почему это должно работать, потому что or возвращает первое значение, если оно true в логическом контексте, и второе значение в противном случае (см. этой).
но когда я пробую вышеуказанную технику в PHP в другом контексте, например, что-то вроде:
на or не возвращает первое значение («John Doe»), оно возвращает 1.
Почему это работает в mysql_query() результата, но не в других случаях? Плохо ли использовать в случае mysql_query () (игнорировать тот факт, что я не возвращаю полезную ошибку пользователю)?
7 ответов
в PHP назначение переменных (знак равенства) и функции имеют приоритет над or оператора. Это означает, что сначала выполняется функция, а затем возвращаемое значение функции используется в or сравнение. В свою очередь, когда вы используете два значения / переменные вместе с or оператора, он сравнивает два значения первый затем возвращает логическое значение.
таким образом, порядок оценки в этом примере есть:
echo является языковой конструкцией и поэтому фактически не возвращает значение, поэтому он не работает как функция перед or сравнение.
порядок оценки в этом примере:
это то же самое, что
это то же самое, что
то, что вы ищете, вероятно, является тернарным оператором:
вышеуказанное будет работать с PHP 5.3, если у вас есть только PHP 5.2:
как это было бы в Python. Так вот:
PHP делает то, что часто называют «жонглированием типами». Другими словами: PHP преобразует тип любого значения для текущего варианта использования. Поскольку строки будут преобразованы в значения «true», ваше выражение возвращает true. Но echo хочет напечатать строковое выражение и преобразует «true» в 1. В некоторых случаях это раздражает, но если вы это знаете, вы также знаете, как обращаться;)
на or пункт оценивается первым и возвращает логическое значение, которое echo выходов. Если вы хотите вывести текст, вам нужна конструкция if / else, например:
потому что Эхо не является функцией, это языковая конструкция. Он имитирует функцию, но на самом деле это не так 🙂
Я бы никогда не использовал die (), как это, это своего рода грубо. Вы должны правильно обрабатывать свои ошибки, а не просто спасаться.
Если вы хотите реплицировать это поведение и вывод на экран/браузер, вам нужна функция, которая вернет что-то другое, кроме TRUE. функции printf() может сделать это за вас.
- С чем сделать морской коктейль
- get windowscapability такой запрос не поддерживается