Процедурное настоящее PHP
ПХП, к сожалению, в сердце ещё глубоко процедурный язык. Наткнулся на очередную особенность. Сначала небольшая предыстория.
Многие знают, что FastCGI в ПХП не настоящий — при каждом запросе весь код интерпретируется заново, это позволяет не заботиться об утечке памяти, сбросе состояния между запросами и ещё о многих вещах, а значит упрощает вообще всё, что соответствует духу ПХП — понизить до минимума порог вхождения. Конечно, это сказывается на производительности, но в некоторых случаях ПХП научился смягчать этот недостаток.
Например, есть такая вещь как «постоянные соединения» (persistent connections) — это специальные режим, в котором на уровне процесса PHP FastCGI соединения
Конечно,
Как известно, ПХП может свалиться в фатальной ошибкой по многим причинам, одна из них — превышение времени обработки скрипта. Соответственно, скрипт может упасть и в середине транзакции, она останется незакрытой и может остаться висеть долгое время, пока соединение не получит скрипт, в котором встретится команда закрытия транзакции.
А пока этого не произошло, блокировки на базе могут привести к коллапсу.
Как показывает практика, должен, но не обязан. Ниже простой код:
class ImportantToClose {
public function __destruct()
{
// закрываем что-то важное
echo "Вызвался деструктор\n";
}
}
$itc = new ImportantToClose;
register_shutdown_function(function() {
echo "Вызвалась shutdown function\n";
});
set_time_limit(1);
for(;;);Если запустить его в интерпретаторе и подождать секунду, то мы получим следующую ошибку:
PHP Fatal error: Maximum execution time of 1 second exceeded in fatal.php on line 18
Fatal error: Maximum execution time of 1 second exceeded in fatal.php on line 18 Вызвалась shutdown function
Можно ещё попробовать записать
Кстати, не забудьте выставить внутри shutdown function нужное вам время выполнения, если предел будет превышен, то и эта функция будет прервана, в этом случае вам уже ничего не поможет закрыть ресурс корректно.
Комментарии 10
В нашем случае это была статическая переменная класса (то ли синглтон, то ли реестр), но сути это не меняет, правда :)
Ну да, если всё организовано через сервисы и сервисы передаются в другие только через входные параметры, то всё дерево зависимостей будет согласовано через ссылки друг на друга, автоматически.
Кстати, в «Яндексе» я писал обвязку к libmapi на «Пайтоне» с использованием ctypes, поскольку библиотека тогда была очень текучая (не знаю как сейчас), я пользовался тем же приёмом — выделял память в интерпретаторе специальным вызвовом (PyMem_Malloc), а потом освобождал в «трудную минуту».
Каковы внутренние ограничения по производительности самого PHP.
А именно какова корреляция между использованными аппаратными ресурсами и количеством одновременно используемых классов/объектов, количеством вызываемых методов и их вложенностью и т.д.?
2. И есть вот такой вопрос по аппаратным ресурсам. Какова стандартная
Спрашиваю у вас, поскольку
2) на такой вопрос отвечает системный администратор, а я даже не программист (я —