web-dev-qa-db-ja.com

仮想ホストごとにカスタムphp.iniファイルを作成するにはどうすればよいですか?

EasyPHP WAMPはローカル開発専用にインストールしました(Webサイトをホストしていません)。

個別の仮想ホストにカスタムPHP設定を設定する方法はありますか?

現在、すぐに使用できる_php.ini_ファイルは次の場所からロードされます。C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\binaries\php\php_runningversion\php.iniたとえば、カスタム_php.ini_ファイルをにドロップできると便利です。元の_php.ini_の設定を上書きする仮想ホストディレクトリこのようにして、サイトごとに本番サーバーの環境をより適切にエミュレートできます。

私はこれがオンラインホスティングアカウントで機能するのを見てきました。しかし、これを自分のマシンで機能させる方法がわかりません。

11
Joao

カスタムphp.iniファイルの使用は、CGI/FastCGIベースのPHPインストールではかなり簡単ですが、Apacheモジュール(mod_php)としてPHPを実行する場合は、実行できません。 )サーバー全体がPHPインタープリターの単一インスタンスを実行するため。

私のアドバイス:

  • PHP自体からできるだけ多くの設定を設定します:

    ini_set('memory_limit', '16M');
    date_default_timezone_set('Europe/Madrid')
    ...
    

    つまり、実行時に変更できるディレクティブです。

  • ディレクトリごとのApache設定ファイル(別名.htaccess)から残りのものを設定します。

    php_flag short_open_tag off
    php_value post_max_size 50M
    php_value upload_max_filesize 50M
    

    つまり、スクリプトの実行を開始する前に定義する必要のある設定

詳細については、 ランタイム構成 をご覧ください。

場合によっては、開発と本番環境で実際に異なる設定が必要になります。 PHPコード($_SERVER['HTTP_Host']変数からブール定数を作成することから、異なる値を持つconfig.phpファイルを作成することまで)でそれを解決する方法は無限にありますが、それは.htaccessでトリッキーです。私は通常 <IfDefine>ディレクティブ を使用します:

<IfDefine DEV-BOX>
    #
    # Local server directives
    #
    SetEnv DEVELOPMENT "1"

    php_flag display_startup_errors on
    php_flag display_errors on
    php_flag log_errors off
    #php_value error_log ...
</IfDefine>
<IfDefine !DEV-BOX>
    #
    # Internet server directives
    #
    php_flag display_startup_errors off
    php_flag display_errors off
    php_flag log_errors on
    php_value error_log "/home/foo/log/php-error.log"
</IfDefine>

...ここで、DEV-BOXは、ローカルのApacheコマンドラインに渡す文字列です。

C:\Apache24\bin\httpd.exe -D DEV-BOX

Apacheをサービスとして実行する場合、-D DEV-BOXビットをWindowsレジストリに追加できます。例:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Apache2.4\Parameters\ConfigArgs

関連: サーバー上でPHPがどのように実行されているかを調べます(CGI OR fastCGI OR mod_php) ==

13

Fast CGIを使用してvhost用のカスタムphp.iniファイルを使用する簡単な方法は、php.iniを「customini」のようなホスト内のフォルダーにコピーすることです。

その後、vhostディレクティブに追加し、次の簡単な行を追加します。

FcgidInitialEnv PHPRC "/path_to_your_custom_ini_dir_for_this_vhost/"

必ず持ってください/ to your path no \、(\では機能しません)

Apacheを再起動します。

それで全部です!

完全なサンプル(ここではWindows Server上):

 <VirtualHost *:80>
    DocumentRoot "C:/Apache/htdocs/vhost/myvhost"
    ServerName www.vhost.com
    FcgidInitialEnv PHPRC "C:/Apache/customini/myvhost/"
 </VirtualHost>
2
Sontae

1台のマシンで複数のドメインを開発していますか?

Php.ini設定をhttpd-vhost.confに埋め込むことは、通常、サーバールートのconf/extra/の下にあり、この一般的な問題を解決するための優れた方法です。これができるとは知らなかった場合は、PHP.netのマニュアル 構成設定の変更方法 を参照してください。これにより、ブートストラップコードなどに構成コードを追加することなく、厄介なinclude_path問題が解決されます。

もちろん、これをlocalhostとして効果的に使用するには、<VirualHost>ブロックのコピーを作成し、それに応じてそれぞれを構成する必要があります。次に、使用するすべての仮想ホストブロックをコメントアウトします

または、-fオプションを指定してApacheを起動し、起動時にサーバーデーモンが別のhttpd.confを指すようにすることもできます。各httpd.confには、および<IfModule phpx_module>ブロックなどの「ifモジュールブロック」が必要です。 Apacheロギングを考慮することを忘れないでください!

httpd -f /usr/local/Apache2/conf/domains/fooDomain.conf

httpd -f /usr/local/Apache2/conf/domains/barDomain.conf

php.iniステートメントを含む仮想ホストブロック。

<VirtualHost 127.0.0.1:80>
    UseCanonicalName On
    ServerName localhost:80
    ServerAdmin you@localhost        
    CustomLog "/var/www/someDomain.com/data/logs/httpd_access_log" common
    ErrorLog "/var/www/someDomain.com/data/logs/httpd_error_log"
    LogLevel warn
    DocumentRoot "/var/www/someDomain.com/public"

    <Directory "/var/www/someDomain.com/public">
        # disable directory listing
        Options -Indexes +FollowSymLinks
        AllowOverride FileInfo
        Require all granted
    </Directory>

    <IfModule alias_module>
        # Alias /webpath /full/filesystem/path
        ScriptAlias /cgi-bin/ "/var/www/someDomain.com/scripts/cgi-bin/"
    </IfModule>

    <IfModule php5_module>
        # Use php7_module in opening statement above if on PHP 7+

        # Domain specific PHP configuration options.
        # The Apache process user must own any of the following directories.

        php_admin_value include_path "/var/www/someDomain.com/application/controllers:/var/www/someDomain.com/application/models:/var/www/someDomain.com/application/views"

        # Errors and Logging
        php_admin_flag display_startup_errors off
        php_admin_flag display_errors off
        php_admin_flag html_errors off
        php_admin_flag log_errors on
        php_admin_value error_log "/var/www/someDomain.com/data/logs/php_error_log"

        # File Related
        php_admin_flag file_uploads on
        php_admin_value upload_tmp_dir "/var/www/someDomain.com/data/uploads"
        php_admin_value upload_max_filesize 10M
        php_admin_value max_file_uploads 5

        # Sessions
        php_value session.save_handler "files"
        php_value session.save_path "/var/www/someDomain.com/data/sessions"

        # Caching
        php_value soap.wsdl_cache_dir "/var/www/someDomain.com/data/cache/sopa.wsdl"
    </IfModule>
</VirtualHost>

%{SERVER_NAME}変数を<IfModule phpx_module> blocks to form a compound conditional, you could have just onehttpd.conf`と組み合わせて使用​​するか、すべてのドメイン固有のPHP.ini設定(ブロック単位)とともにextra /php.confを含めることができる場合。ただし、「localhost」がドメインターゲットである限り、それはあなたが望むことをしません。したがって、上記の仮想ホストブロックでの私の答え。

1

何人かのコメンテーターが言及しています Vagrant これは優れたソリューションです。

Vagrantの使用に興味がない場合は、ApacheへのインターフェイスとしてFastCGIを使用し、これで提案されているSetEnv PHPRC...提案を使用して調査できます blog

ApacheとPHP:複数のPHP.ini構成ファイル(2009年2月8日日曜日)

出典:http://hyponiq.blogspot.com/2009/02/Apache-php-multiple-phpini.html

2番目の回避策は、SetEnvディレクティブを使用してApacheで構成可能なPHPRC環境変数を使用することです。このディレクティブを使用すると、環境変数を設定して、静的(x)HTMLページ(またはその他のドキュメントタイプ)に設定されているCGIスクリプトやサーバーサイドインクルード(SSI)に渡すことができます。この例では、各PHP-CGIインスタンスにその構成設定の場所を指示します。例は次のようになります(前のものと一致):

# vhosts.conf
NameVirtualHost *:81
<VirtualHost *:81>
  ServerAdmin [email protected]
  ServerName vhost.example.com
  DocumentRoot "C:/path/to/doc/root"
  ErrorLog "logs/vhost.example.com-errors.log"

  # Set the PHPRC environment variable
  SetEnv PHPRC "C:/path/to/doc/root/php.ini"

  <Directory "C:/path/to/doc/root">
    # ... yadda, yadda, yadda ...
    # you get the point!
  </Directory>
</VirtualHost>

ただし、PHPドキュメント ランタイム構成の変更 は、php_valueなどの特定の値を使用してloaalongを試すことができることを示しています。おそらく、SetEnvディレクティブ。

彼は、FastCGIを使用せず、代わりにphp_valuephp_flagなどの構成オプションを利用する別のオプションを提案しています。

他の人はFastCGIを介してスクリプトを実行することにある程度成功したようですが、以下を参照してください: 異なる仮想ホスト用に別々のphp.ini

その他の提案には、PHPINIディレクティブが含まれます。これは、ニーズに関連している可能性があります。以下を参照してください。 PHPアプリを独自のディレクトリと独自のphpに制限するにはどうすればよいですか。 ini?

0
Sean Quinn