Heim Backend-Entwicklung PHP-Tutorial 说说 PHP 的 die 和 exit

说说 PHP 的 die 和 exit

Jun 23, 2016 pm 01:25 PM

今天有小伙伴说 exit 和 die 有一点差别。我说 die 不就是 exit 的别名吗?为了证明我的观点,翻了翻 PHP 的源码,在 zend_language_scanner.l 中,很容易就能发现这关键字是同一个 token:

<ST_IN_SCRIPTING>"exit" {    return T_EXIT;}<ST_IN_SCRIPTING>"die" {    return T_EXIT;}
Nach dem Login kopieren

所以最终也是同一个 Opcode:ZEND_EXIT。所以这两个关键字没有任何差别,这其实也没什么好说的。

我顺便提醒了小伙伴们一句:不要用 exit 输出整数。原因也很简单,在 PHP 官网的文档里就能看到:

void exit ([ string $status ] )

void exit ( int $status )

如果 status 是一个字符串,在退出之前该函数会打印 status 。

如果 status 是一个 integer,该值会作为退出状态码,并且不会被打印输出。 退出状态码应该在范围0至254,不应使用被PHP保留的退出状态码255。 状态码0用于成功中止程序。

所以如果 status 是一个整数,会被当成状态码输出,而不是打印,所以如果想返回给前端是不可能的。

那么这个状态码有什么用呢?

大家都知道 shell 脚本执行可以返回一个状态码,PHP 的脚本的执行返回的状态码是一样的,可以在环境变量中被捕捉到:

Scholer: ~ $ php -r 'exit(254);'Scholer: ~ $ echo $?254
Nach dem Login kopieren

我的好奇心又被勾起来了:如果给的是不在 0 ~ 255 之间的状态码会怎么样呢?经过测试,发现如果是大于 255 的状态码,会返回 status 对 256 求于之后的结果。如果是小于 0 的,在 -1 ~ - 255 之间时返回的是 status 256 求和的结果,小于 -256 的则是绝对值和 256 求余。总之都在 0 ~ 255 之间。

接着探究下去。

exit 的实现在 zend_vm_def.h 中:

ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMP|VAR|UNUSED|CV, ANY){#if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED)    USE_OPLINE    SAVE_OPLINE();    if (OP1_TYPE != IS_UNUSED) {        zend_free_op free_op1;        zval *ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);        if (Z_TYPE_P(ptr) == IS_LONG) {            EG(exit_status) = Z_LVAL_P(ptr);        } else {            zend_print_variable(ptr);        }        FREE_OP1();    }#endif
Nach dem Login kopieren

从代码中我们可以很明显的看出来通过 Z_TYPE_P 来检测状态码的类型,如果是 long 的话就赋值给全局变量 exit_status(EG 这个宏就是用来便捷的访问全局变量的),如果不是,就调用 zend_print_variable 打印出来。

Z_LVAL_P 的声明在 zend_operators.h 中:

#define Z_LVAL_P(zval_p)        Z_LVAL(*zval_p)...#define Z_LVAL(zval)            (zval).value.lval
Nach dem Login kopieren

再进一步就是大家都知道的 PHP 解释器中的变量定义了(我这份源码还是 PHP 5.5 的版本,不是 PHP7),在 zend.h 中:

typedef union _zvalue_value {    long lval;                    /* long value */    double dval;                /* double value */    struct {        char *val;        int len;    } str;    HashTable *ht;                /* hash table value */    zend_object_value obj;} zvalue_value;struct _zval_struct {    /* Variable information */    zvalue_value value;        /* value */    zend_uint refcount__gc;    zend_uchar type;    /* active type */    zend_uchar is_ref__gc;};
Nach dem Login kopieren

所以这里 exit_status 的值到这里还是一个长整形。

那么问题就来了,为什么最终输出的是 0 ~ 255 之间的状态码呢?老实说这个问题我吃的也不是很透,这需要对 Linux 环境编程足够熟悉才行,这里只能简单的说一下。

通过 strace 跟踪一下执行:

$ strace php -r 'exit(258);' >& strace.log
Nach dem Login kopieren

在结果的最后两行可以很清楚的看到:

...exit_group(258)                         = ?+++ exited with 2 +++
Nach dem Login kopieren

exit_group 中还是原始值,但最终会变成 2 。PHP 本身并没有对这个值做特殊处理,但是 exit 或者 main 函数中的 return,只能使用 0 ~ 255 之间的值,其他值都会被处理。可以写一个简单的程序测试:

int main(int argc, char const *argv[]){    return 258;}
Nach dem Login kopieren

结果:

Scholer: ~ $ ./testScholer: ~ $ echo $?2
Nach dem Login kopieren

详情参见:http://www.laruence.com/2012/02/01/2503.html

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Apr 06, 2025 am 12:02 AM

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Apr 03, 2025 am 12:04 AM

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Mar 31, 2025 pm 11:54 PM

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Wie debugge ich den CLI -Modus in PhpStorm? Wie debugge ich den CLI -Modus in PhpStorm? Apr 01, 2025 pm 02:57 PM

Wie debugge ich den CLI -Modus in PhpStorm? Bei der Entwicklung mit PHPSTORM müssen wir manchmal den PHP im CLI -Modus (COMS -Zeilenschnittstellen) debuggen ...

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Apr 01, 2025 pm 03:12 PM

Senden von JSON -Daten mithilfe der Curl -Bibliothek von PHP in der PHP -Entwicklung müssen häufig mit externen APIs interagieren. Eine der gängigen Möglichkeiten besteht darin, die Curl Library zu verwenden, um Post � ...

See all articles