2014-01-30 4 views
13

Есть ли способ для немедленно остановить выполнение PHP-кода?Как остановить выполнение кода PHP?

Я знаю exit но ясно сказано:

Завершает выполнение скрипта. Функции выключения и деструкторы объектов всегда будут выполняться, даже если вызывается exit.

Так что я хочу добиться, чтобы остановить выполнение кода PHP точно, когда я звоню выхода или любой другой.

Любая помощь?

Edit: После ответа Дженсона

Trial 1:

function newExit() { 
    __halt_compiler(); 
}  
echo "start"; 
newExit();  
echo "you should not see this"; 

Показывает Fatal error: __HALT_COMPILER() can only be used from the outermost scope in который был довольно ожидаемый.

Trial 2:

function newExit() { 
    include 'e.php'; 
} 
echo "start"; 
newExit(); 
echo "you should not see this"; 

e.php содержит только __halt_compiler();

Это показывает startyou не должны видеть это

Edit: Почему я хочу это сделать?

Я работаю над приложением, которое включает в себя проприетарную библиотеку (требуется через файл конфигурации виртуального хоста, к которому у меня нет доступа), который поставляется в виде зашифрованного кода. Это своего рода библиотека мониторинга для целей безопасности. Один из его поведения является то, что он регистрирует некоторые функции отключения, регистрирующее состояние экземпляра (он сохраняет статистику в базу данных)

То, что я хочу сделать, это отключить этого протокола для некоторых конкретных условий на основе (удаленный IP)

+0

умереть(); может быть, это помогает –

+0

@ArthurYakovlev практически нет различий в поведении между exit и die –

+4

> Эта языковая конструкция эквивалентна exit(). – skafandri

ответ

0

Вы можете использовать __halt_compiler функцию, которая будет остановить выполнение компилятора

http://www.php.net/manual/en/function.halt-compiler.php

+0

Компилятор не выполнит код после '__halt_compiler ', но действительно ли это не вызовет функции деструкторов и выключения? На самом деле я не проверял, но я думаю, что это назовет их (не могу придумать, почему это не так). –

+0

Содержит ли компилятор описания классов/функций после этого утверждения? Существуют различия между временем компиляции и временем выполнения PHP, что может быть проблемой здесь. – ToBe

+0

Также обратите внимание на следующее, err, примечание из документов: '__halt_compiler() может использоваться только из самой внешней области.' – CompuChip

0

Вы могли бы попытаться убить процесс PHP:

exec('kill -9 ' . getmypid()); 
+3

Высокая зависимость от метода выполнения (cgi, fcgi, webserver module ...) и разрешений. – ToBe

12

Пожалуйста, смотрите следующую информацию от пользователя Pekka 웃

Согласно инструкции, деструкторы выполняются даже если сценарий получает прекращается с использованием die() или exit():

деструктор будет называться даже если выполнение сценария прекращено с использованием exit(). Вызов exit() в деструкторе предотвратит выполнение остальных процедур выключения.
В соответствии с этим PHP: destructor vs register_shutdown_function деструктор делает не выполняется, когда достигается время выполнения PHP (подтверждено на Apache 2, PHP 5.2 в Windows 7).

Деструктор также выполняет , а не выполняется, когда сценарий заканчивается, потому что достигнут предел памяти. (Только тестировался)

Деструктора делает получить выполняются на фатальных ошибках (Just тестировался) Обновление: OP не может подтвердить это - там, кажется, фатальные ошибки, где вещи отличаются

Это делает не выполнить выполнение ошибок разбора (потому что весь скрипт не будет интерпретироваться)

Деструктор, конечно же, не будет выполнен, если произойдет сбой в работе сервера или какое-либо другое исключение из управления PHP.

Реферировано в этом вопросе Are there any instances when the destructor in PHP is NOT called?

0

Я не уверен, что вы понимаете, что «выход» заявляет

Terminates execution of the script. Shutdown functions and object destructors will always be executed even if exit is called. 

Это нормально, чтобы сделать это, он должен очистить это Memmory всех переменных и функции, которые вы вызывали раньше. Не делать этого будет означать, что ваш memmory останется застрявшим и окупившимся в вашу оперативную память, и если это произойдет несколько раз, вам нужно будет перезагрузить и сбросить свою RAM, чтобы у вас осталось.

0

или попробовать

trigger_error('Die', E_ERROR); 
+0

Должен быть эквивалент exit() или die(), но также зависит от используемого обработчика ошибок. – ToBe

1

Помимо очевидного die() и exit(), это также работает:

<?php 
echo "start"; 
__halt_compiler(); 
echo "you should not see this"; 
?> 
Смежные вопросы