Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » Unterstützung für externe Umgebungen in SQL Anywhere

 

Die externe PHP-Umgebung

SQL Anywhere stellt Unterstützung für gespeicherte PHP-Prozeduren und -Funktionen bereit. Eine gespeicherte PHP-Prozedur oder -Funktion verhält sich wie eine gespeicherte SQL-Prozedur oder Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in PHP geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. innerhalb einer PHP-Programminstanz). Es gibt eine separate Instanz des PHP-Programms für jede Verbindung, die gespeicherte PHP-Prozeduren und -Funktionen verwendet. Dieses Verhalten unterscheidet sich deutlich von gespeicherten Java-Prozeduren und Funktionen. Bei Java gibt es eine Instanz der Java VM für jede Datenbank statt einer Instanz für jede Verbindung. Der andere Hauptunterschied zwischen PHP und Java besteht darin, dass gespeicherte PHP-Prozeduren keine Ergebnismengen zurückgeben, während gespeicherte Java-Prozeduren Ergebnismengen zurückgeben können. PHP gibt nur ein Objekt vom Typ LONG VARCHAR zurück, was die Ausgabe des PHP-Skripts darstellt.

Es gibt zwei Voraussetzungen für die Verwendung der Unterstützung für PHP in der Datenbank:

  1. Eine Kopie von PHP muss auf dem Datenbankserver-Computer installiert sein und der SQL Anywhere-Datenbankserver muss in der Lage sein, die Position des PHP-Programms zu ermitteln.

  2. Der SQL Anywhere PHP-Treiber (mit SQL Anywhere mitgeliefert) muss auf dem Datenbankserver-Computer installiert sein. Weitere Hinweise finden Sie unter SQL Anywhere PHP installieren und konfigurieren.

Zusätzlich zu den zwei obenstehenden Voraussetzungen muss der Datenbankadministrator auch das Modul "SQL Anywhere PHP External Environment" installieren. Im voraus kompilierte Module für mehrere Versionen von PHP sind im SQL Anywhere-Lieferumfang enthalten. Um im voraus kompilierte Module zu installieren, kopieren Sie das entsprechende Treiber-Modul in Ihr PHP-Erweiterungsverzeichnis (das in php.ini angegeben ist). Unter Unix können Sie auch einen symbolischen Link verwenden.

♦  So installieren Sie das externe Umgebungsmodul (Windows)
  1. Suchen Sie die php.ini-Datei Ihrer PHP-Installation und öffnen Sie sie in einem Texteditor. Suchen Sie die Zeile, in der der Standort des extension_dir-Verzeichnisses angegeben wird. Wenn extension_dir nicht auf ein bestimmtes Verzeichnis gesetzt ist, wird empfohlen, es so einzustellen, dass es zur Erhöhung der Systemsicherheit auf ein isoliertes Verzeichnis zeigt.

  2. Kopieren Sie das gewünschte externe PHP-Umgebungsmodul vom SQL Anywhere-Installationsverzeichnis in Ihr PHP-Erweiterungsverzeichnis. Sie können die folgende Anweisung als Vorlage verwenden:

    copy Installationsverzeichnis\Bin32\php-5.2.6_sqlanywhere_extenv11.dll
      PHP-Verzeichnis\ext
  3. Vergewissern Sie sich, dass Sie auch den SQL Anywhere PHP-Treiber vom SQL Anywhere-Installationsverzeichnis in Ihrem PHP-Erweiterungsverzeichnis installiert haben. Dieser Dateiname folgt dem Muster php-5.x.y_sqlanywhere.dll, wobei x und y die Versionsnummern sind. Diese sollten den Versionsnummern entsprechen, die Sie in Schritt 2 kopiert haben.

♦  So installieren Sie das Module für die externe Umgebung (Unix)
  1. Suchen Sie die php.ini-Datei Ihrer PHP-Installation und öffnen Sie sie in einem Texteditor. Suchen Sie die Zeile, in der der Standort des extension_dir-Verzeichnisses angegeben wird. Wenn extension_dir nicht auf ein bestimmtes Verzeichnis gesetzt ist, wird empfohlen, es so einzustellen, dass es zur Erhöhung der Systemsicherheit auf ein isoliertes Verzeichnis zeigt.

  2. Kopieren Sie das gewünschte externe PHP-Umgebungsmodul vom SQL Anywhere-Installationsverzeichnis in Ihr PHP-Installationsverzeichnis. Sie können die folgende Anweisung als Vorlage verwenden:

    cp Installationsverzeichnis/bin32/php-5.2.6_sqlanywhere_extenv11.so
      PHP-Verzeichnis/ext
  3. Vergewissern Sie sich, dass Sie auch den SQL Anywhere PHP-Treiber vom SQL Anywhere-Installationsverzeichnis in Ihrem PHP-Erweiterungsverzeichnis installiert haben. Dieser Dateiname folgt dem Muster php-5.x.y_sqlanywhere.so, wobei x und y die Versionsnummern sind. Diese sollten den Versionsnummern entsprechen, die Sie in Schritt 2 kopiert haben.

Die Unterstützung für PHP in der Datenbank steht nur für SQL Anywhere-Datenbanken der Version 11 oder später zur Verfügung. Wenn eine SQL Anywhere 10-Datenbank geladen ist und Sie versuchen, die Unterstützung für PHP in der Datenbank zu verwenden, wird ein Fehler zurückgegeben, der angibt, dass externe Umgebungen nicht unterstützt werden.

Um PHP in der Datenbank zu verwenden, muss der Datenbankserver in der Lage sein, die Position des PHP-Programms zu ermitteln und es zu starten. Sie können überprüfen, ob der Datenbankserver in der Lage ist, die Position des PHP-Programms zu ermitteln und es zu starten, indem Sie die folgende Anweisung ausführen:

START EXTERNAL ENVIRONMENT PHP;

Wenn eine Meldung des Inhalts angezeigt wird, dass das 'externe Programm' nicht gefunden wurde, dann liegt das Problem darin, dass der Datenbankserver nicht in der Lage ist, die Position des PHP-Programms zu ermitteln. In diesem Fall sollten Sie die ALTER EXTERNAL ENVIRONMENT-Anweisung ausführen, um explizit den Speicherort des PHP-Programms einschließlich des Programmnamens festzulegen, oder sicherstellen, dass die PATH-Umgebungsvariable das Verzeichnis umfasst, in dem sich das PHP-Programm befindet.

ALTER EXTERNAL ENVIRONMENT PHP 
  LOCATION 'PHP-Pfad';

Zum Beispiel:

ALTER EXTERNAL ENVIRONMENT PHP
  LOCATION 'c:\\php\\php-5.2.6-win32\\php.exe';

Um die Standardeinstellung wiederherzustellen, führen Sie die folgende Anweisung aus:

ALTER EXTERNAL ENVIRONMENT PHP
  LOCATION 'php';

Wenn Sie eine Meldung des Inhalts sehen, dass der 'Haupt-Thread' nicht gefunden werden kann, überprüfen Sie Folgendes:

Beachten Sie, dass die Anweisung START EXTERNAL ENVIRONMENT PHP nur benötigt wird, um zu überprüfen, ob der Datenbankserver in der Lage ist, PHP zu starten. Üblicherweise startet PHP automatisch, wenn Sie einen Aufruf einer gespeicherten PHP-Prozedur oder Funktion durchführen.

Die Anweisung STOP EXTERNAL ENVIRONMENT PHP ist auch nicht erforderlich, um eine Instanz von PHP zu stoppen, weil die Instanz mit dem Ende der Verbindung automatisch beendet wird. Wenn Sie allerdings die Arbeit mit PHP abgeschlossen haben und Ressourcen freigeben wollen, entfernt die Anweisung STOP EXTERNAL ENVIRONMENT PHP die PHP-Instanz für Ihre Verbindung.

Wenn Sie überprüft haben, dass der Datenbankserver das PHP-Programm starten kann, besteht der nächste Schritt darin, den erforderlichen PHP-Code in der Datenbank zu installieren. Sie erreichen dies, indem Sie die Anweisung INSTALL verwenden. Sie können beispielsweise die folgende Anweisung ausführen, um ein bestimmtes PHP-Skript in der Datenbank zu installieren.

INSTALL EXTERNAL OBJECT 'PHP-Skript' 
  NEW 
  FROM FILE 'PHP-Datei'
  ENVIRONMENT PHP;

PHP-Code kann wie folgt aus einem Ausdruck extrahiert und installiert werden:

INSTALL EXTERNAL OBJECT 'PHP-Skript' 
  NEW
  FROM VALUE 'PHP-Anweisungen'
  ENVIRONMENT PHP;

PHP-Code kann wie folgt aus einer Variablen extrahiert und installiert werden:

CREATE VARIABLE PHPVariable LONG VARCHAR;
SET PHPVariable = 'PHP-Anweisungen';
INSTALL EXTERNAL OBJECT 'PHP-Skript' 
  NEW 
  FROM VALUE PHPVariable
  ENVIRONMENT PHP;

Um PHP aus der Datenbank zu entfernen, verwenden Sie die Anweisung REMOVE:

REMOVE EXTERNAL OBJECT 'PHP-Skript';

Um bestehenden PHP-Code zu ändern, können Sie die UPDATE-Klausel der Anweisung INSTALL verwenden:

INSTALL EXTERNAL OBJECT 'PHP-Skript' 
  UPDATE 
  FROM FILE 'PHP-Datei'
  ENVIRONMENT PHP;
INSTALL EXTERNAL OBJECT 'PHP-Skript' 
  UPDATE 
  FROM VALUE 'PHP-Anweisungen'
  ENVIRONMENT PHP;
SET PHPVariable = 'PHP-Anweisungen';
INSTALL EXTERNAL OBJECT 'PHP-Skript' 
  UPDATE 
  FROM VALUE PHPVariable
  ENVIRONMENT PHP;

Wenn der PHP-Code in der Datenbank installiert ist, können Sie anschließend die erforderlichen gespeicherten PHP-Prozeduren und -Funktionen erstellen. Wenn Sie gespeicherte PHP-Prozeduren und Funktionen erstellen, ist LANGUAGE immer PHP und die Zeichenfolge EXTERNAL NAME enthält die Informationen, die erforderlich sind, um die PHP-Subroutinen aufzurufen und OUT-Parameter zurückzugeben.

Die Argumente werden so an das PHP-Skript im $argv-Array übergeben, wie PHP Argumente von der Befehlszeile annehmen würde (d.h. $argv[1] ist das erste Argument). Um einen Ausgabeparameter festzulegen, ordnen Sie ihn dem entsprechenden $argv-Element zu. Der Rückgabewert ist immer die Ausgabe des Skripts (als Typ LONG VARCHAR).

Eine gespeicherte PHP-Prozedur kann mit allen Datentypen für Eingabe- oder Ausgabeargumente erstellt werden. Die Parameter werden allerdings für die Verwendung innerhalb des PHP-Skripts von bzw. in boolean-, integer-, double- oder string-Werte konvertiert. Der Rückgabewert ist immer ein Objekt vom Typ LONG VARCHAR. Es folgt ein einfaches PHP-Beispiel:

INSTALL EXTERNAL OBJECT 'SimplePHPExample' 
  NEW 
  FROM VALUE '<? function SimplePHPFunction(
    $arg1, $arg2, $arg3, $arg4 ) 
    { return ($arg1 * 1000) + 
      ($arg2 * 100) + 
      ($arg3 * 10) + 
      $arg4; 
    } ?>'
  ENVIRONMENT PHP;

CREATE FUNCTION SimplePHPDemo( 
  IN thousands INT, 
  IN hundreds INT, 
  IN tens INT, 
  IN ones INT) 
RETURNS LONG VARCHAR
EXTERNAL NAME '<file=SimplePHPExample> print SimplePHPFunction(
    $argv[1], $argv[2], $argv[3], $argv[4]);' 
LANGUAGE PHP;

// The number 1234 should appear
SELECT SimplePHPDemo(1,2,3,4);

Bei PHP wird die Zeichenfolge EXTERNAL NAME in einer einzigen Zeile mit SQL-Code angegeben.

Um serverseitiges PHP zu verwenden, kann der PHP-Code die Standarddatenbankverbindung benutzen. Um ein Handle für die Datenbankverbindung zu erhalten, rufen Sie sasql_pconnect mit einem leeren Zeichenfolgenargument ('' oder "") auf. Das leere Zeichenfolgenargument teilt dem SQL Anywhere PHP-Treiber mit, die aktuelle externe Umgebungsverbindung zurückzugeben, anstatt eine neue zu öffnen. Das folgende Beispiel erstellt eine Tabelle und ruft dann eine gespeicherte PHP-Prozedur auf, um die Tabelle mit Daten zu füllen:

CREATE TABLE phpTab(c1 int, c2 char(128));

INSTALL EXTERNAL OBJECT 'ServerSidePHPExample' 
  NEW 
  FROM VALUE '<? function ServerSidePHPSub() { 
    $conn = sasql_pconnect( '''' ); 
    sasql_query( $conn,
    "INSERT INTO phpTab 
       SELECT table_id, table_name FROM SYS.SYSTAB" );
    sasql_commit( $conn ); 
  } ?>'
  ENVIRONMENT PHP;

CREATE PROCEDURE PHPPopulateTable() 
EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()'
LANGUAGE PHP;

CALL PHPPopulateTable();

// The following should return 2 identical rows
SELECT count(*) FROM phpTab 
UNION ALL 
SELECT count(*) FROM SYS.SYSTAB;

Bei PHP wird die Zeichenfolge EXTERNAL NAME in einer einzigen Zeile mit SQL-Code angegeben. Beachten Sie im obenstehenden Beispiel, dass die Apostrophe verdoppelt werden, weil dies die Art und Weise ist, wie sie in SQL syntaktisch analysiert werden. Befände sich der PHP-Quellcode in einer Datei, würden die Apostrophe nicht verdoppelt werden.

Um einen Fehler an den Datenbankserver zurückzugeben, lösen Sie eine PHP-Ausnahme aus. Das folgende Beispiel zeigt, wie Sie hierzu vorgehen.

CREATE TABLE phpTab(c1 int, c2 char(128));

INSTALL EXTERNAL OBJECT 'ServerSidePHPExample' 
  NEW 
  FROM VALUE '<? function ServerSidePHPSub() {
    $conn = sasql_pconnect( '''' );
    if( !sasql_query( $conn,
      "INSERT INTO phpTabNoExist
         SELECT table_id, table_name FROM SYS.SYSTAB" )
    ) throw new Exception(
      sasql_error( $conn ),
      sasql_errorcode( $conn )
    );
    sasql_commit( $conn );
  } ?>'
  ENVIRONMENT PHP;

CREATE PROCEDURE PHPPopulateTable()
  EXTERNAL NAME
    '<file=ServerSidePHPExample> ServerSidePHPSub()'
  LANGUAGE PHP;

CALL PHPPopulateTable();

Das obenstehende Beispiel sollte mit dem Fehler SQLE_UNHANDLED_EXTENV_EXCEPTION beendet werden, der angibt, dass die Tabelle phpTabNoExist nicht gefunden wurde.

Weitere Hinweise und Beispiele zur Verwendung der Unterstützung für PHP in der Datenbank finden Sie unter den Beispielen, die sich im Verzeichnis Beispielverzeichnis\SQLAnywhere\ExternalEnvironments\PHP befinden.