Drupal

Drupal開発者および管理者向けのQ&A



4
大規模サイト向けのメモリ節約キャッシュ消去戦略?
Drupal 7サイトの1つには、数千のフィールド、多数のコンテンツタイプ、25を超えるビュー、および数百(まもなく数千)のプロファイルタイプがあります。このため、エンティティフィールド情報をより適切にキャッシュするコアパッチ(http://drupal.org/node/1040790)と、(1つのHUGEを使用する代わりに、表示によってビューをより適切にキャッシュする-devバージョンのViewを使用しています。すべてのビューデータを含むビューキャッシュ行)。 これにより、サイト上のほとんどのページが160MB以上ではなく20-30MBのRAMを使用して読み込まれます(10MB以上のフィールドとビューのcache_ *テーブル行をプルアップする代わりに、パッチはcache_ *データをより効率的に維持するのに役立ちます)。 ただし、キャッシュの再構築には非常に長い時間がかかるという問題があります。通常、1分または2分以上。また、この間、Drupalはページをロードしません(読み取ろうとしているキャッシュがまだ構築されていないため、他のリクエストは待機する必要があります)。 トラフィックの少ないサイクルでは、これは大した問題ではありません。100人程度のユーザーは、ページが読み込まれるまで1分間待つだけです。しかし、トラフィックの多いサイクルでは、Apacheサーバーは40以上のCPU負荷で狂い始め、すべてのワーカースレッドが待機しているためにメモリがすぐに一杯になり、メモリを使い果たしてスワップを引き起こします。それは一種の死のスパイラルです。httpdを再起動すると問題は解決しますが、正常に戻るには5〜10分かかります。 私の目標は、キャッシュをクリアしてもサイトがひどくならないようにすることです。たとえば、admin_menuの個々のキャッシュクリア機能(「CSS and JS」、「Menu」、「Theme registry」など)を使用すると、「Page and else」オプションを押すまでスムーズに進みます。それは、ビューのキャッシュがリセットされるとき(キャッシュする必要があるビューの数を含む非常にCPUとデータベースに負荷がかかる操作)、およびフィールド情報キャッシュがリセットされるときです(このサイトでもCPUとデータベースに負荷がかかります)。 だから...私の質問/アイデア: ブラシや他のシェルスクリプトを使用して、「すべてのキャッシュを一度に爆発させ、クリーンな再構築を期待する」よりも賢い方法でキャッシュをクリアすることは可能ですか? キャッシュのクリア中にhttpリクエストをブロックして、Apacheが大量のキャッシュスタンプリクエストで詰まらないようにできますか? Drupal /通常のhttpdリクエスト以外でキャッシュをクリアできる場合、おそらくキャッシュクリア操作に高いPHP memory_limitを設定し、ユニバーサルmemory_limitを元に戻すことができます(個々のhttpdスレッドがキャッシュをクリアする必要がある場合は、現在256MBに設定されています) ...)。 基本的に:UIのボタンをクリックするdrush cc allか、使用する以外に、Drupalですべてのキャッシュをクリアするインテリジェントで優雅な方法はありますか? [ 明確化のための編集:私が抱える主な問題は、キャッシュの再構築です。(a)時間がかかり、(b)再構築が完了するまで他のすべてのリクエストをブロックします。トラフィックの多い時間帯で再構築がそれほど致命的ではないようにする方法を見つけたいと思います。]
30 7  drush  caching  performance 

3
Drupalでテスト駆動開発(TDD)を行う方法
DrupalでTDDに使用されるツール(PHPモジュール、Drupalモジュールなど)は何ですか? コミット/テスト/デプロイのワークフローはどのようなものですか?このワークフローの管理にPhing、PHPUnderControl、Hudsonを使用していますか? 単体テストはどのようにコードの信頼性を高めますか? 別個の高価なスタンドアロンの単体テストサーバーが必要ですか、それともラップトップから実行できますか? RobertがSimpleTestを使用したDrupalでのユニットテストに関する優れた技術記事をここに書いたことは知っています。ワークフローと構成の部分をカバーすることにもっと興味があります。現在、開発マシン、ステージングサーバー、および運用サーバーがあります。プロダクションサイトとステージサイトの両方が、300MB RAM / 300MHz CPUのDreamhost VPSで実行されます。
30 testing 

2
スクロールせずに見えるコンテンツのレンダリングをブロックするJavaScriptとCSSを排除する
Drupal 7サイトを構築しています。これらは、私が使用するモジュールの一部です:アダプティブテーマ(テーマ)、ビューとコンテンツペイン、パネル、ミニパネル、どこでもパネル、ページマネージャー、メニュー用のSuperfish、Addthis、Chosen(ドロップダウン)。 サイトのパフォーマンスを改善し、CSSファイルとJSファイルを処理するために、Advaggモジュールを使用しています。 GoogleのPagespeedテストを実行すると、「修正する必要がある」という次のエラーが表示されます。 スクロールせずに見える コンテンツのレンダリングブロックJavaScriptとCSSを排除するページには、6つのブロックスクリプトリソースと8つのブロックCSSリソースがあります。これにより、ページのレンダリングが遅れます。ページ上のスクロールせずに見えるコンテンツは、次のリソースの読み込みを待たずにレンダリングできませんでした。ブロッキングリソースを延期または非同期でロードするか、HTMLでこれらのリソースの重要な部分を直接インライン化してください。 これは、Googleが提供する情報です。 レンダーブロッキングJavaScriptを削除する CSS配信を最適化する AdvaggモジュールまたはDrupalコアの設定を変更して、この問題を解決する方法はありますか? この目標を達成する別の方法はありますか? 更新-mikeytown2の回答に従って変更を実装した後、GoogleのPagespeedテストで次のメッセージを受け取りました。 スクロールせずに見えるコンテンツのレンダリングブロッキングJavaScriptとCSSを排除する ページには、6つのブロッキングスクリプトリソースと4つのブロッキングCSSリソースがあります。これにより、ページのレンダリングが遅れます。 ページ上のスクロールせずに見えるコンテンツは、次のリソースの読み込みを待たずにレンダリングできませんでした。ブロッキングリソースを延期または非同期でロードするか、HTMLでこれらのリソースの重要な部分を直接インライン化してください。


5
hook_form_alterの「und」の言語キーのベストプラクティス
カスタムモジュールのフォームを変更しています。コードは次のようになります。 function my_module_form_alter(&$form, &$form_state, $form_id) { if ($form_id == "someID") { $form['field_charity_author']['und'][0]['value']['#value'] = arg(3); //$form['field_charity_author']['#type'] = 'hidden'; } } ただし、ハードコーディングundは悪いと思います。この場合、フォームフィールドを適切に変更する適切な方法は何ですか?
30 7  entities  hooks  i18n-l10n 

7
ユーザーが自分のコンテンツを非公開および公開できるようにするにはどうすればよいですか?
ユーザーが自分のコンテンツを非公開および公開できるようにします。デフォルトでは、ユーザーがコンテンツを非公開または公開できるようにするには、「ノードの管理」権限を付与する必要があります。しかし、それは広くする方法です。ノードを作成した場合にのみ、ユーザーがノードを非公開または公開できるようにします。これは、作成された場合にのみ、非公開ノードを表示できることも意味します。
30 users  nodes 

2
Search APIのプログラムによる使用
問題:Search APIを使用してプログラムで独自の検索を実行する必要があります。私が見つけたすべてのGoogleの結果は、開発者以外の人に、Viewsでモジュールを使用する方法を教えることを目的としています。 情報: Solrまたはその他の代わりにローカルデータベースサービスを使用します。 他の結果と一緒に表示されるデータをデータベースに保存しないでください。 コンテンツは「タイプ」タブにグループ化されます。 さまざまな理由でビューを使用しない。 Facets APIを有効にしますが、使用方法もわかりません。 理由:検索ページを/ site-searchに配置し、ページ引数の後に/ node / keywordを使用しないようにするためです。また、同じタイプの機能を提供する他のモジュールの範囲を超えてこれをカスタマイズするよう求められます。そして、私はこれを行う方法を学びたいが、それを達成する方法に関するチュートリアルやその他の洞察を見つけていない。 残り:検索ページを作成し、そのページで次のコマンドで検索を実行しています: $term = $_SESSION['my-search']['term']; $server = search_api_server_load('database'); $index = search_api_index_load('default_node_index'); $query = new SearchApiQuery($index); $query->keys($term); $query->fields(array('title','body:value')); $srv= new SearchApiDbService($server); $result = $srv->search($query); セッション変数は、検索フォームが送信されると設定され、ユーザーを/ site-searchにリダイレクトして検索を実行し、結果を表示します。 $ resultを出力すると、ノードIDとそのスコアの配列である結果セットを含むさまざまな情報を持つ配列であることがわかります。 それらを実行して、ノードを取得して結果を自分で表示することもできますが、検索結果をレンダリングする他の方法が必要だと思います。私はそれを見つけていませんが、それが問題です。 Search APIとFacet APIのさまざまなクラスを調べてきましたが、結果出力を構築するようなものは見つかりませんでした。 これに関する助けをいただければ幸いです。 結果の例: Array ( [result count] …
30 7  search 

6
Twigテンプレート内からLinkフィールドの有効なURLを取得する方法は?
field_my_link(マシン名)という名前のリンクフィールドがあります。 Twigテンプレート内で、これでリンクのURL値を取得できます。 {{ node.field_my_link.uri }} リンクのURL内に外部 URLがある場合、たとえば、http://example.comそれはうまく機能します。 しかし、リンクのURL 内に内部 URL が保存されている場合、たとえば"/node/11"、次のような値を取得します。 "internal:/node/11" 「internal:」プレフィックスを使用します。 有効な URL を取得するにはどうすればよいですか? たとえば、リンクのURLが " http://example.com"欲しいhttp://example.com場合 "(これは既に動作しています)、リンクのURLが" /node/11"相対URLが/node/11必要な場合" "、リンクのURLが" <front>"必要な場合はURL" /"など。 編集 これを使用して、PHPプリプロセス関数内で必要な値を取得できます。 $url = $variables['node']->get('field_my_link')->first()->getUrl(); Twigテンプレート内で同じ値にアクセスするにはどうすればよいですか? プリプロセス関数内でこれを行うことができることを知っています: $variables['my_url'] = $url; 次に、を使用してTwig内のURLにアクセスします{{ my_url }}が、リンクフィールドがあるたびに前処理関数を記述することは避けます。
30 theming  8  uri  navigation 

2
フォームのカスタム検証?
フォームにカスタム検証を追加する必要があると、記事フォームを追加できます。 私はhook_FORM_ID_validate()これを処理するようなものを期待していましたが、APIドキュメントに関連するものは見つかりませんでした。 フォームにカスタム検証を追加する方法は何ですか?
30 7  forms 

3
グローバル変数へのアクセスを回避する現在のユーザーオブジェクトを取得する関数はありますか?
私はいつもこれを使ってきましたglobal $user;。ただし、globalを使用せずに現在のユーザーオブジェクトを返す投稿モジュールで何かを見たことを覚えているようです$user。 そのような関数はDrupal 7コアに存在しますか、それともグローバル変数を使用して、現在のユーザーオブジェクトを取得するための事実上の推奨方法ですか?
29 users 

2
test_endpointを作成する方法は?
私はdrupalが初めてで、RESTおよびRESTWSモジュールを使用するためにサービスモジュールを使用しています。RESTWSを使用し、http://base_url/node/1.xmlでノードのコンテンツを取得できました 。次に、外部PHPアプリケーションからノードとユーザーをdrupalに追加する必要があります。私はグーグルで調べて、ここでhttp:// base_drupal_url / drupal7 / test_endpoint / usersを使用する必要があることを発見しました。Drupal 7からサービスを作成しようとしましたが、エンドポイントのタイトル、名前、エンドポイントパスに何を指定すればよいかわかりません。また、curlで同じエンドポイントパスを指定する必要があると思います。 レストサーバーがインストールされているかどうかを確認する方法、およびエンドポイントパスを作成する方法に関するヘルプは、非常に役立ちます。 サービスモジュールservices-7.x-3.0-rc3でDrupal 7を使用しています
29 7  services 

11
ページタイトルを設定するにはどうすればよいですか?
でページタイトルを変更できることは知っていますdrupal_set_title(t('Amy page title'))が、Drupal 8でページタイトルを試してみると、「そのような機能エラーはありません」というエラーメッセージが表示されます。 Drupal 8でページタイトルを変更するにはどうすればよいですか?
29 8 

1
エンティティにフィールドが存在するかどうかを確認する方法は?
エンティティノードで、「abc」フィールドが存在するかどうかを確認します。存在する場合、私はその値を取得します$value->get('abc'). ただし、このフィールドが存在しないコンテンツタイプはエラーになります。 Webサイトで予期しないエラーが発生しました。後でもう一度やり直してください。 エンティティにフィールドが存在するかどうかを確認する方法は?
28 8  entities 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.