edit-icon download-icon

PHP ランタイム

最終更新日: May 31, 2019

Function Compute は、PHP 7.2 ランタイム (runtime = php7.2) をサポートしています。ここでは、PHP のランタイム環境における以下の機能について説明します。

ロガーの使用

関数が $GLOBALS['fcLogger'] を使用してデータを出力すると、そのデータは収集され、サービスの作成時に指定した Logstore に保存されます。Function Compute には、$GLOBALS['fcLogger'] 変数を用いて使用できるロガーモジュールがあります。

ログレベル

setLevel メソッドを使用してログレベルを変更できます。以下のログレベルは重要度の高い順に表示しています。

ログレベル レベル メソッド 説明
EMERGENCY 600 $logger->emergency 緊急ログ
ALERT 550 $logger->alert アラートログ
CRITICAL 500 $logger->critical 重大な警告
ERROR 400 $logger->error エラーメッセージ
WARNING 300 $logger->warning 警告
NOTICE 250 $logger->notice 通知と一般的なログ
INFO (Default) 200 $logger->info 詳細な出力情報
DEBUG 100 $logger->debug デバッグログ

詳細は 「Function Compute のログ」 をご参照ください。

ロガーの例 1

  1. <? php
  2. function handler($event, $context) {
  3. $logger = $GLOBALS['fcLogger'];
  4. $logger->info("hello world");
  5. return 'hello world';
  6. }

この場合の出力ログは次のとおりです。

  1. message:2017-07-05T05:13:35.920Z a72df088-f738-cee3-e0fe-323ad89118e5 [INFO] hello world

ロガーの例 2

  1. <?php
  2. use Monolog\Logger;
  3. function handler($evt, $ctx) {
  4. $logger = $GLOBALS['fcLogger'];
  5. $logger->setLevel(400);
  6. $logger->error("console error 1");
  7. $logger->info("console info 1");
  8. $logger->warning("console warn 1");
  9. $logger->debug("console debug 1");
  10. $logger->setLevel(Logger::WARNING);
  11. $logger->error("console error 2");
  12. $logger->info("console info 2");
  13. $logger->warn("console warn 2");
  14. $logger->debug("console debug 2");
  15. $logger->setLevel(200);
  16. }

この場合の出力ログは次のとおりです。

  1. 2018-08-22T09:01:26Z c19b2706-9c4d-270b-52c8-5248ed5e2315 [ERROR]: console error 1
  2. 2018-08-22T09:01:26Z c19b2706-9c4d-270b-52c8-5248ed5e2315 [ERROR]: console error 2
  3. 2018-08-22T09:01:26Z c19b2706-9c4d-270b-52c8-5248ed5e2315 [WARNING]: console warn 2

組み込み拡張機能の使用

Function Compute には、次の拡張機能が組み込まれています。

  1. "Core", "date", "libxml", "openssl", "pcre", "zlib", "curl","filter", "hash", "readline", "Reflection",
  2. "SPL", "session","xml", "standard", "mysqlnd", "bcmath", "bz2", "calendar","ctype", "dom", "mbstring",
  3. "fileinfo", "ftp", "gettext", "gmp", "iconv","imagick", "json", "exif", "mysqli", "pcntl", "PDO",
  4. "pdo_mysql","Phar", "posix", "protobuf", "redis", "shmop", "SimpleXML", "soap","sockets", "sysvmsg",
  5. "sysvsem", "sysvshm", "tokenizer", "xmlreader","xmlrpc", "xmlwriter"

組み込み拡張機能の使用例

次の例では imagick を使用してイメージを処理しています。

  1. <?php
  2. function imageProc($event, $context) {
  3. $image = new Imagick(__DIR__ . '/lena.jpg');
  4. $image->thumbnailImage(100, 0);
  5. $image->writeImages(__DIR__ . "/thumb.jpg", true);
  6. return strval($image->getImageWidth()) . "," . strval($image->getImageHeight());
  7. }

カスタム拡張機能の使用

カスタム拡張機能を追加するには、ハンドラファイルと同じディレクトリに extension という名前のフォルダを作成し、拡張子が .ini および .so のファイルをこのフォルダに追加します。たとえば、次のように hello_world 関数を含む拡張機能を追加して使用できます。

  1. .
  2. |____extension
  3. | |____hello.ini
  4. | |____hello.so
  5. |____main.php
  • hello.ini

    1. extension=/code/extension/hello.so
  • main.php

    1. <? php
    2. function handler($event, $context) {
    3. var_dump(extension_loaded('hello'));
    4. hello_world();
    5. return "ok";
    6. }

組み込みパッケージの使用

Function Compute には現在、以下の組み込みパッケージがあります。

パッケージ バージョン 説明
oss v2.3.0 OSS SDK for PHP
tablestore V4.1.0 Table Store SDK for PHP
mns v1.3.5.5 MNS SDK for PHP

組み込みパッケージの使用例

次の例では、組み込みの OSS ライブラリのメソッドを使用して TXT ファイルをアップロードしています。

  1. <?php
  2. use OSS\OssClient;
  3. function handler($event, $context) {
  4. $accessKeyId = $context["credentials"]["accessKeyId"];
  5. $accessKeySecret = $context["credentials"]["accessKeySecret"];
  6. $securityToken = $context["credentials"]["securityToken"];
  7. $endpoint = "oss-cn-shenzhen.aliyuncs.com";
  8. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
  9. $bucket = "my-bucket";
  10. $object = "php.txt";
  11. $content = "Hello fc!";
  12. try {
  13. $ossClient->putObject($bucket, $object, $content);
  14. } catch (OssException $e) {
  15. print($e->getMessage());
  16. }
  17. return 'sucess';
  18. }

カスタムパッケージの使用

Function Compute では、カスタムパッケージを追加することもできます。カスタムパッケージをインストールするには、Composer の使用を推奨します。

方法 1:Composer を使用してカスタムパッケージをインストールする

使用したいパッケージが Packagist, the PHP Package Repository からのものである場合は、Composer を使用してこのパッケージをインストールできます。以下の例では、Function Compute のコマンドラインツール fcli を使用して、Humble HTTP request library package requests: をインストールしています。

  1. コードと依存関係モジュールを格納するフォルダを作成します。

    1. mkdir /tmp/code
  2. /tmp/code/index.php などの関数ファイルを作成します。コードで request を使用します。

    1. <?php
    2. require_once __DIR__ . "/vendor/autoload.php";
    3. function handler($event, $context){
    4. $headers = array('Accept' => 'application/json');
    5. $options = array('auth' => array('user', 'pass'));
    6. $request = Requests::get('https://www.baidu.com', $headers, $options);
    7. var_dump($request->status_code);
    8. // int(200)
    9. var_dump($request->headers['content-type']);
    10. // string(31) "application/json; charset=utf-8"
    11. var_dump($request->body);
    12. // string(26891) "[...]"
    13. }
  3. カスタムパッケージを /tmp/code ディレクトリにインストールします。

    1. 次のように composer.json ファイルを作成します。

      1. {
      2. "require": {
      3. "rmccue/requests": ">=1.0"
      4. }
      5. }
    2. composer install --no-dev コマンドを実行して、依存関係をインストールします。
      1. cd /tmp/code
      2. composer install --no-dev
    3. インストールが成功したかどうかを確認します。インストールが成功した場合、 /tmp/code ディレクトリは以下のようになります。

      1. ls -l /tmp/code
      2. -rw-r--r-- 1 rsong staff 72 8 22 09:54 composer.json
      3. -rw-r--r-- 1 rsong staff 2165 8 22 09:54 composer.lock
      4. -rw-r--r-- 1 rsong staff 523 8 22 09:54 index.php
      5. drwxr-xr-x 5 rsong staff 160 8 22 09:54 vendor
  4. fcli コマンドを使用して、関数を作成し呼び出します。

    1. ./fcli shell
    2. cd my-service
    3. mkf my-func -h index.handler --runtime php7.2 -d /tmp/code
    4. invk my-func

方法 2:カスタムパッケージを直接ダウンロードする

使用したいパッケージが Packagist, the PHP Package Repository からのものでない場合、たとえば、 Aliyun-openapi-php-sdkLog Service PHP SDK を使用したい場合、 これらのパッケージを直接ダウンロードしてコードで使用できます。次の例では、Function Compute コマンドラインツール fcli を使用して Log Service Compute PHP SDK をインストールしています。

  1. コードと依存関係モジュールを格納するフォルダを作成します。

    1. mkdir /tmp/code
  2. /tmp/code/index.php などの関数ファイルを作成します。コード内で Log Service PHP SDK メソッドを使用します。

    1. <? php
    2. /* Use the autoloader class to automatically load all required PHP modules. Make sure you specify the correct path of the autoloader file */
    3. require_once realpath(dirname(__FILE__) . '/aliyun-log-php-sdk/Log_Autoload.php');
    4. function handler($event, $context){
    5. $endpoint = 'cn-hangzhou.sls.aliyuncs.com'; //Select the endpoint that corresponds to the region you have specified when you create the project.
    6. $accessKeyId = 'your_access_key_id'; //Your Alibaba Cloud AccessKeyId
    7. $accessKey = 'your_access_key'; //Your Alibaba Cloud AccessKeySecret
    8. $project = 'your_project'; //The log project name
    9. $logstore = 'your_logstore'; //The LogStore name
    10. $client = new Aliyun_Log_Client($endpoint, $accessKeyId, $accessKey);
    11. # List all LogStores in the specified log project
    12. $req1 = new Aliyun_Log_Models_ListLogstoresRequest($project);
    13. $res1 = $client->listLogstores($req1);
    14. var_dump($res1);
    15. }
  3. 依存関係をディレクトリ /tmp/code にダウンロードします。

    1. 以下のコマンドを実行して、依存関係をダウンロードします。

      1. cd /tmp/code
      2. git clone https://github.com/aliyun/aliyun-log-php-sdk.git
    2. ダウンロードが成功したかどうかを確認します。ダウンロードが成功した場合、 /tmp/code ディレクトリは以下のようになります。

      1. ls -l /tmp/code
      2. drwxr-xr-x 11 rsong staff 352 8 22 10:35 aliyun-log-php-sdk
      3. -rw-r--r-- 1 rsong staff 957 8 22 10:42 index.php
  4. fcli コマンドを使用して、関数を作成し呼び出します。

    1. ./fcli shell
    2. cd my-service
    3. mkf my-func -h index.handler --runtime php7.2 -d /tmp/code
    4. invk my-func

外部コマンドを実行する

IPHP 関数でシェルスクリプト、C++ コード、または Go 実行可能ファイルなどの外部ツールを実行したい場合は、ツールとコードをまとめてパッケージ化してアップロードし、外部コマンドを実行してこれらのツールを使用します。次の PHP メソッド、execsystem、および shell-exec を使用して外部プログラムを実行することができます。

注意 :C、C ++、Go 実行可能ファイルを実行するには、ファイルが Function Compute のランタイム環境と互換性があることを確認してください。Function Compute の PHP ランタイム環境は、Linux 4.4.24-2.al7.x86_64 および Docker pull php:7.2 に基づいています。

次の例では、シェルスクリプトを実行するための exec メソッドの使い方を示しています。

  1. <? php
  2. function handler($evt, $ctx){
  3. $script = $_ENV['FC_FUNC_CODE_PATH'] . '/script.sh';
  4. $a = exec("bash " . $script, $out, $status);
  5. print_r($a);
  6. var_dump($out);
  7. print_r($status);
  8. }

例外処理

Function Compute は、PHP 関数の実行時に発生した例外を取得し、その例外に関する情報を返します。次の例では oops 例外を返しています。

  1. <? php
  2. function handler(event, context) {
  3. throw new Exception("oops");
  4. }

上記の関数が呼び出されると、システムは次の応答を出力します。

  1. {
  2. "errorMessage":"oops",
  3. "errorType":"Exception",
  4. "stackTrace":{
  5. "file":"/code/index.php",
  6. "line":3,
  7. "traceString":"#0 /var/fc/runtime/php7/src/invoke.php(67): handler('{\n "product"...', Array)
  8. #1 "
  9. }
  10. }

例外が発生した場合、呼び出しの応答メッセージの HTTP ヘッダーに X-Fc-Error-Type: UnhandledInvocationError が含まれます。Function Compute のエラーの詳細については、「エラーメッセージ」 をご参照ください。