PHPackages                             ixbox/phambda - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. ixbox/phambda

ActiveLibrary

ixbox/phambda
=============

v0.3.0(1y ago)189MITPHPPHP ^8.1CI passing

Since Mar 22Pushed 4mo ago1 watchersCompare

[ Source](https://github.com/ixbox/phambda)[ Packagist](https://packagist.org/packages/ixbox/phambda)[ RSS](/packages/ixbox-phambda/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (5)Dependencies (12)Versions (6)Used By (0)

PHP Runtime for AWS Lambda
==========================

[](#php-runtime-for-aws-lambda)

概要
--

[](#概要)

Phambda は、PHP で AWS Lambda を簡単に利用するためのランタイムを提供します。このパッケージを使用することで、AWS Lambda 上で PHP コードを実行するための設定や実装が簡素化されます。

### 主な特徴

[](#主な特徴)

- PSR-7 および PSR-15 に準拠したリクエスト/レスポンス処理
    - 標準的な PHP インターフェースを使用することで、既存の PHP アプリケーションとの互換性を確保
    - ミドルウェアパターンによる柔軟な処理の追加が可能
- AWS Lambda 環境に最適化されたランタイム
    - コールドスタートの最小化
    - メモリ使用の効率化
    - エラーハンドリングの強化
- [static-php-cli](https://static-php.dev/) 対応
    - **コンテナ化不要**: 静的ビルドされた PHP バイナリを使用して直接デプロイ
    - 軽量なデプロイパッケージで高速なコールドスタートを実現
    - Docker 環境が不要なため、CI/CD パイプラインが簡素化
- シンプルなインターフェースでの実装
    - 最小限のコードで Lambda 関数を作成可能
    - 豊富なログ機能により、デバッグとモニタリングが容易

インストール方法
--------

[](#インストール方法)

以下のコマンドを実行してインストールします：

```
composer require ixbox/phambda
```

### 必要な環境

[](#必要な環境)

- PHP 8.1 以上
- Composer
- AWS Lambda の実行権限を持つ IAM ロール
    - 基本的な Lambda 実行権限
    - CloudWatch Logs へのアクセス権限

### AWS Lambda 環境のセットアップ

[](#aws-lambda-環境のセットアップ)

Phambda は [static-php-cli](https://static-php.dev/) を活用することで、**コンテナ化せずに** AWS Lambda にデプロイできます。static-php-cli は PHP を静的にリンクしたシングルバイナリを提供しており、AWS Lambda のカスタムランタイム（`provided.al2023`）で直接実行可能です。

#### static-php-cli を使用したデプロイ（推奨）

[](#static-php-cli-を使用したデプロイ推奨)

この方法では Docker イメージのビルドが不要で、デプロイパッケージが軽量になり、コールドスタートが高速化されます。

**Lambda Layer を活用した構成**により、PHP バイナリ（約 30MB）をアプリケーションコードから分離し、zip の 50MB 制限内に収めやすくなります。

```
┌─────────────────────────────┐
│  Lambda 関数（< 50MB）       │  ← アプリコード + vendor のみ
├─────────────────────────────┤
│  PHP Layer（~30MB）          │  ← static-php-cli バイナリ
└─────────────────────────────┘

```

1. **SAM テンプレートの設定**

    ```
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31

    Resources:
      # PHP Runtime Layer (static-php-cli)
      PhpLayer:
        Type: AWS::Serverless::LayerVersion
        Properties:
          LayerName: php-runtime
          Description: PHP 8.4 runtime built with static-php-cli
          ContentUri: .
          CompatibleRuntimes:
            - provided.al2023
          CompatibleArchitectures:
            - arm64  # または x86_64
        Metadata:
          BuildMethod: makefile
          BuildArchitecture: arm64

      App:
        Type: AWS::Serverless::Function
        Properties:
          Runtime: provided.al2023
          Handler: bootstrap
          Architectures:
            - arm64
          Layers:
            - !Ref PhpLayer
          Events:
            HelloWorld:
              Type: HttpApi
              Properties:
                Path: /hello
                Method: get
        Metadata:
          BuildMethod: makefile
    ```
2. **Makefile の作成**

    ```
    PHP_VERSION = 8.4.15

    # Detect architecture from build container (template.yaml の Architectures に連動)
    ARCH = $(shell uname -m)
    PHP_ARCHIVE = php-$(PHP_VERSION)-cli-linux-$(ARCH).tar.gz
    PHP_URL = https://dl.static-php.dev/static-php-cli/common/$(PHP_ARCHIVE)

    # Download PHP binary matching the target architecture
    prepare:
    	@echo "Detected architecture: $(ARCH)"
    	[ -e $(PHP_ARCHIVE) ] || curl -fsSL -o $(PHP_ARCHIVE) $(PHP_URL)
    	tar -xzf $(PHP_ARCHIVE)
    	chmod +x php
    	[ -e composer.phar ] || curl -fsSL -O https://getcomposer.org/download/latest-stable/composer.phar

    # Build PHP Layer (Layer is mounted at /opt, so php will be at /opt/bin/php)
    build-PhpLayer: prepare
    	mkdir -p $(ARTIFACTS_DIR)/bin
    	cp php $(ARTIFACTS_DIR)/bin/php

    # Build Application Function (code + vendor only, no PHP binary)
    build-App: prepare
    	cp -r src $(ARTIFACTS_DIR)/src
    	cp composer.json composer.lock $(ARTIFACTS_DIR)
    	cp bootstrap $(ARTIFACTS_DIR)
    	cp main.php $(ARTIFACTS_DIR)
    	./php composer.phar install --no-interaction --no-progress --prefer-dist --optimize-autoloader -d $(ARTIFACTS_DIR)
    	# Remove unnecessary files to reduce package size
    	find $(ARTIFACTS_DIR)/vendor -type f -name "*.md" -delete
    	find $(ARTIFACTS_DIR)/vendor -type d -name "tests" -exec rm -rf {} + 2>/dev/null || true
    ```

    > **Note**: 本番環境では `--no-dev` を使用し、必要な PSR 実装（HTTP クライアント、PSR-7 実装など）を `composer.json` の `require` セクションに追加してください。
3. **bootstrap ファイルの作成**

    ```
    #!/bin/bash
    # PHP binary is provided by the Layer at /opt/bin/php
    /opt/bin/php /var/task/main.php
    ```
4. **デプロイ**

    ```
    # --use-container でコンテナ内ビルド（Linux 環境でビルドするため必須）
    sam build --use-container
    sam deploy --guided
    ```

#### static-php-cli + Layer のメリット

[](#static-php-cli--layer-のメリット)

- **コンテナ不要**: Docker イメージのビルド・プッシュが不要
- **50MB 制限に対応**: PHP バイナリを Layer に分離し、関数 zip を軽量化
- **デプロイ高速化**: PHP Layer は初回のみ、以降はアプリコードだけ更新
- **高速なコールドスタート**: コンテナ起動のオーバーヘッドがない
- **シンプルな CI/CD**: Docker 環境が不要なため、ビルドパイプラインが簡素化
- **Layer 共有**: 複数の Lambda 関数で同じ PHP Layer を再利用可能

#### コンテナを使用したデプロイ（代替方法）

[](#コンテナを使用したデプロイ代替方法)

Docker コンテナを使用したい場合は、以下の方法も利用可能です：

1. Lambda 関数の作成

    - ランタイム: カスタムランタイム
    - アーキテクチャ: x86\_64 または arm64
    - メモリ: 推奨 256MB 以上
    - タイムアウト: アプリケーションの要件に応じて設定（デフォルト 29 秒）
2. デプロイメントパッケージの作成

    ```
    # 本番環境用の依存関係のみをインストール
    composer install --no-dev --optimize-autoloader

    # デプロイメントパッケージの作成
    zip -r function.zip . -x "*.git*" "tests/*" "*.dist" "*.md"
    ```
3. Lambda 関数の設定

    - ハンドラー: `index.php`（エントリーポイントとなる PHP ファイル）
    - 環境変数（必要に応じて設定）: ```
        AWS_LAMBDA_RUNTIME_API: Lambda ランタイム API のエンドポイント
        LOG_TIMEZONE: ログのタイムゾーン（デフォルト: UTC）

        ```

使用方法
----

[](#使用方法)

### 基本的な Hello World の例

[](#基本的な-hello-world-の例)

以下は、AWS Lambda 上で動作する簡単な Hello World の例です：

```
#!/usr/bin/env php
