Symfony Local Web Server

You can run Symfony applications with any web server (Apache, nginx, the internal PHP web server, etc.). However, Symfony provides its own web server to make you more productive while developing your applications.

Symfony アプリケーションは、任意の Web サーバー (Apache、nginx、内部 PHP Web サーバーなど) で実行できます。ただし、Symfony は独自の Web サーバーを提供して、アプリケーションの開発中の生産性を高めます。

Although this server is not intended for production use, it supports HTTP/2, TLS/SSL, automatic generation of security certificates, local domains, and many other features that sooner or later you'll need when developing web projects. Moreover, the server is not tied to Symfony and you can also use it with any PHP application and even with HTML or single page applications.

このサーバーは本番環境での使用を意図していませんが、HTTP/2、TLS/SSL、セキュリティ証明書の自動生成、ローカル ドメイン、および遅かれ早かれ Web プロジェクトの開発時に必要になるその他の多くの機能をサポートしています。さらに、サーバーはSymfony とは関係なく、任意の PHP アプリケーションや、HTML または単一ページ アプリケーションでも使用できます。

Installation

The Symfony server is part of the symfony binary created when you install Symfony and has support for Linux, macOS and Windows.

Symfony サーバーは、Symfony のインストール時に作成される symfony バイナリの一部であり、Linux、macOS、および Windows をサポートしています。

Note

ノート

You can view and contribute to the Symfony CLI source in the symfony-cli/symfony-cli GitHub repository.

symfony-cli/symfony-cli GitHub リポジトリで Symfony CLI ソースを表示して投稿できます。

Getting Started

The Symfony server is started once per project, so you may end up with several instances (each of them listening to a different port). This is the common workflow to serve a Symfony project:

Symfony サーバーはプロジェクトごとに 1 回起動されるため、複数のインスタンス (それぞれが異なるポートをリッスンする) になる可能性があります。これは、Symfony プロジェクトを提供するための一般的なワークフローです:
1
2
3
4
5
6
7
8
$ cd my-project/
$ symfony server:start

  [OK] Web server listening on http://127.0.0.1:....
  ...

# Now, browse the given URL, or run this command:
$ symfony open:local

Running the server this way makes it display the log messages in the console, so you won't be able to run other commands at the same time. If you prefer, you can run the Symfony server in the background:

この方法でサーバーを実行すると、ログ メッセージがコンソールに表示されるため、他のコマンドを同時に実行することはできません。必要に応じて、バックグラウンドで Symfony サーバーを実行できます。
1
2
3
4
5
6
7
8
9
$ cd my-project/

# start the server in the background
$ symfony server:start -d

# continue working and running other commands...

# show the latest log messages
$ symfony server:log

Enabling PHP-FPM

Note

ノート

PHP-FPM must be installed locally for the Symfony server to utilize.

Symfony サーバーが利用するには、PHP-FPM をローカルにインストールする必要があります。

When the server starts, it checks for web/index_dev.php, web/index.php, public/app_dev.php, public/app.php in that order. If one is found, the server will automatically start with PHP-FPM enabled. Otherwise the server will start without PHP-FPM and will show a Page not found page when trying to access a .php file in the browser.

サーバーが起動すると、web/index_dev.php、web/index.php、public/app_dev.php、public/app.php の順にチェックします。見つかった場合、サーバーは自動的に PHP-FPM を有効にして起動します。そうしないと、サーバーは PHP-FPM なしで起動し、ブラウザで .php ファイルにアクセスしようとすると、Page not found ページが表示されます。

Tip

ヒント

When an index.html and a front controller like e.g. index.php are both present the server will still start with PHP-FPM enabled but the index.html will take precedence over the front controller. This means when an index.html file is present in public or web, it will be displayed instead of the index.php which would show e.g. the Symfony application.

たとえば、index.html とフロント コントローラーの場合。 index.php が両方とも存在する場合、サーバーは引き続き PHP-FPM を有効にして起動しますが、index.html はフロント コントローラーよりも優先されます。これは、index.html ファイルがパブリックまたは Web に存在する場合、index.php の代わりに表示されることを意味します。 Symfony アプリケーション。

Enabling TLS

Browsing the secure version of your applications locally is important to detect problems with mixed content early, and to run libraries that only run in HTTPS. Traditionally this has been painful and complicated to set up, but the Symfony server automates everything. First, run this command:

アプリケーションの安全なバージョンをローカルで参照することは、混合コンテンツの問題を早期に検出し、HTTPS でのみ実行されるライブラリを実行するために重要です。従来、これは面倒でセットアップが複雑でしたが、Symfony サーバーはすべてを自動化します。まず、次のコマンドを実行します。
1
$ symfony server:ca:install

This command creates a local certificate authority, registers it in your system trust store, registers it in Firefox (this is required only for that browser) and creates a default certificate for localhost and 127.0.0.1. In other words, it does everything for you.

このコマンドは、ローカル認証局を作成し、それをシステム信頼ストアに登録し、Firefox に登録し (これはそのブラウザーでのみ必要です)、localhost および 127.0.0.1 のデフォルト証明書を作成します。言い換えれば、それはあなたのためにすべてを行います.

Before browsing your local application with HTTPS instead of HTTP, restart its server stopping and starting it again.

HTTP ではなく HTTPS を使用してローカル アプリケーションを参照する前に、そのサーバーを再起動して停止し、再度起動します。

Different PHP Settings Per Project

Selecting a Different PHP Version

If you have multiple PHP versions installed on your computer, you can tell Symfony which one to use creating a file called .php-version at the project root directory:

コンピューターに複数の PHP バージョンがインストールされている場合、Symfony にどれを使用するかを指示し、projectroot ディレクトリに .php-version というファイルを作成します。
1
2
3
4
5
6
7
$ cd my-project/

# use a specific PHP version
$ echo 7.4 > .php-version

# use any PHP 8.x version available
$ echo 8 > .php-version

Tip

ヒント

The Symfony server traverses the directory structure up to the root directory, so you can create a .php-version file in some parent directory to set the same PHP version for a group of projects under that directory.

Symfony サーバーはディレクトリ構造をルート ディレクトリまでトラバースするため、ある親ディレクトリに .php-version ファイルを作成して、そのディレクトリの下にあるプロジェクトのグループに同じ PHP バージョンを設定できます。

Run the command below if you don't remember all the PHP versions installed on your computer:

コンピューターにインストールされているすべての PHP バージョンを覚えていない場合は、次のコマンドを実行します。
1
2
3
4
5
$ symfony local:php:list

  # You'll see all supported SAPIs (CGI, FastCGI, etc.) for each version.
  # FastCGI (php-fpm) is used when possible; then CGI (which acts as a FastCGI
  # server as well), and finally, the server falls back to plain CGI.

Overriding PHP Config Options Per Project

You can change the value of any PHP runtime config option per project by creating a file called php.ini at the project root directory. Add only the options you want to override:

プロジェクトのルート ディレクトリに php.ini というファイルを作成することで、プロジェクトごとに任意の PHP ランタイム構成オプションの値を変更できます。オーバーライドしたいオプションのみを追加します。
1
2
3
4
5
6
$ cd my-project/

# this project only overrides the default PHP timezone
$ cat php.ini
[Date]
date.timezone = Asia/Tokyo

Running Commands with Different PHP Versions

When running different PHP versions, it is useful to use the main symfony command as a wrapper for the php command. This allows you to always select the most appropriate PHP version according to the project which is running the commands. It also loads the env vars automatically, which is important when running non-Symfony commands:

異なる PHP バージョンを実行する場合、メインの symfonycommand を php コマンドのラッパーとして使用すると便利です。これにより、コマンドを実行しているプロジェクトに応じて、常に最適な PHP バージョンを選択できます。また、環境変数を自動的にロードします。これは、Symfony 以外のコマンドを実行するときに重要です。
1
2
3
4
5
6
# runs the command with the default PHP version
$ php -r "..."

# runs the command with the PHP version selected by the project
# (or the default PHP version if the project didn't select one)
$ symfony php -r "..."

Local Domain Names

By default, projects are accessible at some random port of the 127.0.0.1 local IP. However, sometimes it is preferable to associate a domain name to them:

デフォルトでは、プロジェクトは 127.0.0.1 ローカル IP の任意のポートでアクセスできます。ただし、ドメイン名をそれらに関連付ける方が望ましい場合もあります。
  • It's more convenient when you work continuously on the same project because port numbers can change but domains don't;
    ポート番号は変更できますが、ドメインは変更できないため、同じプロジェクトで継続的に作業する場合により便利です。
  • The behavior of some applications depend on their domains/subdomains;
    一部のアプリケーションの動作は、ドメイン/サブドメインによって異なります。
  • To have stable endpoints, such as the local redirection URL for OAuth2.
    OAuth2 のローカル リダイレクト URL など、安定したエンドポイントを持つため。

Setting up the Local Proxy

Local domains are possible thanks to a local proxy provided by the Symfony server. If this is the first time you run the proxy, you must configure it as follows:

ローカル ドメインは、Symfony サーバーが提供するローカル プロキシのおかげで可能です。プロキシを初めて実行する場合は、次のように設定する必要があります。
  1. Open the proxy settings of your operating system:

    オペレーティング システムのプロキシ設定を開きます。
  2. Set the following URL as the value of the Automatic Proxy Configuration: http://127.0.0.1:7080/proxy.pac
    次の URL を自動プロキシ設定の値として設定します:http://127.0.0.1:7080/proxy.pac

Now run this command to start the proxy:

次のコマンドを実行して、プロキシを開始します。
1
$ symfony proxy:start

If the proxy doesn't work as explained in the following sections, check these:

次のセクションで説明されているようにプロキシが機能しない場合は、次のことを確認してください。
  • Some browsers (e.g. Chrome) require to re-apply proxy settings (clicking on Re-apply settings button on the chrome://net-internals/#proxy page) or a full restart after starting the proxy. Otherwise, you'll see a "This webpage is not available" error (ERR_NAME_NOT_RESOLVED);
    一部のブラウザー (Chrome など) では、プロキシ設定を再適用する (chrome://net-internals/#proxy ページの [設定を再適用] ボタンをクリックする) か、プロキシを開始した後に完全に再起動する必要があります。そうしないと、「このウェブページは利用できません」というエラー (ERR_NAME_NOT_RESOLVED) が表示されます。
  • Some Operating Systems (e.g. macOS) don't apply by default the proxy settings to local hosts and domains. You may need to remove *.local and/or other IP addresses from that list.
    一部のオペレーティング システム (macOS など) では、デフォルトでプロキシ設定がローカル ホストおよびドメインに適用されません。そのリストから *.local やその他の IP アドレスを削除する必要がある場合があります。

Defining the Local Domain

By default, Symfony proposes .wip (for Work in Progress) for the local domains. You can define a local domain for your project as follows:

デフォルトでは、Symfony はローカルドメインに .wip (進行中の作業) を提案します。次のように、プロジェクトのローカル ドメインを定義できます。
1
2
$ cd my-project/
$ symfony proxy:domain:attach my-domain

If you have installed the local proxy as explained in the previous section, you can now browse https://my-domain.wip to access your local project with the new custom domain.

前のセクションで説明したようにローカル プロキシをインストールした場合は、https://my-domain.wip を参照して、新しいカスタム ドメインでローカル プロジェクトにアクセスできます。

Tip

ヒント

Browse the http://127.0.0.1:7080 URL to get the full list of local project directories, their custom domains, and port numbers.

http://127.0.0.1:7080 URL を参照して、ローカル プロジェクト ディレクトリ、カスタム ドメイン、およびポート番号の完全なリストを取得します。

You can also add a wildcard domain:

ワイルドカード ドメインを追加することもできます。
1
$ symfony proxy:domain:attach "*.my-domain"

So it will match all subdomains like https://admin.my-domain.wip, https://other.my-domain.wip...

したがって、https://admin.my-domain.wip、https://other.my-domain.wip... などのすべてのサブドメインに一致します。

When running console commands, add the https_proxy env var to make custom domains work:

コンソール コマンドを実行するときは、https_proxy 環境変数を追加してカスタム ドメインを機能させます。
1
2
3
4
5
6
7
8
# Example with curl
$ https_proxy=$(symfony proxy:url) curl https://my-domain.wip

# Example with Blackfire and curl
$ https_proxy=$(symfony proxy:url) blackfire curl https://my-domain.wip

# Example with Cypress
$ https_proxy=$(symfony proxy:url) ./node_modules/bin/cypress open

Note

ノート

Although env var names are always defined in uppercase, the https_proxy env var is treated differently than other env vars and its name must be spelled in lowercase.

環境変数名は常に大文字で定義されますが、https_proxyenv 変数は他の環境変数とは異なる方法で扱われ、その名前は小文字で綴る必要があります。

Tip

ヒント

If you prefer to use a different TLD, edit the ~/.symfony5/proxy.json file (where ~ means the path to your user directory) and change the value of the tld option from wip to any other TLD.

別の TLD を使用する場合は、~/.symfony5/proxy.json ファイル (~ はユーザー ディレクトリへのパスを意味します) を編集し、tld オプションの値を wip から他の TLD に変更します。

Long-Running Commands

Long-running commands, such as the ones that compile front-end web assets, block the terminal and you can't run other commands at the same time. The Symfony server provides a run command to wrap them as follows:

フロントエンド Web アセットをコンパイルするコマンドなど、長時間実行されるコマンドはターミナルをブロックし、他のコマンドを同時に実行することはできません。 Symfonyserver は、以下のようにそれらをラップする run コマンドを提供します:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# compile Webpack assets using Symfony Encore ... but do that in the
# background to not block the terminal
$ symfony run -d yarn encore dev --watch

# continue working and running other commands...

# from time to time, check the command logs if you want
$ symfony server:log

# and you can also check if the command is still running
$ symfony server:status
Web server listening on ...
Command "yarn ..." running with PID ...

# stop the web server (and all the associated commands) when you are finished
$ symfony server:stop

Configuration file

Caution

注意

This feature is experimental and could change or be removed at any time without prior notice.

この機能は実験的なものであり、予告なしにいつでも変更または削除される可能性があります。

There are several options that you can set using a .symfony.local.yaml config file:

.symfony.local.yaml 設定ファイルを使用して設定できるいくつかのオプションがあります:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Sets domain1.wip and domain2.wip for the current project
proxy:
    domains:
        - domain1
        - domain2

http:
    document_root: public/ # Path to the project document root
    passthru: index.php # Project passthru index
    port: 8000 # Force the port that will be used to run the server
    preferred_port: 8001 # Preferred HTTP port [default: 8000]
    p12: path/to/p12_cert # Name of the file containing the TLS certificate to use in p12 format
    allow_http: true # Prevent auto-redirection from HTTP to HTTPS
    no_tls: true # Use HTTP instead of HTTPS
    daemon: true # Run the server in the background
    use_gzip: true # Toggle GZIP compression

Caution

注意

Setting domains in this configuration file will override any domains you set using the proxy:domain:attach command for the current project when you start the server.

この構成ファイルでドメインを設定すると、サーバーの起動時に現在のプロジェクトに対して proxy:domain:attach コマンドを使用して設定したすべてのドメインが上書きされます。

Configuring Workers

If you like some processes to start automatically, along with the webserver (symfony server:start), you can set them in the YAML configuration file:

ウェブサーバー (symfony server:start) と一緒にいくつかのプロセスを自動的に開始したい場合は、YAML 設定ファイルでそれらを設定できます:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .symfony.local.yaml
workers:
    # built-in command that builds and watches front-end assets
    # yarn_encore_watch:
    #     cmd: ['yarn', 'encore', 'dev', '--watch']
    yarn_encore_watch: ~

    # built-in command that starts messenger consumer
    # messenger_consume_async:
    #     cmd: ['symfony', 'console', 'messenger:consume', 'async']
    #     watch: ['config', 'src', 'templates', 'vendor']
    messenger_consume_async: ~

    # you can also add your own custom commands
    build_spa:
        cmd: ['yarn', '--cwd', './spa/', 'dev']

Docker Integration

The local Symfony server provides full Docker integration for projects that use it. To learn more about Docker & Symfony, see Using Docker with Symfony.

ローカル Symfony サーバーは、それを使用するプロジェクトに完全な Docker 統合を提供します。 Docker と Symfony の詳細については、Symfony で Docker を使用するを参照してください。

When the web server detects that Docker Compose is running for the project, it automatically exposes some environment variables.

プロジェクトで Docker Compose が実行されていることを Web サーバーが検出すると、いくつかの環境変数が自動的に公開されます。

Via the docker-compose API, it looks for exposed ports used for common services. When it detects one it knows about, it uses the service name to expose environment variables.

docker-compose API を介して、共通サービスに使用される公開ポートを探します。知っているものを検出すると、サービス名を使用して環境変数を公開します。

Consider the following configuration:

次の構成を検討してください。
1
2
3
4
# docker-compose.yaml
services:
    database:
        ports: [3306]

The web server detects that a service exposing port 3306 is running for the project. It understands that this is a MySQL service and creates environment variables accordingly with the service name (database) as a prefix: DATABASE_URL, DATABASE_HOST, ...

Web サーバーは、ポート 3306 を公開するサービスがプロジェクトで実行されていることを検出します。これが MySQL サービスであることを認識し、それに応じてサービス名 (データベース) をプレフィックスとして使用して環境変数を作成します: DATABASE_URL、DATABASE_HOST、...

If the service is not in the supported list below, generic environment variables are set: PORT, IP, and HOST.

サービスが以下のサポートされているリストにない場合、一般的な環境変数 (PORT、IP、および HOST) が設定されます。

If the docker-compose.yaml names do not match Symfony's conventions, add a label to override the environment variables prefix:

docker-compose.yaml の名前が Symfony の規則と一致しない場合は、ラベルを追加して環境変数のプレフィックスをオーバーライドします。
1
2
3
4
5
6
# docker-compose.yaml
services:
    db:
        ports: [3306]
        labels:
            com.symfony.server.service-prefix: 'DATABASE'

In this example, the service is named db, so environment variables would be prefixed with DB_, but as the com.symfony.server.service-prefix is set to DATABASE, the web server creates environment variables starting with DATABASE_ instead as expected by the default Symfony configuration.

この例では、サービスの名前が db であるため、環境変数の前に DB_ が付けられますが、com.symfony.server.service-prefix が DATABASE に設定されているため、デフォルトの Symfony 設定で期待されるように、Web サーバーは代わりに DATABASE_ で始まる環境変数を作成します。 .

Here is the list of supported services with their ports and default Symfony prefixes:

ポートとデフォルトの Symfonyprefix を含む、サポートされているサービスのリストは次のとおりです。
Service Port Symfony default prefix
MySQL 3306 DATABASE_
PostgreSQL 5432 DATABASE_
Redis 6379 REDIS_
Memcached 11211 MEMCACHED_
RabbitMQ 5672 RABBITMQ_ (set user and pass via Docker RABBITMQ_DEFAULT_USER and RABBITMQ_DEFAULT_PASS env var)
Elasticsearch 9200 ELASTICSEARCH_
MongoDB 27017 MONGODB_ (set the database via a Docker MONGO_DATABASE env var)
Kafka 9092 KAFKA_
MailCatcher 1025/1080 or 25/80 MAILER_
Blackfire 8707 BLACKFIRE_
Mercure 80 Always exposes MERCURE_PUBLIC_URL and MERCURE_URL (only works with the dunglas/mercure Docker image)

You can open web management interfaces for the services that expose them:

それらを公開するサービスの Web 管理インターフェイスを開くことができます。
1
2
$ symfony open:local:webmail
$ symfony open:local:rabbitmq

Or click on the links in the "Server" section of the web debug toolbar.

または、Web デバッグ ツールバーの「サーバー」セクションのリンクをクリックします。

Tip

ヒント

To debug and list all exported environment variables, run symfony var:export --debug.

エクスポートされたすべての環境変数をデバッグして一覧表示するには、symfonyvar:export --debug を実行します。

Tip

ヒント

For some services, the web server also exposes environment variables understood by CLI tools related to the service. For instance, running symfony run psql will connect you automatically to the PostgreSQL server running in a container without having to specify the username, password, or database name.

一部のサービスでは、Web サーバーは、サービスに関連する CLI ツールが理解する環境変数も公開します。たとえば、 runningsymfony run psql は、ユーザー名、パスワード、またはデータベース名を指定する必要なく、コンテナーで実行されている PostgreSQL サーバーに自動的に接続します。

When Docker services are running, browse a page of your Symfony application and check the "Symfony Server" section in the web debug toolbar; you'll see that "Docker Compose" is "Up".

Docker サービスが実行されている場合、Symfony アプリケーションのページを参照し、Web デバッグ ツールバーの「Symfony サーバー」セクションを確認します。 「Docker Compose」が「Up」になっていることがわかります。

Note

ノート

If you don't want environment variables to be exposed for a service, set the com.symfony.server.service-ignore label to true:

環境変数をサービスに公開したくない場合は、com.symfony.server.service-ignore ラベルを true に設定してください:
1
2
3
4
5
6
# docker-compose.yaml
services:
    db:
        ports: [3306]
        labels:
            com.symfony.server.service-ignore: true

If your Docker Compose file is not at the root of the project, use the COMPOSE_FILE and COMPOSE_PROJECT_NAME environment variables to define its location, same as for docker-compose:

Docker Compose ファイルがプロジェクトのルートにない場合は、docker-compose の場合と同様に、COMPOSE_FILE および COMPOSE_PROJECT_NAME 環境変数を使用してその場所を定義します。
1
2
3
4
5
# start your containers:
COMPOSE_FILE=docker/docker-compose.yaml COMPOSE_PROJECT_NAME=project_name docker-compose up -d

# run any Symfony CLI command:
COMPOSE_FILE=docker/docker-compose.yaml COMPOSE_PROJECT_NAME=project_name symfony var:export

Note

ノート

If you have more than one Docker Compose file, you can provide them all separated by : as explained in the Docker compose CLI env var reference.

複数の Docker Compose ファイルがある場合は、Docker Compose CLI env var リファレンスで説明されているように、それらをすべて : で区切って提供できます。

Caution

注意

When using the Symfony binary with php bin/console (symfony console ...), the binary will always use environment variables detected via Docker and will ignore local environment variables. For example if you set up a different database name in your .env.test file (DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/test) and if you run symfony console doctrine:database:drop --force --env=test, the command will drop the database defined in your Docker configuration and not the "test" one.

Symfony バイナリを php bin/console (symfony console ...) で使用する場合、バイナリは常に Docker 経由で検出された環境変数を使用し、ローカル環境変数を無視します。たとえば、.env.test で別のデータベース名を設定した場合file(DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/test) で、symfony コンソール doctrine:database:drop --force --env=test を実行すると、コマンドは Docker 構成で定義されたデータベースを削除し、 「テスト」ではありません。

SymfonyCloud Integration

The local Symfony server provides full, but optional, integration with SymfonyCloud, a service optimized to run your Symfony applications on the cloud. It provides features such as creating environments, backups/snapshots, and even access to a copy of the production data from your local machine to help debug any issues.

ローカルの Symfony サーバーは、クラウド上で Symfony アプリケーションを実行するために最適化されたサービスである SymfonyCloud との完全な、ただしオプションの統合を提供します。環境の作成、バックアップ/スナップショット、ローカル マシンから本番データのコピーへのアクセスなどの機能を提供し、問題のデバッグに役立ちます。

Read SymfonyCloud technical docs.

SymfonyCloud のテクニカル ドキュメントを読んでください。