suchen
HeimBackend-EntwicklungPHP-TutorialBeispielfreigabe für PHP-Ressourcentypen

Beispielfreigabe für PHP-Ressourcentypen

Mar 15, 2018 pm 02:48 PM
php分享实例

In PHP verwenden wir häufig Ressourcentypvariablen. Zum Beispiel: MySQL-Verbindung, Dateihandle usw. Diese Variablen können nicht durch Skalare dargestellt werden. Wie verbindet man also Ressourcenvariablen in PHP mit Ressourcen in der C-Sprache im Zend-Kernel?

1. Die Verwendung von Ressourcenvariablen in PHP

  1. $fp = fopen("test.txt", "rw");  
      
    var_dump($fp);  
      
    fclose($fp);


Ergebnisse drucken: Ressource(5) vom Typ (Stream )

Nummer 5: Zeigt an, dass die Ressourcen-ID 5 ist. Die spezifische Bedeutung wird später eingeführt.

stream: Name des Ressourcentyps.

2. Ressourcen-ID

Der Kernel speichert die registrierten Ressourcenvariablen in einer HashTable und verwendet den Schlüssel in der HashTable, in der sich die Ressource befindet, als Ressourcen-ID.

Tatsächlich speichert die Ressourcenvariable in PHP also tatsächlich eine Ganzzahl, und die entsprechende Ressource in der HashTable wird über diese ID gefunden.

  1. #define Z_RESVAL(zval)          (zval).value.lval  
    #define Z_RESVAL_P(zval)        Z_RESVAL(*zval)  
    #define Z_RESVAL_PP(zval)       Z_RESVAL(**zval)

Das obige Makro ist die API, die von ZE im Kernel verwendet wird, um Ressourcenvariablen Werte zuzuweisen eine Zuweisung an eine ganzzahlige Variable.

3. Ressourcentypname

Um Ressourcentypen zu unterscheiden, müssen wir Typnamen für die von uns definierten Ressourcen definieren.

#define MY_RES_NAME "my_resource" //资源类型名称,PHP通过var_dump打印资源变量时会看到这个名称  
static int my_resource_descriptor;  
  
ZEND_MINIT_FUNCTION(jinyong)  
{  
    my_resource_descriptor = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number);//向内核中注册新的资源类型  
}


ZEND_MINIT_FUNCTION(jinyong) wird in PHP als SAPI (z. B. Apache) verfügbar sein mod_php5-Erweiterung) Beim Laden in den Speicher werden alle erweiterten ZEND_MINIT_FUNCTIONs ausgeführt.

Wobei jinyong der Name der aktuellen Erweiterung ist. Der Name der Erweiterung lautet derzeit beispielsweise jinyong

Zum leichteren Verständnis stellen wir uns das als die Erweiterung vor, die während der Initialisierung einen neuen Ressourcentyp beim Kernel registriert.

4. Ressourcenvariablen erstellen

Der Ressourcentyp wurde erfolgreich registriert und ein differenzierter Typname wurde für die Ressource definiert. Variablen für diese Ressource können jetzt verwendet werden.

Implementieren Sie die fopen-Funktion in PHP:

  1. PHP_FUNCTION(my_fopen)  
    {  
        zval *res;  
      
        char *filename, *mode;  
          
        int filename_strlen, mode_strlen;  
      
        FILE *fp;  
          
        if(zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "s|s",  &filename, &filename_strlen, &mode, &mode_strlen) == FAILURE){  
            RETURN_FALSE;  
        }  
      
        //此处省略了对参数的有效性验证  
        fp = fopen(filename, mode);  
      
        ZEND_REGISTER_RESOURCE(res, fp, my_resource_descriptor);//向全局变量&EG(regular_list)中注册资源变量,并将对应HashTable的ID赋值给res  
      
        RETURN_RESOURCE(res);//向PHP返回资源变量  
    }

Hier wird die Funktion namens my_fopen in PHP definiert. my_fopen(string $file_name, string $mode)

Implementiert die fclose-Funktion in PHP:

  1. PHP_FUNCTION(my_fclose)  
    {  
        zval *res;  
          
        FILE *fp;  
      
        if(zend_parse_parameters(ZEND_NUM_ARGS TSRMS_CC, "r", &res) == FAILURE){  
            RETURN_FALSE;  
        }  
      
        if(Z_TYPE_P(res) == IS_RESOURCE){//判断变量类型是否是资源类型  
            zend_hash_index_del(&EG(regular_list), Z_RESVAL_P(res));//EG就类似于PHP中的$_GLOBALS。在全局资源变量regular_list中删除对应ID的资源  
        }else{  
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "参数必须是资源类型变量");  
            RETURN_FALSE;  
        }  
      
        RETURN_TRUE;  
    }

definiert den Namen in PHP als Die Funktion von my_fclose. my_fclose($resource)

5. Kompilieren und installieren Sie Erweiterungen, starten Sie php-fpm oder mod_php5 usw.

Methoden zur Verwendung benutzerdefinierter Erweiterungen in PHP

  1. my_fwrite($fp, "aaTest");  
      
    var_dump($fp);  
      
    my_fclose($fp);  
      
    var_dump($fp);

Kann Ressourcen normal öffnen und schließen.

7. Wir verwenden häufig Datenbankverbindungsressourcen und Dateihandle-Ressourcen, aber normalerweise müssen wir sie nicht manuell freigeben, und es treten keine Probleme mit Speicherverlusten auf.

  1. my_resource_descriptor = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number);//向内核中注册新的资源类型

Gehen Sie zurück zum ursprünglich registrierten Ressourcentyp und sehen Sie sich den ersten Parameter von zend_register_list_destructors_ex an, der der Zeiger auf den Destruktor ist.

Wenn Sie dann die automatische Freigabefunktion implementieren müssen, müssen Sie nur den Destruktor definieren und den Funktionszeiger übergeben.

Schauen Sie sich eine andere Frage an:

  1. $fp = fopen("test.txt", "rw");  
      
    var_dump($fp);  
      
    //fclose($fp); 此处不使用fclose释放资源  
      
    unset($fp); //而是使用unset释放  
    //unset没有问题,会正常释放$fp变量。但$fp对应真正的打开文件资源句柄资源将永远释放不了,直至mod_php5或php-fpm重启  
    //可以看出,在注册资源类型时定义析构函数的必要性了


Definieren Sie den Destruktor:

static void php_myres_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC){//析构函数被调用时,会接受一个当前资源变量的参数  
    FILE *fp = (FILE*)rsrc->ptr;  
    fclose(fp);  
}  
  
ZEND_MINIT_FUNCTION(jinyong)  
{  
    my_resource_descriptor = zend_register_list_destructors_ex(php_myres_dtor, NULL, MY_RES_NAME, module_number);  
}
  • In PHP speichern die sogenannten Ressourcenvariablen tatsächlich ganzzahlige Werte, suchen die entsprechenden Zeiger in der globalen Kernel-Ressourcenvariablenliste EG (regular_list) und führen entsprechende Operationen aus.

Der Ressourcentyp ist eine spezielle Variable, die einen Verweis auf eine externe Ressource enthält. Ressourcen werden durch spezielle Funktionen erstellt und genutzt.

Zum Beispiel Datenbankverbindung, Öffnen von Dateien, Grafikbereich usw.

Der Ressourcentyp ist eigentlich nur eine Ganzzahl, und der Kernel kann diesen Ganzzahlwert verwenden, um die endgültigen erforderlichen Daten an einem Ort zu finden, der einem Ressourcenpool ähnelt.

Beispiel 1, Beispiel für eine Dateioperation:

Codebeispiel:

<?php
$file=fopen(&#39;a.txt&#39;,&#39;r&#39;);//使用fopen函数打开一个文件获取句柄。  
fread($file,1024);//之后把该句柄传递给fread函数,即可对此文件进行后续操作。

Beispiel 2, Beispiel für eine Datenbankoperation:

Codebeispiel:

<?php
$result=mysql_query(&#39;select
 * from tbale&#39;);//mysql_query函数执行一条sql,若失败,返回false;成功,查询结果被缓存,并返回资源标识(类似:Resource
 id#42)即指向该资源的句柄。  
mysql_num_row($result);//使用该句柄可以操作缓存中的资源,从而返回查询出来的条数  
mysql_fetch_row($result);//使用该句柄可以操作缓存中的资源,从而返回查询结构

Beschreibung:
Liste der Funktionen zur Nutzung und Zerstörung von Ressourcen.
Sie können die Funktion is_resource() verwenden, um zu bestimmen, ob eine Variable eine Ressource ist, und die Funktion get_resource_type() gibt den Typ der Ressource zurück.

Was PHP-Ressourcenvariablen betrifft, müssen Sie sich keine Sorgen darüber machen, dass die MYSQL-Verbindung nicht freigegeben wird, da die Destruktormethode in der Erweiterung definiert ist, um sie automatisch freizugeben.

Verwandte Empfehlungen:

PHP-Ressourcenliste, PHP-Ressource_PHP-Tutorial

PHP-Ressourcen

Eine Zusammenfassung der PHP-Ressourcen, einschließlich: Bibliotheken, Frameworks, Vorlagen usw.

Das obige ist der detaillierte Inhalt vonBeispielfreigabe für PHP-Ressourcentypen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
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
Wie ändern Sie Daten, die in einer PHP -Sitzung gespeichert sind?Wie ändern Sie Daten, die in einer PHP -Sitzung gespeichert sind?Apr 27, 2025 am 12:23 AM

TomodifyDatainaphpSession, startTheSessionwithSession_Start (), dann $ _SessionToSet, modify, orremovevariables.1) startTheSession.2) setOrmodifySessionvariabling $ _Session.3) removeVariables mit ()

Geben Sie ein Beispiel für die Speicherung eines Arrays in einer PHP -Sitzung.Geben Sie ein Beispiel für die Speicherung eines Arrays in einer PHP -Sitzung.Apr 27, 2025 am 12:20 AM

Arrays können in PHP -Sitzungen gespeichert werden. 1. Starten Sie die Sitzung und verwenden Sie Session_Start (). 2. Erstellen Sie ein Array und speichern Sie es in $ _Session. 3. Abrufen Sie das Array durch $ _Session ab. 4. Optimieren Sie Sitzungsdaten, um die Leistung zu verbessern.

Wie funktioniert die Müllsammlung für PHP -Sitzungen?Wie funktioniert die Müllsammlung für PHP -Sitzungen?Apr 27, 2025 am 12:19 AM

Die PHP -Sitzungsmüllsammlung wird durch einen Wahrscheinlichkeitsmechanismus ausgelöst, um abgelaufene Sitzungsdaten zu beseitigen. 1) Legen Sie die Auslöserwahrscheinlichkeit und die Sitzungslebenszyklus in der Konfigurationsdatei ein. 2) Sie können Cron-Aufgaben verwenden, um Hochlastanwendungen zu optimieren. 3) Sie müssen die Häufigkeit und Leistung von Müllsammlungen ausgleichen, um Datenverlust zu vermeiden.

Wie können Sie die Sitzungsaktivität in PHP verfolgen?Wie können Sie die Sitzungsaktivität in PHP verfolgen?Apr 27, 2025 am 12:10 AM

Die Verfolgung von Benutzersitzungsaktivitäten in PHP wird durch Sitzungsverwaltung implementiert. 1) Verwenden Sie Session_start (), um die Sitzung zu starten. 2) Speichern Sie Daten über das $ _Session -Array. 3) Call Session_Destroy (), um die Sitzung zu beenden. Die Sitzungsverfolgung wird für die Analyse der Benutzerverhalten, die Sicherheitsüberwachung und die Leistungsoptimierung verwendet.

Wie können Sie eine Datenbank verwenden, um PHP -Sitzungsdaten zu speichern?Wie können Sie eine Datenbank verwenden, um PHP -Sitzungsdaten zu speichern?Apr 27, 2025 am 12:02 AM

Die Verwendung von Datenbanken zum Speichern von PHP -Sitzungsdaten kann die Leistung und Skalierbarkeit verbessern. 1) Konfigurieren Sie MySQL, um Sitzungsdaten zu speichern: Richten Sie den Sitzungsprozessor in Php.ini oder PHP -Code ein. 2) Benutzerdefinierte Sitzungsprozessor implementieren: Definieren Sie Öffnung, Schließen, Lesen, Schreiben und andere Funktionen, um mit der Datenbank zu interagieren. 3) Optimierung und Best Practices: Verwenden Sie Indexierung, Zwischenspeicherung, Datenkomprimierung und verteilter Speicher, um die Leistung zu verbessern.

Erläutern Sie das Konzept einer PHP -Sitzung in einfachen Worten.Erläutern Sie das Konzept einer PHP -Sitzung in einfachen Worten.Apr 26, 2025 am 12:09 AM

PhpSessionStrackUserDataacrossMultiplePageRequestsusesuseiquiTIdStoredInacookie.her'ShowtomagetheFectiv: 1) StartaSessionswithSession_start () und storateatain $ _Session.2) regeneratethessionSessionInoginWithSession_IDENT_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTE_IDENTEL

Wie schleifen Sie alle in einer PHP -Sitzung gespeicherten Werte durch?Wie schleifen Sie alle in einer PHP -Sitzung gespeicherten Werte durch?Apr 26, 2025 am 12:06 AM

In PHP können durch Sitzungsdaten in den folgenden Schritten iteriert werden: 1. Starten Sie die Sitzung mit Session_Start (). 2. Iterieren Sie durch die Foreach-Schleife durch alle Schlüsselwertpaare im $ _Session-Array. 3. Wenn Sie komplexe Datenstrukturen verarbeiten, verwenden Sie is_array () oder is_object () Funktionen und verwenden Sie print_r (), um detaillierte Informationen auszugeben. 4. Bei der Optimierung von Traversal kann Paging verwendet werden, um eine gleichzeitige Verarbeitung großer Datenmengen zu vermeiden. Auf diese Weise können Sie PHP -Sitzungsdaten in Ihrem tatsächlichen Projekt effizienter verwalten und verwenden.

Erklären Sie, wie Sie Sitzungen für die Benutzerauthentifizierung verwenden.Erklären Sie, wie Sie Sitzungen für die Benutzerauthentifizierung verwenden.Apr 26, 2025 am 12:04 AM

Die Sitzung realisiert die Benutzerauthentifizierung über den serverseitigen Statusverwaltungsmechanismus. 1) Erstellung der Sitzung und Erzeugung eindeutiger IDs, 2) IDs werden durch Cookies weitergeleitet, 3) Server speichert und greift auf Sitzungsdaten über IDs, 4) Benutzerauthentifizierung und Statusverwaltung zugeordnet und verbessert die Sicherheit und die Benutzererfahrung von Anwendungen.

See all articles

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

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft