web-dev-qa-db-ja.com

PHP 7?に互換性のあるメモリキャッシュはありますか?

PHP 7.を使用したいと思います。ただし、key-valueメモリキャッシングのオプションはないようです。

APCは廃止されました

XCacheはPHP 7はしばらくの間 では利用できません。

PHP 7?

または、PHP7のOpcacheを使用してキーと値のメモリキャッシュを実装する方法はありますか?

26
Frodik

パフォーマンスが心配な場合は、 Memcached、特にを使用することをお勧めします。

APC(u)がMemcacheよりもはるかに高速であることは正しいですが、これらのメトリックを心配するまでにを考慮に入れていません。複数のサーバーおよびAPC(u)はノード間で共有できません。

単一のMemcacheインスタンスまたはクラスターを使用して、必要な数のアプリケーションサーバーを提供できます。スケーラビリティは、「1台のサーバーからどれだけのパフォーマンスを引き出すことができるか」よりも、現代のアプリケーション開発において大きな懸念事項です。

そうは言っても、代替手段は APC で、これにはAPCで使用していたすべての機能があります。 PHP7では安定しているとマークされていますが、単一ノードの性質とfastcgiで正しく動作できないため、これはお勧めしません。

29
Matt Prelude

[〜#〜] apcu [〜#〜] isliterallyコードキャッシングなしのAPC(APCコードを取得し、バイトコードキャッシュを削除し、APCUとしてリリースしました)。これはドロップインの代替品です。 APCのユーザーキャッシュとまったく同じように、データをPHPランタイムと同じプロセスに保持します。そのため、値を使用することは通常の変数を取得することに似ているため、速度が向上します。

13
Alister Bulman

別のアプローチ(試したことはありませんが、非常に興味深いと思われます)は、キー値キャッシュとしてopcacheを利用することです。この graphiq の投稿には詳細が含まれていますが、残念ながら実際のコードは含まれていません(そして、Kerry Schwabからのコメントに注意してください)。

その要点は、opcacheが有効になっており、キャッシュする必要があるデータに十分なメモリが割り当てられていることと、次の行に沿って何かを確保することです(記事から抜粋、完全にチェックしてください)。キャッシュの有効期限(手動での削除を除く)も処理する必要がありますが、追加するのは難しくありません(たとえば、データを有効期限付きの包含オブジェクトにラップし、_cache_get_でチェックして、削除して無視します)有効期限が切れている場合はレコード)。

_function cache_set($key, $val) {
   $val = var_export($val, true);
   // HHVM fails at __set_state, so just use object cast for now
   $val = str_replace('stdClass::__set_state', '(object)', $val);
   // Write to temp file first to ensure atomicity
   $tmp = "/tmp/$key." . uniqid('', true) . '.tmp';
   file_put_contents($tmp, '<?php $val = ' . $val . ';', LOCK_EX);
   rename($tmp, "/tmp/$key");
}

function cache_get($key) {
    @include "/tmp/$key";
    return isset($val) ? $val : false;
}
_

Opcacheにより、これはメモリ内キャッシュとして機能しますが、シリアル化と逆シリアル化のオーバーヘッドを回避します。 cache_setは、書き込み時に_opcache_invalidate_も呼び出す必要があります(そして、例に存在しない_cache_delete_関数で)が、そうでない場合は共有する必要のないキャッシュのように聞こえますサーバー間。

編集:以下にキャッシュの有効期限を設定した実装例を示します(1秒まで正確ですが、さらに精度が必要な場合はmicrotime(true)を使用できます)。最小限のテストが実際に行われたため、HHVM固有の代替品であるYMMVを削除しました。改善のための提案を歓迎します。

_class Cache {                                                                   
    private $root;                                                              
    private $compile;                                                           
    private $ttl;                                                               

    public function __construct($options = []) {                                
        $this->options = array_merge(                                           
            array(                                                              
                'root' => sys_get_temp_dir(),                                   
                'ttl'  => false,                                                
            ),                                                                  
            $options                                                            
        );                                                                      
        $this->root = $this->options['root'];                                   
        $this->ttl = $this->options['ttl'];                                     
    }                                                                           

    public function set($key, $val, $ttl = null) {                              
        $ttl = $ttl === null ? $this->ttl : $ttl;                               
        $file = md5($key);                                                      
        $val = var_export(array(                                                
            'expiry' => $ttl ? time() + $ttl : false,                           
            'data' => $val,                                                     
        ), true);                                                               

        // Write to temp file first to ensure atomicity                         
        $tmp = $this->root . '/' . $file . '.' . uniqid('', true) . '.tmp';     
        file_put_contents($tmp, '<?php $val = ' . $val . ';', LOCK_EX);         

        $dest = $this->root . '/' . $file;                                      
        rename($tmp, $dest);                                                    
        opcache_invalidate($dest);                                              
    }                                                                           

    public function get($key) {                                                 
        @include $this->root . '/' . md5($key);                                 

        // Not found                                                            
        if (!isset($val)) return null;                                          

        // Found and not expired                                                
        if (!$val['expiry'] || $val['expiry'] > time()) return $val['data'];    

        // Expired, clean up                                                    
        $this->remove($key);                                                    
    }                                                                           

    public function remove($key) {                                              
        $dest = $this->root . '/' . md5($key);                                  
        if (@unlink($dest)) {                                                   
            // Invalidate cache if successfully written                         
            opcache_invalidate($dest);                                          
        }                                                                       
    }                                                                           
}      
_
4
El Yobo

PHP 7キャッシュ/アクセラレータリスト

Listo ofdead/outdatedPHPアクセラレータ:XCache、APC、memoize、ZendOpcache、chdb、hidef(これらはサポートPHP 7)

PHP Accelerators PECL website でアクセラレータのリストを見つけることができますが、私が言及しているように、それらのいくつかは廃止されているか、最新ではありません。

現在開発されている(PHP 7.3)をサポート):

すべてのインストール手順は、ダウンロードされたtgz/Zipファイルにあります。

APCu Windowsユーザー:APCuおよびAPCu_bcをダウンロードDLLシステム仕様に一致するファイルx64(64ビット)OR x86(32ビットウィンドウ)選択TSまたはUTSバージョンそしてもちろん正しいPHPバージョン。DLLをphp/extディレクトリに貼り付けます。あなたのphpディレクトリを見て。DLLファイル名(例:php7ts.dll)で見つけます。TSに注意してください。またはファイル名にUTS。

php -vは、現在のPHP CLIインストールバージョンを表示します。PHPバージョンがサーバーで使用しているものと同じであることを確認してください。変更は、PHPのWindows環境パスを更新します。

これを読むのが難しい場合: windowsにapcuをインストールする方法https://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows- xampp-for-php7 /

XAMPPの場合:

1)次のリンクで互換性のあるAPCuをダウンロードします http://pecl.php.net/package/apc

2)APCuはAPCと互換性のあるバックワードを必要とするため、次のリンクでダウンロードする必要があります。 http://pecl.php.net/package/apcu_bc

3)DDLファイルを拡張し、DDLファイルをphp_apc.dllおよびphp_apcu.dllという名前で移動し、そのファイルをPHP extディレクトリにコピーします。つまり、C:\ xampp\php\ext

4)php.iniファイルを開き、ファイルの下部に次のコードをコピーします

[apcu]
extension="C:\xampp\php\ext\php_apcu.dll"
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
extension="C:\xampp\php\ext\php_apc.dll"

ファイルを解凍するとき。 DLLファイルをPHP extenstion folder np:.../php/ext。にコピーし、php.iniを構成します(conf命令はINSTALLテキストに含まれていますファイル)。

Symfony 4

PS。万が一Symfonyフレームワークを使用している場合、config> packages> cache.yamlで使用可能なAPCuを忘れないでください

framework:
    cache:
        app: cache.adapter.apcu

組み込みサーバーを次で使用します:

php bin/console server:run
0
DevWL