最終的に、私は解決策を考え出しました。この考え方は、顧客データとアプリケーションデータを別々のデータベースに保存することです。 Appデータベースには、基本的なユーザー情報、ブログ投稿、フォーラムデータなどが保存されています... 2番目のデータベースはWHMCSデータベースで、請求書、製品、サポートチケットなどの必要なデータをすべて取り出します。
Any WHMCS(請求書の支払い、製品のアップグレードなど)に送信する必要がある更新は、APIを通じて行われます。この方法では、WHMCSは入力データで独自のロジックを実行できます。私が実装した
第二部では、当社のインフラストラクチャに作られたAPIのクエリを制限堅牢、カスタム・キャッシング・システムです。 (Openstack、cPanel、...)アイデアはかなりシンプルです。アプリのバックエンドは、__call
メソッドで関数名に含まれるCreate、Update、Read、Deleteを待ち受けます。例えば
:
$data = array(
'hostname' => $r['host'],
'username' => $r['username'],
);
Cpanel::listAddonDomain($data);
これは、すべてのアドオンは、ユーザーがcPanelの中で自分のホスティングアカウントに追加したドメイン一覧表示されます。要求の量を減らすにはユーザーが変更を行ったり、ログアウトしたりするまでキャッシュする必要があります。
最初に、ユーザーがcPanelアカウントを所有しているかどうかをチェックし、listAddondomains
を配列に分割します。最初のキーがlist, read or get
に等しい場合、データが属するユーザーを定義するタグでデータがキャッシュされます。 to:
public function __call($name, $arguments)
{
// Check if the user owns the account
if(Gate::denies('owns-data', $this->search($this->getProducts(), 'username', $arguments['username'])[0]['clientid']))
{
if ($request == 'api'){
return Api::respondNotAllowed('Not Allowed!');
}
abort(404);
}
$nameSplit = preg_split('/(?=\p{Lu})/u', $name);
// Check for arguments to flush the cache
if($nameSplit[0] == 'create' || $nameSplit[0] == 'delete' || $nameSplit[0] == 'add' || $nameSplit[0] == 'install')
{
Cache::tags(['cpanel', $arguments['username']])
->flush();
}
// If is already present in cache
if(Cache::tags(['cpanel', $arguments['username']])->get($name . '_' . Auth::user()->id))
{
return Cache::tags(['cpanel', $arguments['username']])
->get($name . '_' . Auth::user()->id);
}
// Do the query
try{
$data = $this->send($arguments, $this->getClass($nameSplit), $name);
$response = Api::respondSuccess($data);
}catch (Exception $e){
return Api::respondInternalError($e);
}
Cache::tags(['cpanel', $arguments['username']])
->put($name . '_' . Auth::user()->id, $response, $this->cacheTime);
return $response;
}
private function send($arguments, $className, $functionName)
{
$do = new $className($arguments);
return $do->$functionName();
}
上記のコードは最小限に抑えられています。ここに投稿するには時間がかかりすぎますが、あなたはその写真を手に入れます。
今、適切な時期にキャッシュをパージするのはどうですか?ユーザーが新しいアドオンドメインを作成し、既存のキャッシュをパージする必要があるとします。
$data = array(
'hostname' => $r['host'],
'username' => $r['username'],
'domain' => $r['domain']
);
Cpanel::createAddonDomain($data);
$nameSplit = preg_split('/(?=\p{Lu})/u', 'createAddonDomain');
if($nameSplit[0] == 'create' || $nameSplit[0] == 'delete' || $nameSplit[0] == 'add' || $nameSplit[0] == 'install')
{
Cache::tags(['cpanel', $arguments['username']])
->flush();
}
アドオンドメインの作成に成功した場合、そのcPanelアカウントに対してキャッシュがフラッシュされます。
私は1週間これを試してきましたが、それは魅力的です。キャッシュを有効にしてWHMCSデータベースから直接データを取得すると、ページの読み込み時間が大幅に減ることがわかりました。
次のストップは、すべてのラーバルビューをスタンドアロンの角度アプリに書き換えます。
先週、WHMCSデータベースに新しいクライアントインターフェイスを直接フックする方法を試しました。これは素晴らしい作品です!しかし、laravelアプリケーションはデータベースへの書き込みを行わず、読み込みのみを行います。これらのクエリはmem :: Cache :: remember()関数でmemcachedに格納されます。すべての書き込みは、WHMCSが競合を避けるためにすべての書き込みを処理できるように、WHMCS APIを介して行われます。 laravelアプリケーションには、基本的なユーザー情報とすべてのフォーラム/コミュニティのデータを格納するために対話する独自のデータベースがあります。この設定により、私は速く働くことができ、以前はWHMCSを使用していなかったすべての自由を持っています。 –